1

我正在使用以下简单代码将文件上传到 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() 实用程序会损坏文件吗?有没有人遇到过类似的问题?

4

1 回答 1

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

如果它们不匹配,他们会检查两个文件的时间戳——HDFS 中的一个应该在本地文件系统之后修改。

于 2013-02-21T12:04:32.403 回答