内部HDFS文件压缩

时间:2014-01-24 15:57:38

标签: hadoop compression hdfs

我正在寻找HDFS中的默认压缩。我看到this但我不希望我的文件像扩展名一样使用gzip(实际上,它们应该可以访问,就像它们没有被压缩一样)实际上,我正在寻找的就是选项“< em>压缩内容以节省磁盘空间“在Windows上。此选项在内部压缩文件,但可以像通常的文件一样访问它们。任何想法都会有所帮助。

由于

3 个答案:

答案 0 :(得分:1)

这在标准HDFS实施中不存在,您必须自己管理它。您必须管理自己的压缩。但是,a proprietary implementation of Hadoop, MapR, does this,如果解决这个问题对你来说非常重要。

使用hadoop一段时间之后,这不再困扰我了。猪和MapReduce这样的压缩自动处理对我来说足够了。我知道这不是一个真正的答案,但我无法在你的问题中说出你是否只是生气,或者你有一个真正的问题。使用| gunzip添加到所有内容并不需要很长时间。我例如:

  • hadoop fs -cat /my/file.gz | gunzip
  • cat file.txt | gzip | hadoop fs -put - /my/file.txt.gz

答案 1 :(得分:1)

当你使用压缩文件时,你需要考虑将它们拆分 - 也就是说,当运行map reduce时,Hadoop可以拆分此文件(如果文件不可拆分,则只能由单个地图读取)

通常的做法是使用容器格式,例如序列文件,orc文件等,您可以在其中启用压缩。如果你使用简单的文本文件(csv等) - 有一个lzo project by twitter但我没有亲自使用它

答案 2 :(得分:1)

将压缩文件存储在HDFS中的标准方法是在将任何文件写入HDFS时通过默认压缩参数。这在mapper库,sqoop,flume,hive和hbase目录中可用。我在这里引用Hadoop的一些示例。在这里,您无需担心本地压缩文件以提高hadoop的效率。最好使用默认的hdfs文件格式选项来执行此工作。这种压缩将与hadoop映射器处理平滑集成。

通过Mapper库编写的工作

在映射器程序中创建编写器时。这是定义。您将编写自己的映射器和精简器,以将编解码器定义为Writer方法的参数将文件写入HDFS。

createWriter(Configuration conf, FSDataOutputStream out, Class keyClass, Class valClass, org.apache.hadoop.io.SequenceFile.CompressionType **compressionType**, CompressionCodec codec)

Sqoop导入

以下选项发送默认压缩参数,以将文件导入HDFS

sqoop import --connect jdbc://mysql://yourconnection/rawdata --table loglines --target-dir /tmp/data/logs/ --compress

使用sqoop,您还可以使用选项

指定特定的编解码器
sqoop --connect jdbc://mysql://yourconnection/rawdata --table loglines --target-dir /tmp/data/logs compression-codec org.apache.hadoop.io.compress.SnappyCodec

配置单元导入

在下面的示例中,您可以使用所需的选项将文件读入配置单元。这也是您可以在从本地文件读取时设置的属性。

SET hive.exec.compress.output=true;
SET parquet.compression=**SNAPPY**; --this is the default actually
CREATE TABLE raw (line STRING) STORED AS PARQUET ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
LOAD DATA LOCAL INPATH '/tmp/weblogs/20090603-access.log' INTO TABLE raw;

在您导入HDFS时,我没有提到数据压缩方法的所有示例。

HDFS CLI不提供(例如hdfs dfs -copyFromLocal)任何直接压缩方式。这是我对使用hadoop CLI的理解。