Сжатие файлов HDFS с непрерывной загрузкой - PullRequest
1 голос
/ 30 мая 2020

У нас есть несколько таблиц в HDFS, которые получают прибл. 40к новых файлов в день. Нам нужно сжимать эти таблицы каждые две недели, а для этого нам нужно остановить прием.

У нас есть искровое поглощение, получающее данные от kafka и добавляющее их в HDFS (внешние таблицы Hive) каждые 30 минут. Данные запрашиваются сразу после их приема, наше соглашение об уровне обслуживания меньше часа, поэтому мы не можем увеличить интервал пакетной обработки.

Таблицы разделены на два поля, мы получаем более старые данные постоянно, поэтому большая часть разделы обновляются во время каждой партии инъекций

, например: /user/head/warehouse/main_table/state=CA/store=macys/part-00000-017258f8-aaa-bbb-ccc-wefdsds.c000. snappy.parquet

Мы ищем способы уменьшить количество файлов, создаваемых, но даже при этом нам придется выполнять сжатие каждые 3/4 недели, если не две.

Как и большинство разделов постоянно обновляются, нам нужно остановить инъекцию (~ 1 день) до начала уплотнения, которое влияет на наших пользователей.

Я ищу способы автоматического сжатия без остановки приема?

Ответы [ 2 ]

0 голосов
/ 31 мая 2020

Спасибо, Фача, за твои предложения, очень признателен.

Я новичок в концепции HDFS, поэтому, пожалуйста, не обращайте внимания на c вопросы,

Каково будет влияние на бег запросы, которые обращаются к этим конкретным c файлам при замене некомпактных файлов на сжатые файлы (изменить таблицу ... раздел ... указать местоположение). Я считаю, что запросы могут потерпеть неудачу. Кто мы можем минимизировать воздействие?

Скопируйте каталог hdfs раздела в другое место

Поскольку у нас есть два раздела в одной таблице, состояние и хранилище, буду ли я для перебора каждого подраздела?

/ tableName / state = CA / store = macys / file1.parquet /tableName/state=CA/store=macys/file2.parquet

/ tableName / state = CA / store = JCP / file2.parquet /tableName/state=CA/store=JCP/file2.parquet

/ tableName / state = NY / store = macys / file1. паркет /tableName/state=NY/store=macys/file2.parquet

/ tableName / state = NY / store = JCP / file2.parquet /tableName/state=NY/store=JCP/file2.parquet

For each state
    for each store
        get list of files in this dir to replace later
        compact 
            /tableName/state=$STATE/store=$STORE (SPARK JOb?)
        replace uncompacted files with compacted files
        alter table ... partition ... set location

Я бы предпочел ваше другое предложение на шаге 5 «так же замените« маленькие »файлы в исходном месте раздела на их сжатую версию»

Как бы я go вперед с его реализацией лучше всего будет сделать это с помощью скриптов, scala или другого языка программирования. У меня есть базовые c знания скриптов, хороший опыт в java и новичок в scala, но я могу научиться за пару дней.

С уважением, P

0 голосов
/ 30 мая 2020

Выбранная схема разбиения несколько неудачна. Тем не менее, вы можете сделать несколько вещей. Я полагаюсь на тот факт, что вы можете атомарно изменить расположение раздела в Hive (изменить таблицу ... раздел ... установить местоположение):

  1. Скопируйте каталог hdfs раздела в другое место
  2. Сжать скопированные данные
  3. Копировать новые файлы, которые были загружены с шага 1
  4. сделайте «изменить таблицу ... раздел ... установить местоположение», чтобы указать Hive на новое сжатое местоположение .
  5. Начать загрузку в это новое место (в случае, если этот шаг окажется сложным, вы можете просто заменить «маленькие» файлы в исходном местоположении раздела на их сжатую версию и выполнить команду «изменить таблицу ... раздел ... установить местоположение "снова, чтобы указать Hive обратно в исходное расположение раздела.

Вам нужно будет поддерживать этот процесс в непрерывном режиме итерациях по разделам.

...