如何防止hadoop损坏的.gz文件

时间:2013-02-21 10:53:18

标签: hadoop mapreduce

我正在使用以下简单代码将文件上传到hdfs。

FileSystem hdfs = FileSystem.get(config);
hdfs.copyFromLocalFile(src, dst);

文件由webserver java组件生成,并以.gz格式的logback旋转和关闭。我注意到有时.gz文件已损坏。

 > gunzip logfile.log_2013_02_20_07.close.gz 
 gzip: logfile.log_2013_02_20_07.close.gz: unexpected end of file 

但是以下命令确实显示了文件的内容

> hadoop fs -text /input/2013/02/20/logfile.log_2013_02_20_07.close.gz

拥有此类文件的影响非常大 - 因为整天的聚合失败,并且在这种情况下,还有几个从属节点被标记为黑名单。

在这种情况下我该怎么办? hadoop copyFromLocalFile()实用程序可以破坏文件吗? 有没有人遇到类似的问题?

1 个答案:

答案 0 :(得分:1)

它不应该这样做 - 这个错误通常与最初写入本地磁盘时尚未关闭的GZip文件相关联,或者在完成写入之前被复制到HDFS。

您应该可以通过在原始文件和HDFS上运行md5sum来检查 - 如果它们匹配则原始文件已损坏:

hadoop fs -cat /input/2013/02/20/logfile.log_2013_02_20_07.close.gz | md5sum
md5sum /path/to/local/logfile.log_2013_02_20_07.close.gz

如果它们不匹配,则检查两个文件的时间戳 - 应在本地文件系统1之后修改HDFS中的时间戳。