我用Hadoop 0.20.2合作,并希望使用-cat shell命令,如果可能的两个文件连接成一个(来源: http://hadoop.apache.org/common/docs/r0.19.2/hdfs_shell.html )
下面是我提交(名称已经更改)的命令:
**/path/path/path/hadoop-0.20.2> bin/hadoop fs -cat /user/username/folder/csv1.csv /user/username/folder/csv2.csv > /user/username/folder/outputdirectory/**
它返回的bash:/用户/用户名/文件夹/输出目录/:没有这样的文件或目录
我也尝试创建目录,然后重新运行它 - 我仍然得到了“没有这样的文件或目录”错误。
我已经使用-cp命令同时复制到一个新的文件夹,并-getmerge将它们合并,但有与getmerge没有运气或者也试过。
之所以在Hadoop中这样做的是,文件是巨大的,并需要很长的时间来下载,合并和Hadoop之外重新上传。
该错误与您试图重新直接命令的标准输出回HDFS。 有很多方法可以做到这一点,使用hadoop fs -put
与源参数是一个连字符的命令:
bin/hadoop fs -cat /user/username/folder/csv1.csv /user/username/folder/csv2.csv | hadoop fs -put - /user/username/folder/output.csv
-getmerge
还输出到本地文件系统,而不是HDFS
Unforntunatley存在于多个文件合并成一个没有有效的方式(除非你想看看Hadoop的“追加”,但在你的Hadoop版本,这是默认和潜在的马车禁用),而无需将文件复制到一台机器再放回HDFS,不管你做的是,在
- 自定义地图缩小工作与一个单一的减速和保持该文件排序(记住每一行将由键进行排序的自定义映射器减速,所以你钥匙将需要输入文件名和行号的组合,和值将是线本身)
- 通过FsShell命令,根据您的网络拓扑结构 - 即没有客户端控制台有很好的速度连接到数据节点? 这当然是对你的一部分最小的努力,并可能完成比MR工作更快地做同样的(因为一切都已经去到一台机器,无论如何,那么为什么不是你的本地控制台?)
要连接的文件夹到输出文件中的所有文件:
hadoop fs -cat myfolder/* | hadoop fs -put - myfolder/output.txt
如果您对HDFS多个文件夹,你想在每一个这些文件夹来连接文件,你可以使用一个shell脚本来做到这一点。 (注意:这是不是很有效,可以很慢)
句法 :
for i in `hadoop fs -ls <folder>| cut -d' ' -f19` ;do `hadoop fs -cat $i/* | suy hadoop fs -put - $i/<outputfilename>`; done
例如:
for i in `hadoop fs -ls my-job-folder | cut -d' ' -f19` ;do `hadoop fs -cat $i/* |hadoop fs -put - $i/output.csv`; done
说明:所以你基本上遍历所有的文件和猫每一个文件夹中的内容到在HDFS输出文件。