Сяотянь, вы утверждаете, что "чтение в случайном порядке и запись в случайном порядке составляет около 1 ТБ. Мне не нужны эти промежуточные значения или СДР".Это утверждение подтверждает, что вы не знакомы с Apache Spark или, возможно, с алгоритмом, который вы используете.Пожалуйста, позвольте мне объяснить.
При добавлении трех чисел, вы должны сделать выбор первых двух чисел, чтобы добавить.Например (a + b) + c или a + (b + c).После того, как этот выбор сделан, в скобках содержится временное промежуточное значение.Невозможно продолжить вычисление для всех трех чисел без промежуточного числа.
СДР - это структура данных с эффективным использованием пространства.Каждый «новый» RDD представляет собой набор операций для всего набора данных.Некоторые СДР представляют собой одну операцию, например «добавить пять», в то время как другие представляют цепочку операций, например «добавить пять, затем умножить на шесть и вычесть на семь».Вы не можете отказаться от СДР, не отказавшись от какой-либо части вашего математического алгоритма.
По своей сути Apache Spark является алгоритмом рассеяния.Он распределяет набор данных по ряду рабочих узлов, где этот набор данных является частью единого RDD, который распространяется вместе с необходимыми вычислениями.На данный момент вычисления еще не выполнены.Поскольку данные запрашиваются из вычисленной формы СДР, вычисления выполняются по требованию.
Иногда невозможно завершить вычисления на одном работнике, не зная некоторых промежуточных значений из другихработников.Этот вид перекрестной связи между работниками всегда происходит между головным узлом, который распределяет данные среди разных работников и собирает и объединяет данные от разных работников;но, в зависимости от того, как устроен алгоритм, он также может происходить в середине вычислений (особенно в алгоритмах, которые groupBy или объединяют срезы данных).
У вас есть алгоритм, который требует перестановки, таким образом, что одинузел не может собрать результаты от всех других узлов, потому что у одного узла недостаточно оперативной памяти для хранения промежуточных значений, собранных из других узлов.
Короче говоря, у вас есть алгоритм, который не может масштабироваться в соответствии с размером вашего набора данных с имеющимся у вас оборудованием.
На этом этапе вам необходимо вернуться кАлгоритм Apache Spark и посмотрите, можно ли
- Настроить разделы в RDD, чтобы уменьшить перекрестные помехи (слишком малые разделы могут потребовать большего количества перекрестных разговоров при перетасовке в качестве полностью подключенной взаимной передачиувеличивается в O (N ^ 2), слишком большие разделы могут исчерпать оперативную память в вычислительном узле).
- Перестройте алгоритм так, чтобы полная перестановка не требовалась (иногда вы можете сократить поэтапно, так чтоВы имеете дело с большим количеством фаз сокращения, причем каждая фаза объединяет меньше данных.
- Перестройте алгоритм так, чтобы не требовалось перемешивание (это возможно, но маловероятно, что алгоритм просто неправильно написан, и с учетом егоиначе можно избежать запроса удаленных данных с точки зрения узла).
- Если проблема в cОтбирая результаты, перепишите алгоритм, чтобы он возвращал результаты не в консоли головного узла, а в распределенной файловой системе, которая может вместить данные (например, HDFS).
Без гаек и болтоввашей программы Apache Spark и доступа к вашему набору данных, а также к вашему кластеру Spark и его журналам, трудно понять, какой из этих общих подходов принесет вам наибольшую пользу;поэтому я перечислил их все.
Удачи!