參照Hadoop.The.Definitive.Guide.4th的例子,執行SortDataPreprocessor作業時失敗,輸出的錯誤信息 SequenceFile doesn't work with GzipCodec without native-hadoop code! 根據提示初步猜測
參照Hadoop.The.Definitive.Guide.4th的例子,執行SortDataPreprocessor作業時失敗,輸出的錯誤信息
SequenceFile doesn't work with GzipCodec without native-hadoop code!
根據提示初步猜測應該是沒有載入到對應的庫,懷疑是java的某個jar包沒有載入到。根據提示搜索參考了一些解決方案,應該是hadoop native lib沒有載入到,於是繼續瞭解什麼是hadoop native lib。
hadoop native lib
字面上意思就是hadoop的本地運行庫,由於hadoop的一些操作(比如壓縮)為了提高性能,不適合使用java的庫運行,所以提供一批本地庫。
參考http://www.cnblogs.com/gpcuster/archive/2011/02/17/1957042.html
好了,搞明白hadoop native lib後,現在要定位為什麼沒有載入成功
繼續搜索,找到了相似的解決方案,參考http://blog.csdn.net/jiedushi/article/details/7496327,學習到瞭如下debug命令
export HADOOP_ROOT_LOGGER=DEBUG,console
通過這個設置,可以顯示hadoop執行作業時的調試信息,也就是可以輸出錯誤信息
啟用調試之後,執行hadoop checknative(這是檢測hadoop本地庫是否載入成功的命令)
輸出如下調試信息
16/03/18 03:44:41 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: /usr/hadoop/lib/native/libhadoop.so.1.0.0: libc.so.6: version `GLIBC_2.14' not found (required by /usr/hadoop/lib/native/libhadoop.so.1.0.0)
根據調試信息繼續進入另外一個洞,什麼是GLIBC?
簡單瞭解GLIBC,發現是一個C運行庫,功能很強大,linux系統的重要基礎組件。
根據提示信息"GLIBC_2.14"搜索,引出了一個更根本的問題,本機的GLIBC的版本不是2.14,是2.12,參考http://www.cnblogs.com/gw811/p/3676856.html(這篇文章的export方式升級版本無效果,還會導致命令行完全不可用)
現在確定需要升級GLIBC到2.14版本,直接用yum install不行,僅僅只是給2.12版本打升級包,但是版本沒有升級。找了好幾個解決方案,最終找到一個可行的
http://blog.csdn.net/niying/article/details/42491557
安裝2.14版的步驟還算簡單,只是比較長特別是執行make -j4,需要點耐心,關鍵步驟是通過更新軟鏈接升級GLIBC版本
ln -fs /opt/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6
/lib64/libc.so.6本身就是一個已存在軟鏈接,指向的是同目錄的llibc-2.12.so,通過上述命令將新版的庫鏈接到libc.so.6
完成上述步驟執行,再次執行hadoop checknative
INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
看到上述信息說明本地庫載入成功
接著繼續執行SortDataPreprocessor作業,成功運行,到此問題解決。