带有压缩/加密文件的Hadoop Mapreduce(大尺寸文件)

时间:2015-10-15 09:25:30

标签: hadoop mapreduce compression bigdata recordreader

我有hdfs集群,它以最终用户选择的压缩/加密形式存储大型csv文件。 对于压缩,加密,我创建了一个包装器输入流,它以压缩/加密的形式将数据提供给HDFS。压缩格式使用GZ,加密格式AES256。 在HDFS上将4.4GB的csv文件压缩为40MB。

现在我有了mapreduce job(java),它将多个压缩文件一起处理。 MR作业使用FileInputFormat。 当mapper计算拆分时,4.4GB压缩文件(40MB)只分配1个mapper,split split为0,拆分长度等于40MB。

如何处理更大尺寸的压缩文件?我发现的一个选项是实现自定义RecordReader并使用包装器输入流来读取未压缩的数据并对其进行处理。 由于我没有文件的实际长度,所以我不知道从输入流中读取了多少数据。

如果我从InputStream读到最后,那么如何将2个映射器分配给同一个文件,如下所述。 如果压缩文件大小大于64MB,则将为同一文件分配2个映射器。 如何处理这种情况。?

Hadoop版本 - 2.7.1

1 个答案:

答案 0 :(得分:0)

应该记住压缩格式,如果文件将由map reduce处理。因为压缩格式是可拆分的,所以map reduce工作正常。

但是,如果不能拆分(在你的情况下,gzip不可拆分,map reduce会知道它),那么整个文件将在一个映射器中处理。这将达到目的,但会出现数据局部性问题,因为一个映射器只执行作业,并从其他块中获取数据。

来自Hadoop权威指南: "对于大型文件,您不应使用不支持在整个文件上拆分的压缩格式,因为您丢失了局部性并使MapReduce应用程序效率非常低并且#34;。

有关详细信息,请参阅Hadoop I / O章节中的压缩部分。