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



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

我们如何才能做到这一点。

让我们先假设几件事。您有一台挂有外部硬盘驱动器的计算机(名为 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 要求"当源是 stdin 时,目标必须是文件"。

不幸的是,这需要永远。当我第二天早上回来时,它只做了五分之一的数据(100GB(,并且仍在运行......基本上每个目录需要 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;

希望对您有所帮助!

最新更新