【问题标题】:File Transfer to Hadoop HDFS from remote linux server文件从远程 linux 服务器传输到 Hadoop HDFS
【发布时间】:2018-09-26 07:33:15
【问题描述】:

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

我们怎样才能做到这一点。

【问题讨论】:

  • 文件有多大?您有 WebHDFS 或 NFS 网关吗?
  • 文件大小目前为 2TB。
  • 例如,您无法将其拆分为多个 bzip2 存档?
  • 是的,每个可能是 100GB,我们可以这样做

标签: unix hadoop hdfs


【解决方案1】:

让我们先假设几件事。您有一台安装了外部硬盘驱动器的机器(名为 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;

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

不幸的是,这需要很长时间。当我第二天早上回来时,它只做了五分之一的数据(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;

希望对你有帮助!

【讨论】:

  • 或者您可以在本地下载和配置Hadoop客户端并直接上传文件,而不是填充“边缘节点”的本地FS
猜你喜欢
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2015-12-31
  • 2021-12-31
  • 2019-11-07
  • 2012-12-06
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多