閱讀968 返回首頁    go 阿裏雲 go 技術社區[雲棲]


E-MapReduce HDFS文件快速CRC校驗工具介紹

背景

在大數據應用場景下經常有數據文件的遷移工作,如果保障遷移之後數據的完整性是一個很常見的問題。對本地文件係統的數據而言,我們一般用md5工具(在Linux下可用md5sum命令)。

而對雲存儲上的文件來說,md5不一定滿足需求。比如阿裏雲OSS文件並沒有提供md5校驗值,而是提供了CRC64校驗值。本文就給大家介紹一下在大數據場景下,如何用工具快速對比文件。

OSSUtil

首先我們使用OSS官方提供ossutil工具,可以方便的得到雲端OSS文件的CRC64:

[hadoop@emr-header-1 ~]$ ossutil stat oss://bucket/file.txt
ACL                         : default
Accept-Ranges               : bytes
Content-Length              : 500000000
Content-Type                : application/octet-stream
Etag                        : 1C1CE59DC84E49EC89EE6570A3608597-96
Last-Modified               : 2017-08-01 11:16:27 +0800 CST
Owner                       : onwerid
X-Oss-Hash-Crc64ecma        : 5376366475988344152
X-Oss-Object-Type           : Multipart
X-Oss-Storage-Class         : Standard
0.097086(s) elapsed

其中的 X-Oss-Hash-Crc64ecma : 5376366475988344152 就是校驗值。

ossutil hash命令還能得到本地文件的CRC64值:

[hadoop@emr-header-1 ~]$ ossutil hash file.txt
CRC64-ECMA                  : 5376366475988344152

將兩個CRC值進行比較,就可以知道從本地上傳到OSS上的文件是否成功。

但是,上麵的方法隻對單個文件有用,如果你的文件是放在分布式文件係統,比如E-MapReduce上的HDFS,有需要備份數據到OSS上,用OSSUtil工具可能就太慢了。下麵將引入一個新的工具。

E-MapReduce Distcp和DistCheck

DistCp

首先用EMR distcp工具將數據從HDFS導入到OSS上:

hadoop distcp /user/hadoop/terasort-10g oss://emr-bucket/upload

這裏的原始目錄有10G,文件列表是:
/user/hadoop/terasort-10g/input/part-m-00000
/user/hadoop/terasort-10g/input/part-m-00001
...
/user/hadoop/terasort-10g/input/part-m-00020

將文件列表保持成一個文件 list.txt ,並上傳到 HDFS 上 /user/hadoop/list.txt

hadoop fs -put list.txt /user/hadoop/list.txt

下載工具

然後,需要你下載本文附件中的壓縮包,解壓縮之後可以得到兩個文件 streaming.jar 和 crctool。其中crctool是一個可以在本地運行的可執行文件(注意:隻能在Linux 64位環境下執行),功能和ossutil的hash功能類似,但它隻支持從標準輸入中讀取數據,比如:

cat file.txt | ./crctool 

運行工具

接下去就可以運行DistCheck工具了,具體命令如下:

hadoop jar streaming.jar -Dmapred.reduce.tasks=1 -mapper crctool -file crctool -input /user/hadoop/list.txt -output /user/hadoop/distcheck-out

查看結果

查看工具輸出的結果:

[hadoop@emr-header-1 ~]$ hadoop  fs -cat /user/hadoop/distcheck-out/part-00000
hdfs://emr-header-1:9000/user/hadoop/terasort-10g/input/part-m-00000: 5376366475988344152
hdfs://emr-header-1:9000/user/hadoop/terasort-10g/input/part-m-00001: 11439160807767203705
hdfs://emr-header-1:9000/user/hadoop/terasort-10g/input/part-m-00002: 2122411653175000878
hdfs://emr-header-1:9000/user/hadoop/terasort-10g/input/part-m-00003: 7064261157479130820
...

這是HDFS上文件的CRC值,可以和OSS上的文件做比較:

[hadoop@emr-header-1 ~]$ hadoop fs -ls oss://emr-bucket/upload/terasort-10g/input  |grep part | awk '{print $6}' | xargs -L1 ./ossutil stat  | grep Crc64
X-Oss-Hash-Crc64ecma        : 5376366475988344152
X-Oss-Hash-Crc64ecma        : 11439160807767203705
X-Oss-Hash-Crc64ecma        : 2122411653175000878
X-Oss-Hash-Crc64ecma        : 7064261157479130820
...

最後更新:2017-08-13 22:41:32

  上一篇:go  醫療大健康行業案例(老人健康實時監測和預警) - 阿裏雲RDS PostgreSQL最佳實踐
  下一篇:go  【java筆記】關於引用數據類型的內存使用原理