簡體   English   中英

在apache hadoop中讀取或復制到hdfs時的校驗和異常

[英]Checksum Exception when reading from or copying to hdfs in apache hadoop

我正在嘗試使用Apache hadoop實現並行化算法,但是當我嘗試將文件從本地文件系統傳輸到hdfs時,我遇到了一些問題。 嘗試讀取或傳輸文件時會拋出校驗和異常

奇怪的是,有些文件被成功復制而其他文件沒有被復制(我嘗試使用2個文件,其中一個略大於另一個,但兩者都很小)。 我所做的另一個觀察是Java FileSystem.getFileChecksum方法在所有情況下都返回null

關於我想要實現的目標的一個小背景:我正在嘗試將文件寫入hdfs,以便能夠將其用作我編寫的mapreduce作業的分布式緩存。

我還嘗試了來自終端的hadoop fs -copyFromLocal命令,結果與通過java代碼完成的行為完全相同。

我已經瀏覽了整個網絡,包括有關stackoverflow的其他問題,但是我還沒有設法解決這個問題。 請注意,我對hadoop仍然很新,所以非常感謝任何幫助。

我附加了下面的堆棧跟蹤,其中顯示了拋出的異常。 (在這種情況下,我發布了來自終端的hadoop fs -copyFromLocal命令產生的堆棧跟蹤)

name@ubuntu:~/Desktop/hadoop2$ bin/hadoop fs -copyFromLocal ~/Desktop/dtlScaleData/attr.txt /tmp/hadoop-name/dfs/data/attr2.txt

13/03/15 15:02:51 INFO util.NativeCodeLoader: Loaded the native-hadoop library
    13/03/15 15:02:51 INFO fs.FSInputChecker: Found checksum error: b[0, 0]=
    org.apache.hadoop.fs.ChecksumException: Checksum error: /home/name/Desktop/dtlScaleData/attr.txt at 0
        at org.apache.hadoop.fs.ChecksumFileSystem$ChecksumFSInputChecker.readChunk(ChecksumFileSystem.java:219)
        at org.apache.hadoop.fs.FSInputChecker.readChecksumChunk(FSInputChecker.java:237)
        at org.apache.hadoop.fs.FSInputChecker.read1(FSInputChecker.java:189)
        at org.apache.hadoop.fs.FSInputChecker.read(FSInputChecker.java:158)
        at java.io.DataInputStream.read(DataInputStream.java:100)
        at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:68)
        at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:47)
        at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:100)
        at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:230)
        at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:176)
        at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:1183)
        at org.apache.hadoop.fs.FsShell.copyFromLocal(FsShell.java:130)
        at org.apache.hadoop.fs.FsShell.run(FsShell.java:1762)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
        at org.apache.hadoop.fs.FsShell.main(FsShell.java:1895)
    copyFromLocal: Checksum error: /home/name/Desktop/dtlScaleData/attr.txt at 0

您可能正在遇到HADOOP-7199中描述的錯誤。 當您使用copyToLocal下載文件時,它還會將crc文件復制到同一目錄中,因此如果您修改文件然后嘗試執行copyFromLocal ,它將對您的新文件執行校驗和並與您的本地文件進行比較crc文件並失敗,並顯示非描述性錯誤消息。

要修復它,請檢查您是否有此crc文件,如果您只是刪除它並再試一次。

我通過刪除.crc文件來解決同樣的問題

好的,所以我設法解決了這個問題,我正在寫這里的答案,以防其他人遇到同樣的問題。

我所做的只是創建一個新文件並復制有問題文件中的所有內容

從我可以假設它看起來像某個crc文件正在創建並附加到該特定文件,因此通過嘗試使用另一個文件,將執行另一個crc檢查。 另一個原因可能是我將文件命名為attr.txt ,這可能是與其他資源沖突的文件名。 也許有人可以擴大我的答案,因為我不是100%肯定技術細節,這些只是我的觀察。

CRC文件保存特定塊數據的序列號。 整個數據被轉移到Collective Blocks中。 每個塊都存儲metada以及/ hdfs / data / dfs / data文件夾中的CRC文件。 如果有人對CRC文件進行了修正......實際和當前的CRC序列號將不匹配,導致錯誤! 修復此ERROR的最佳做法是覆蓋元數據文件和CRC文件。

我得到了完全相同的問題,沒有任何解決方案。 由於這是我的第一次hadoop體驗,我無法通過互聯網進行一些指導。 我通過格式化我的namenode解決了這個問題。

hadoop namenode -format

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM