我需要通过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。
答案 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/