1.上传数据时,客户端会负责将数据和校验和发送给datanode,最后一个datanode负责对数据进行校验,如果存在错误,则客户端会抛出异常:
2.下载数据时,客户端会从datanode下载校验和,然后对数据进行校验,如果存在错误,client会将数据报告给namenode,然后如果不存在错误,客户端会将数据报告给datanode,datanode会由此更新日志(datanode持久保存用于验证的校验和日志)
文本的校验和设置:
在用Java代码进行操作时,通过fs.setVerifyChecksum()方法进行设置。
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
public class test1 {
public static void main(String[] args) throws Exception {
Configuration conf=new Configuration();
URI uri=new URI("hdfs://192.168.137.128:8020");
FileSystem fs=FileSystem.get(uri, conf, "root");
//禁用校验和验证
fs.setVerifyChecksum(false);
}
}
如果用命令时,通过hadoop -get -ignoreCrc()方法设置
hadoop dfs -get -ignoreCrc /fileName path
//等价的
hadoop dfs -copyToLocal /filname path
对数据的检测:
hdfs dfs -checksum file
这可用于检测HDFS中两个文件的内容是否相同,hadoop distcp 也具有类似功能