从远程Linux服务器将文件传输到Hadoop HDFS

时间:2018-09-26 07:33:15

标签: unix hadoop hdfs

我需要将文件从远程Linux服务器传输到直接HDFS。 我将keytab放置在远程服务器上,激活了kinit命令后,但是我无法浏览HDFS文件夹。我从边缘节点知道我可以直接将文件复制到HDFS,但是我需要跳过边缘节点并将文件直接传输到HDFS。

我们如何实现这一目标。

1 个答案:

答案 0 :(得分:0)

让我们先假设几件事。您有一台安装了外部硬盘驱动器的计算机(名为DISK),另一台计算机具有通过ssh访问主服务器的计算机集群(我们在命令行中通过master表示主计算机的user @ hostname部分)。您在带有驱动器的计算机上运行脚本。驱动器上的数据由多个目录组成,每个目录中都有多个文件(例如100)。数字无关紧要,只是为了证明循环是合理的。数据的路径将存储在$ {DIR}变量中(在Linux上为/ media / DISK,在Mac OS X上为/ Volumes / DISK)。脚本如下所示:

DIR=/Volumes/DISK;

for d in $(ls ${DIR}/);
do
  for f in $(ls ${DIR}/${d}/);
  do
    cat ${DIR}/${d}/${f} | ssh master "hadoop fs -put - /path/on/hdfs/${d}/${f}";
  done;
done;

请注意,我们遍历每个文件并将其复制到特定文件中,因为用于放置的HDFS API要求“当源为标准输入时,目标必须为文件。”

不幸的是,这需要永远。第二天早上回来时,它仅处理了数据的五分之一(100 GB),并且仍在运行...基本上每个目录需要20分钟!我最终提出了将数据临时复制到其中一台计算机上,然后将其本地复制到HDFS的解决方案。出于空间原因,我一次只做了一个文件夹,然后立即删除了该临时文件夹。脚本如下所示:

DIR=/Volumes/DISK;
PTH=/path/on/one/machine/of/the/cluster;
for d in $(ls ${DIR}/);
do
  scp -r -q ${DIR}/${d} master:${PTH}/
  ssh master "hadoop fs -copyFromLocal ${PTH}/${d} /path/on/hdfs/";
  ssh master "rm -rf ${PTH}/${d}";
done;

希望有帮助!