今天使用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参数可以实现