Мой вопрос состоит из двух частей:
как я могу настроить (точную настройку) расширенные параметры ORC с помощью spark?
Различные сообщения показывают, что могут быть проблемы Spark Small ORC Stripes, Как установить размер полосы ORC в Spark . В настоящее время я использую spark 2.2 на платформе HDP 2.6.4, так что согласно https://community.cloudera.com/t5/Support-Questions/Spark-ORC-Stripe-Size/td-p/189844 это уже должно быть решено. Тем не менее, мне неясно, как установить эти параметры при выполнении:
df.write.orc("/path/to/file")
Возможно, это просто:
df.write.options(Map("key"-> "value")).orc("/path/to/file")
Однако я также не совсем уверен, какие клавиши японадобится здесь.
ПРИМЕЧАНИЕ: используется версия ORC 1.4 native
.
.set("spark.sql.orc.impl", "native")
.set("spark.sql.hive.convertMetastoreOrc", "true")
выбор правильных параметров:
Мой набор данных перераспределяется и сортируется с использованием df.repartition(number, c1,c2,...).sortWithin("c1, c2", "c3", ...)
вторичной сортировки. Порядок сортировки столбцов выбирается количеством дорогих (длинных строк) столбцов. Сначала идут самые высокие.
размер файла
Я хочу записать сжатые файлы orc в HDFS. Проблема небольшого размера файла - это то, что я знаю и, очевидно, хочу предотвратить, но как быть с другим направлением? Например, один из моих наборов данных будет генерировать 800 МБ сжатых orc-файлов (отдельные файлы внутри раздела), если перераспределится соответствующим образом. Эти 800 МБ уже считаются слишком большими? Должен ли я попытаться определить размер примерно 300 МБ? Или 400 МБ? Пожалуйста, имейте в виду, они уже разархивированы.
размер полосы
В настоящее время я наблюдаю:
java-jar orc-tools meta foo.orc
, что для этого файла ранее (но также и для других)Похоже, что spark создает полосы размером примерно 16 МБ, т.е. в данном случае 49.
Вот пример вывода для первой полосы:
Stripe 1:
Column 0: count: 3845120 hasNull: false
Column 1: count: 3845120 hasNull: false min: a max: b sum: 246087680
Column 2: count: 3845120 hasNull: false min: aa max: bb sum: 30288860
Column 3: count: 3845120 hasNull: false min: aaa max: bbb sum: 89174415
Column 4: count: 3845120 hasNull: false
Column 5: count: 3845120 hasNull: false min: 2019-09-24 00:00:00.0 max: 2019-09-24 23:45:00.0 min UTC: 2019-09-24 02:00:00.0 max UTC: 2019-09-25 01:45:00.0
Column 6: count: 3845120 hasNull: false min: 2019-09-24 00:15:00.0 max: 2019-09-25 00:00:00.0 min UTC: 2019-09-24 02:15:00.0 max UTC: 2019-09-25 02:00:00.0
Column 7: count: 3845120 hasNull: false min: 1 max: 36680 sum: 36262602
И в подробном выводепосле перечисления всех полос (снова для первой полосы):
Stripes:
Stripe: offset: 3 data: 17106250 rows: 3845120 tail: 185 index: 51578
Stream: column 0 section ROW_INDEX start: 3 length 55
Stream: column 1 section ROW_INDEX start: 58 length 21324
Stream: column 2 section ROW_INDEX start: 21382 length 3944
Stream: column 3 section ROW_INDEX start: 25326 length 12157
Stream: column 4 section ROW_INDEX start: 37483 length 55
Stream: column 5 section ROW_INDEX start: 37538 length 4581
Stream: column 6 section ROW_INDEX start: 42119 length 4581
Stream: column 7 section ROW_INDEX start: 46700 length 4881
Stream: column 1 section DATA start: 51581 length 57693
Stream: column 1 section LENGTH start: 109274 length 16
Stream: column 1 section DICTIONARY_DATA start: 109290 length 623365
Stream: column 2 section DATA start: 732655 length 447898
Stream: column 2 section LENGTH start: 1180553 length 148
Stream: column 2 section DICTIONARY_DATA start: 1180701 length 968
Stream: column 3 section DATA start: 1181669 length 2449521
Stream: column 3 section LENGTH start: 3631190 length 6138
Stream: column 3 section DICTIONARY_DATA start: 3637328 length 303255
Stream: column 5 section DATA start: 3940583 length 5329298
Stream: column 5 section SECONDARY start: 9269881 length 172
Stream: column 6 section DATA start: 9270053 length 5334123
Stream: column 6 section SECONDARY start: 14604176 length 172
Stream: column 7 section DATA start: 14604348 length 2553483
Encoding column 0: DIRECT
Encoding column 1: DICTIONARY_V2[16914]
Encoding column 2: DICTIONARY_V2[214]
Encoding column 3: DICTIONARY_V2[72863]
Encoding column 4: DIRECT
Encoding column 5: DIRECT_V2
Encoding column 6: DIRECT_V2
Encoding column 7: DIRECT_V2
Что здесь рекомендуется? По умолчанию в кустах упоминается 256 МБ, но это, кажется, совершенно другой диапазон значений, чем тот, который вычисляет искра. Каково здесь обоснование?
Так почему же:
spark.conf.get("orc.dictionary.key.threshold")
java.util.NoSuchElementException: orc.dictionary.key.threshold
терпит неудачу, даже если ясно видно, что каким-то образом словари установлены? Глядя на кодовую базу spark, я не могу определить, где это свойство установлено где-либо https://github.com/apache/spark/search?q=orc.dictionary.key.threshold&unscoped_q=orc.dictionary.key.threshold
orc goodies
В последних версиях orc представлены фильтры и индексы Блума. Могут ли они также использоваться от spark?
другие советы по настройке
Пожалуйста, поделитесь со мной любыми другими советами по настройке.