точная настройка spark ORC (размер файла, полосы) - PullRequest
1 голос
/ 22 октября 2019

Мой вопрос состоит из двух частей:

как я могу настроить (точную настройку) расширенные параметры 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?

другие советы по настройке

Пожалуйста, поделитесь со мной любыми другими советами по настройке.

1 Ответ

1 голос
/ 23 октября 2019

неполное обучение

Довольно некоторые части вопроса все еще открыты. Пожалуйста, улучшите ответ.

как настроить параметры настройки в свече

для расширенных настроек ORC:

https://spark.apache.org/docs/latest/sql-data-sources-load-save-functions.html

usersDF.write.format("orc")
  .option("orc.bloom.filter.columns", "favorite_color")
  .option("orc.dictionary.key.threshold", "1.0")
  .save("users_with_options.orc")

действительно, можно просто передать как .option на writer. Если вы хотите установить их при запуске искры с помощью --conf, убедитесь, что перед ними стоит префикс spark.orc.bloom.filter.columns, иначе они будут проигнорированы.

выбор параметров

размер файла и размер полосы

Выбор правильного размера файла важен. Чем больше, тем лучше. Фактически я мог наблюдать различия примерно в 1 ГБ для файлов 5 против 10 (у 5 было меньше требований к хранилищу).

https://community.cloudera.com/t5/Community-Articles/ORC-Creation-Best-Practices/ta-p/248963 Файлы ORC разделяются на уровне чередования . Размер полосы настраивается и должен зависеть от средней длины (размера) записей и от того, сколько уникальных значений этих отсортированных полей вы можете иметь. Если поле поиска уникально (или почти уникально), уменьшите размер полосы, если многократно - увеличьте. Хотя по умолчанию установлено значение 64 МБ, размер полосы должен быть от ¼ размера блока до 4 блоков (размер блока ORC по умолчанию равен 256 МБ

. Это означает, что более крупные полосы лучше, но занимают больше времени. создать во время процесса загрузки (компромисс).

orc goodies

Индексы отброшены в Hive 3.0 со стороны ульев, так как их функциональность реализована непосредственно в файле ORC (min-max, когда сортировка очень эффективна для диапазонов, bloomfilter для условий равного соединения. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Indexing

Дополнительно создание bloomfilter имеет смысл, но имеет компромисс между хранением и временем. Когда создаются bloomfilter, они могутorce-tools

Stripes:
  Stripe: offset: 3 data: 20833464 rows: 3475000 tail: 256 index: 3981255
    Stream: column 0 section ROW_INDEX start: 3 length 52
    Stream: column 0 section BLOOM_FILTER start: 55 length 17940
    Stream: column 1 section ROW_INDEX start: 17995 length 31010
    Stream: column 1 section BLOOM_FILTER start: 49005 length 610564
    Stream: column 2 section ROW_INDEX start: 659569 length 4085
    Stream: column 2 section BLOOM_FILTER start: 663654 length 378695
    Stream: column 3 section ROW_INDEX start: 1042349 length 11183
    Stream: column 3 section BLOOM_FILTER start: 1053532 length 1936342

Сортировка имеет решающее значение (https://community.cloudera.com/t5/Community-Articles/ORC-Creation-Best-Practices/ta-p/248963)) и должна выполняться как вторичная сортировка (как уже описано в вопросе).

параметры

, которые кажутся полезными и не требуют сверхтонкой тонкой настройки:

orc.dictionary.key.threshold=0.95 # force dict (almost) always (seems useful for almost all (non streaming) use cases)
orc.bloom.filter.columns    "*" # do not use star, but select desired columns to save space

Кроме того, orc.column.encoding.direct https://orc.apache.org/specification/ORCv1/ (поиск этих различных кодировок) может иметь смысл.

Искра предлагает https://spark.apache.org/docs/latest/cloud-integration.html:

spark.sql.orc.filterPushdown true
spark.sql.orc.splits.include.file.footer true
spark.sql.orc.cache.stripe.details.size 10000
spark.sql.hive.metastorePartitionPruning true

дополнительные хорошие чтения

что остается открытым

  • больше информации о выборе правильных параметров
  • почему размеры полос в искре намного меньше (16-20 МБ противрекомендуется 64MB)? Возможно, мне нужно попытаться повозиться с размером шага.
  • Почему они остаются такими маленькими (даже при попытке увеличить их). Помните: 2.2.x, HDP 2.6.4 и встроенная поддержка ORC уже должны быть исправлены.

  • , когда использовать bloomfilters, когда это перебор?

https://www.slideshare.net/BenjaminLeonhardi/hive-loading-data enter image description here enter image descriptionhere

...