我正在使用以下简单代码将文件上传到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()实用程序可以破坏文件吗? 有没有人遇到类似的问题?
答案 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中的时间戳。