Содержание
- 2. План Что за паркет? Зачем всё это? Сильные и слабые стороны Что можно покрутить Как делать
- 3. Apache Parquet is a columnar storage format available to any project in the Hadoop ecosystem regardless
- 4. Как устроен https://github.com/apache/parquet-format
- 5. Колоночное хранение https://habr.com/company/wrike/blog/279797/ https://en.wikipedia.org/wiki/Column-oriented_DBMS Row-oriented Column-oriented
- 6. Вложенные структуры https://habr.com/post/207234/ https://ai.google/research/pubs/pub36632 https://stackoverflow.com/questions/43568132/
- 7. Колоночное хранение в Parquet
- 8. И что?
- 9. Pages можно кодировать! Bit packing Run-length encoding (RLE) Delta encoding Dictionary encoding ТОДО картинки
- 10. Кодированные Pages можно сжимать! GZIP LZO Snappy
- 11. Ненужные колонки можно не читать!
- 12. Нужные колонки можно читать параллельно!
- 13. Срочно в продакшен!..
- 14. Выбрасываем легаси!.. Postgres VS Parquet MongoDB VS Parquet Cassandra VS Parquet Excel VS Parquet
- 15. Write once! Append only Read only Только батчевая запись Нет транзакций. Никак. Совсем.
- 16. Подходит для аналитики Только чтение Большие range scan’ы Сложные фильтры Группирующие запросы
- 17. Большие Range Scan’ы Партиционируйте данные! /dataset/2018/07/30/ /dataset/2018/08/01/ /dataset/2018/08/02/
- 18. Сложные фильтры
- 19. Predicate Pushdown Только простые условия ( , ==, IN, null) Заранее заданные константы Можно комбинировать логически
- 20. Predicate Pushdown Не эффективен для чтения одной строки! select * from table where id = 1234
- 21. Pred. Pushdown + Encoding + Sorting
- 22. А теперь можно в продакшен?
- 23. Не всё так просто! Приходится: Сортировать и партиционировать Оптимизировать типы Контролировать размеры
- 24. Оптимизация типов Чем меньше тип – тем лучше XML, JSON -> Infer schema -> Struct Plain
- 25. parquet.block.size Больше => лучше сжатие Больше памяти при записи Требует х2-х3 памяти Должен умещаться в HDFS
- 26. Несколько блоков в файле? Формат позволяет Но нарушается граница HDFS блоков
- 27. Один файл – один блок! parquet.block.size == dfs.block.size Делайте repartition перед записью Держите 10-20% запас
- 28. Repartition - до df // 200 tasks .write .parquet(path) !hdfs dfs –ls –h $path | tail
- 29. Repartition – после df .repartition(320) .write .parquet(path) !hdfs dfs –ls –h $path | tail -1 118.3M
- 30. parquet.page.size Больше => лучше сжатие Меньше => эффективнее Predicate Pushdown Читается целиком в память 8 кб
- 31. parquet.dictionary.page.size Одна страница dictionary на колонку Держится в памяти целиком при чтении Увеличивайте при работе с
- 32. Теперь-то всё будет хорошо!..
- 33. Spark Streaming – Append stream .write .mode(Append) .parquet(path)
- 34. Много маленьких файликов Много HDFS блоков Неэффективное использование DataNode Высокая нагрузка на NameNode Много Spark Tasks
- 35. 1. Убирайте партиции stream .coalesce(1) .write .mode(Append) .parquet(landPath) https://evoeftimov.wordpress.com/2017/08/29/spark-streaming-parquet-and-too-many-small-output-files/
- 36. 2. Перекладывайте потоки spark .read.parquet(landPath) .repartition(partitions, key) .sortWithinPartitions(keys) .write.parquet(path) https://evoeftimov.wordpress.com/2017/08/29/spark-streaming-parquet-and-too-many-small-output-files/
- 37. Spark VS Impala VS Hive Кто быстрее? Кто совместим?!
- 38. Имплементации Parquet apache/parquet-mr (Java) apache/parquet-cpp (C++) Spark Catalyst (Scala) Dask/fastparquet (Python)
- 39. Decimal Не читается spark.sql.parquet.writeLegacyFormat https://issues.apache.org/jira/browse/IMPALA-2494 https://issues.apache.org/jira/browse/SPARK-10400 https://issues.apache.org/jira/browse/SPARK-6777 https://issues.apache.org/jira/browse/SPARK-20937 https://issues.apache.org/jira/browse/SPARK-20297 https://stackoverflow.com/questions/44279870/
- 40. Timestamp Не читается Теряет таймзону spark.sql.parquet.writeLegacyFormat spark.sql.parquet.int96AsTimestamp spark.sql.parquet.outputTimestampType spark.sql.parquet.int64AsTimestampMillis https://issues.apache.org/jira/browse/HIVE-12767 https://issues.apache.org/jira/browse/HIVE-13534 https://issues.apache.org/jira/browse/SPARK-12297 https://github.com/apache/spark/blob/master/sql/catalyst/ src/main/scala/org/apache/spark/sql/internal/SQLConf.scala
- 41. JSON/BSON Не нужен Но там всё равно что-то не работает https://issues.apache.org/jira/browse/SPARK-16216 https://gist.github.com/squito/f348508ca7903ec2e1a64f4233e7aa70
- 42. Spark Legacy Format Был дефолтным до Spark 1.5.9 Примерно 2015ый Примерно Parquet 1.6.x Не задокументирован SPARK-20937
- 43. Impala? Ищет колонки по номерам, а не по именам Не поддерживает LZO Не поддерживает binary Проблемы
- 44. Sqoop? Не используйте Parquet в Sqoop! Не умеет repartitioning OOM’ы
- 45. ColumnWriter.writePage() Проверки, что пора писать очередной Page: initial-page-run check next-page-size check Когда можно ошибиться: Строки большие
- 46. Если совсем нельзя обойти parquet.page.size.row.check.min parquet.page.size.row.check.max parquet.page.size.check.estimate https://github.com/apache/parquet-mr/blob/master/parquet-column/ src/main/java/org/apache/parquet/column/impl/ColumnWriterV1.java
- 47. Schema Merging _metadata, _common_metadata Можно просто отключить parquet.enable.summary-metadata=false spark.sql.parquet.mergeSchema=false https://stackoverflow.com/questions/36739940/
- 48. А теперь – дьявольщина! Parquet буферизируется в памяти Контрольные суммы не предусмотрены Память может биться Могут
- 49. А нормального ничего нет?
- 50. Напомните, зачем нам Parquet? Экономия по месту Быстрая фильтрация Чтение по частям HDFS-native Очень дорогая запись
- 51. Может, CSV? Человекочитаемый Нет оверхеда для текстов Поддерживает append Бейзлайн по ужасности Плоская структура
- 52. Может, JSON? Человекочитаемый Schema-free Еще более медленный и жирный
- 53. А XML?
- 54. Avro? Поддерживает append HDFS-native Продвинутая эволюция схем Менее производителен, чем Parquet
- 55. Parquet VS ORC – всё сложно По объему и скорости однозначного лидера нет Hive отстаёт в
- 56. MPP? Для структурированных данных специализированные MPP-системы на порядок быстрее Spark + HDFS + Parquet.
- 57. Ясно, понятно…
- 58. Parquet Прекрасный формат для исторических данных Для Spark, особенно на CDH – альтернатив нет Имеет массу
- 59. Главные тонкости Пиши один раз, читай много Структурируй данные Партиционируй и перекладывай потоки Оптимизируй размеры Не
- 61. Скачать презентацию