Как поместить файл в HDFS со сжатием Snappy

Я работаю на клиента, где я должен поместить некоторые файлы в HDFS с сжатием Snappy. Моя проблема в том, что кодек snappy не определен в mapred-site.xml или hdfs-site.xml

Каким-то образом мне приходится помещать файлы, желательно с помощью команды hdfs put, и они должны быть сжаты. Нет возможности изменить файлы конфигурации, так как это производственная машина, и другие люди активно ее используют.

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

Будем признательны за любые предложения по использованию hdfs put с какими-либо параметрами для сжатия файлов.


person Canburak Tümer    schedule 03.08.2016    source источник
comment
Это невозможно, put просто перемещает данные.   -  person Binary Nerd    schedule 03.08.2016


Ответы (3)


Я предлагаю вам написать задание map-reduce для сжатия ваших данных в hdfs. Я не знаю, есть ли способ сделать автоматическое сжатие при операции размещения в хаупе, но предположим, что его не существует. Один из вариантов - поместить уже сжатый файл:

snzip file.tar
hdfs dfs -put file.tar.sz /user/hduser/test/

Другой способ — сжать его внутри задания mapreduce. Как вариант, вы можете использовать потоковую банку hadoop для сжатия ваших файлов в hdfs:

hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-0.20.2-cdh3u2.jar \
-Dmapred.output.compress=true \
-Dmapred.compress.map.output=true \
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec \
-Dmapred.reduce.tasks=0 \
-input <input-path> \
-output $OUTPUT \
person Alex    schedule 03.08.2016

Допустим, у вас есть несжатый файл журнала Spark в hdfs, но вы хотели включить spark.eventLog.compress true в spark-defaults.conf и продолжить сжатие старых журналов. Подход с уменьшением карты будет иметь наибольший смысл, но в качестве единственного варианта вы также можете использовать:

snzip -t hadoop-snappy local_file_will_end_in_dot_snappy

А затем загрузите, поставьте его напрямую.

Установка snzip может выглядеть примерно так:

sudo yum install snappy snappy-devel
curl -O https://dl.bintray.com/kubo/generic/snzip-1.0.4.tar.gz
tar -zxvf snzip-1.0.4.tar.gz
cd snzip-1.0.4
./configure
make
sudo make install

Ваша поездка туда и обратно для одного файла может быть:

hdfs dfs -copyToLocal /var/log/spark/apps/application_1512353561403_50748_1 .
snzip -t hadoop-snappy application_1512353561403_50748_1
hdfs dfs -copyFromLocal application_1512353561403_50748_1.snappy /var/log/spark/apps/application_1512353561403_50748_1.snappy

Или с помощью gohdfs:

hdfs cat /var/log/spark/apps/application_1512353561403_50748_1 \
| snzip -t hadoop-snappy > zzz
hdfs put zzz /var/log/spark/apps/application_1512353561403_50748_1.snappy
rm zzz
person dlamblin    schedule 05.12.2017

Мы решаем это с помощью некоторого сценария

  1. Если это rdd, преобразуйте его в кадр данных, например. RDD.toDF не требует параметров, если вы хотите указать имя столбца, вы можете сделать это с помощью rdd.toDF("c1","c2","c3")
  2. После преобразования в DF предположим, что вы хотите установить его в формат файла паркета с быстрым сжатием, вам нужно использовать sqlContext

    sqlContext.setConf("spark.parquet.commpression.codec","snappy")
    sqlContext.setConf("spark.parquet.commpression.codec","gzip") 
    

    для сжатия gzip

  3. После этого используйте следующую команду XXDF.write.parquet("your_path"), она будет сохранена с быстрым сжатием.

person devashish kapadia    schedule 10.12.2018