scp -r 拷贝文件夹 会忽略 软连接

时间:2021-06-01 21:37:15

今天使用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 压缩库。


故 结合很早前 排查过类似问题,定位原因是: 缺乏 软连接 文件导致。  而线下机器 是正常的,如下图所示:

scp -r 拷贝文件夹 会忽略 软连接


但线上 机器  对应的文件夹下 却没有这些 软连接,岂不怪哉?

我是通过 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参数可以实现