Я обрабатываю данные с помощью искры, и он работает с деньгами данных (40G), но не работает с OOM на неделю:
import pyspark
import datetime
import operator
sc = pyspark.SparkContext()
sqc = pyspark.sql.SQLContext(sc)
sc.union([sqc.parquetFile(hour.strftime('.....'))
.map(lambda row:(row.id, row.foo))
for hour in myrange(beg,end,datetime.timedelta(0,3600))]) \
.reduceByKey(operator.add).saveAsTextFile("myoutput")
Количество разных идентификаторов меньше 10k.
Каждый идентификатор является маленьким int
.
Работа завершается неудачно, потому что слишком много исполнителей не работают с OOM.
Когда задание выполняется успешно (на небольших входах), "myoutput"
составляет около 100 тыс.
- Что я делаю неправильно?
- Я попытался заменить
saveAsTextFile
наcollect
(потому что на самом деле я хочу сделать некоторые нарезки и нарезки в python перед сохранением), не было никакой разницы в поведении и в том же отказе. это следует ожидать? - Раньше я имел
reduce(lambda x,y: x.union(y), [sqc.parquetFile(...)...])
вместоsc.union
- что лучше? В чем разница?
В кластере есть 25 узлы с оперативной памятью 825 ГБ и 224.
Вызов spark-submit --master yarn --num-executors 50 --executor-memory 5G
.
Один RDD имеет ~ 140 столбцов и охватывает один час данных, поэтому неделя представляет собой объединение 168 (= 7 * 24) RDD.