按字母顺序将文件从本地复制到HDFS - 排序

时间:2017-09-17 20:01:18

标签: shell hadoop copy hdfs

我需要通过shell脚本将文件从本地文件系统复制到HDFS。假设我的本地系统中有两个文件

fewInfo.tsv.gz
fewInfo.txt

在上面的例子中,应首先将lessInfo.tsv.gz复制(s在x之前)到HDFS,然后复制lessInfo.txt。这可能吗?

任何人都知道内部结构如何" put"命令在多个文件被复制到HDFS时有效吗?

我使用的Hadoop版本是Hadoop 2.5.0-cdh5.3.1。

1 个答案:

答案 0 :(得分:0)

您可以遍历目录以查找所有文件,对文件进行排序,然后执行hdfs副本。优点是您可以指定排序的约束(例如,通过文件名,日期,顺序等)。有很多选项可以执行此操作。一种是使用find命令:

find /some/directory -type f -maxdepth 1 -type f | sort | while IFS= read -r filename; do hdfs dfs -copyFromLocal "$filename" hdfs://target/dir/; done
  • -maxdepth 1参数阻止find以递归方式下降到任何子目录中。 (如果您希望处理这样的嵌套目录,可以省略它。)
  • -type -f指定只处理普通文件。
  • sort定义找到的文件将被排序。在这里,您可以按相反顺序进行扩展,对修改日期进行排序等。
  • while IFS= read -r filename循环找到找到的文件。该循环中的IFS用于保留前导和尾随空格。 -r选项阻止读取将反斜杠视为特殊字符。
  • hdfs dfs -copyFromLocal "$filename" hdfs://target/dir/获取已排序的filenames并将它们从本地目录复制到hdfs目录。或者,您也可以使用hadoop -fs put "$filename" hdfs://target/dir/