今天使用noah上線單上線,將 hadoop客戶端 文件夾 批量 拷貝到 線上機器 的 對應目錄。
結果在測試運行時,執行hive命令,select * from rcfile格式的表,會報錯:
hive> select * from log_bd_show_info where pdate='2014-06-11' and hour='1145' limit 10;
OK
Failed with exception java.io.EOFException:null
Time taken: 3.506 seconds
其他textfile格式的表,一切正常。
懷疑是 壓縮lib包的問題,跟蹤 hive的log日誌: hive-log4j.properties裏面指定的日誌文件,發現裏面 會有詳細的java 警告:
WARN util.NativeCodeLoader (NativeCodeLoader.java:<clinit>(52)) - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
可見 hive 是 找不到 hadoop的 lzo lzma 壓縮庫。
故 結合很早前 排查過類似問題,定位原因是: 缺乏 軟連接 文件導致。 而線下機器 是正常的,如下圖所示:
但線上 機器 對應的文件夾下 卻沒有這些 軟連接,豈不怪哉?
我是通過 noah web上線單的 scp -r 命令 將 文件夾 整體 拷貝到 線上機器的。
故問題 就出現在 這裏!
scp命令 是 不會拷貝 軟連接的。 故 解決方法是 手工在 線上機器 創建 這些軟連接,寫個shell腳本,通過noah web單 批量 在各臺機器執行:
#!/bin/sh
#ln命令 + 真實文件+ 軟連接 。
cd /home/work/hadoop/hadoop-client-1.2.4/hadoop-client/hadoop/lib/native/Linux-amd64-64/
ln -s liblzo2.so.2 liblzo2.so
ln -s libhadoop.so.1.0.0 libhadoop.so
ln -s libhadoop.so.1.0.0 libhadoop.so.1
cd /home/work/hadoop/hadoop-client-1.2.4/hadoop-client/hadoop/
ln -s hadoop-2-core.jar hadoop-2-velo.jar
cd /home/work/hadoop/hadoop-client-1.2.4/hadoop-client/hadoop/libhdfs/
ln -s libhdfs.so.3.1.0-SNAPSHOT libhdfs.so
如何想要拷貝 軟連接,該如何辦呢?
方法1 : 先tar 打包,然後再 scp 文件, 最後解壓縮。
方法2 :rsync 加 -l參數可以實現