Улучшения производительности при сохранении Spark ORC

Я использую Spark 1.6.1 и все еще новичок в мире Spark. Я играю с сохранением файла в формате ORC.

Я пытаюсь разобрать относительно большой текстовый файл (8 ГБ) в ORC. Файл обычно довольно широкий, т.е. 200+ столбцов.

Типы столбцов являются базовыми: Int, String, Date. Я разбираю все строки, затем выполняю persist() и сохраняю в файл.

Вот основной код:

val schema = StructType(
  myTableColumns.map(
    c => StructField(
//Field descriptions ~200 fields
)))

val rowRDD = rddProcessedLines.map(line => {
  Row.fromSeq(line)
})

val fileSchemaRDD = hiveContext.createDataFrame(rowRDD, schema)

fileSchemaRDD.registerTempTable("output_table_name")
fileSchemaRDD.write.orc("output_folder")

Проблема в том, что производительность довольно низкая. Это хуже, чем любой импорт в реляционную базу данных из того же текстового файла.

Я пытался переключаться между компрессорами Snappy и LZF, но особого выигрыша здесь не было. Я также играл с объемом памяти для узлов и количеством ядер, не лучше. Затем я начал изменять размер буфера и т. д. для сжатия. Я вижу, что производительность резко падает для большего количества столбцов. Может кто подскажет где смотреть? Может ли кто-нибудь указать на полезные темы об оптимизации сохранения файлов ORC?


person user677571    schedule 23.06.2016    source источник


Ответы (1)


Эта низкая производительность связана с размером файла, который вы пытаетесь загрузить. Чтобы использовать распределенные вычисления spark, убедитесь, что у вас есть несколько небольших файлов, чтобы сделать преобразования более параллельными. Попробуйте разделить файл размером 8 ГБ на несколько файлов размером 64 МБ каждый. Кроме того, из вашего кода вам не нужно регистрировать фрейм данных во временной таблице перед сохранением, поскольку вы не используете его для каких-либо других преобразований позже.

person Nakul    schedule 06.01.2017
comment
Где производительность с искрой тогда? Мне нужно выполнить 1. Разархивировать. 2. Разделить как-нибудь на 64 чанка (имея в виду, что внутренняя структура должна сохраниться) 3. Скопировать все в HDFS. Я сомневаюсь, что любая база данных 'COPY' или импорт будет медленнее. - person user677571; 07.01.2017
comment
Это не волшебное приложение, искра. Если вы действительно хотите использовать полную мощность кластера, вам обязательно нужно позаботиться о разделении входных файлов. В противном случае вы закончите перегрузку одного исполнителя, не используя остальные. - person Nakul; 10.01.2017