HDFS文件校验和

pra*_*eep 7 java hadoop checksum mapreduce hdfs

我试图使用Hadoop API - DFSCleint.getFileChecksum()复制到HDFS后检查文件的一致性.

我得到以上代码的以下输出:

Null
HDFS : null
Local : null
Run Code Online (Sandbox Code Playgroud)

谁能指出错误或错误?这是代码:

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileChecksum;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocalFileSystem;
import org.apache.hadoop.fs.Path;


public class fileCheckSum {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        Configuration conf = new Configuration();

         FileSystem hadoopFS = FileSystem.get(conf);
    //  Path hdfsPath = new Path("/derby.log");

        LocalFileSystem localFS = LocalFileSystem.getLocal(conf);
    //      Path localPath = new Path("file:///home/ubuntu/derby.log");


    //  System.out.println("HDFS PATH : "+hdfsPath.getName());
    //      System.out.println("Local PATH : "+localPath.getName());

        FileChecksum hdfsChecksum = hadoopFS.getFileChecksum(new Path("/derby.log"));
        FileChecksum localChecksum = localFS.getFileChecksum(new Path("file:///home/ubuntu/derby.log"));


        if(null!=hdfsChecksum || null!=localChecksum){
            System.out.println("HDFS Checksum : "+hdfsChecksum.toString()+"\t"+hdfsChecksum.getLength());
            System.out.println("Local Checksum : "+localChecksum.toString()+"\t"+localChecksum.getLength());

            if(hdfsChecksum.toString().equals(localChecksum.toString())){
                System.out.println("Equal");
            }else{
                System.out.println("UnEqual");

            }
        }else{
            System.out.println("Null");
            System.out.println("HDFS : "+hdfsChecksum);
            System.out.println("Local : "+localChecksum);

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

omi*_*mid 10

既然你不设置的远程地址conf,并用基本相同的配置,无论是hadoopFSlocalFS被指向的一个实例LocalFileSystem.

getFileChecksum未实现,LocalFileSystem并返回null.它应该正常工作DistributedFileSystem,如果你conf指向一个分布式集群,它FileSystem.get(conf)应该返回一个实例,DistributedFileSystem它返回MD5的MD5,CRC5校验和的大小块bytes.per.checksum.此值取决于块大小和群集范围的配置bytes.per.checksum.这就是为什么这两个参数也在分布式校验和的返回值中编码为算法的名称:MD5-of-xxxMD5-of-yyyCRC32其中xxx是每个块的CRC校验和数,yyy是bytes.per.checksum参数.

getFileChecksum没有设计能够跨文件系统相媲美.虽然可以在本地模拟分布式校验和,或者手工制作map-reduce作业以计算本地哈希的等价物,但我建议依赖Hadoop自己的完整性检查,当文件被写入Hadoop或从Hadoop读取时