我有一个Elastic Map Reduce作业,它正在S3中编写一些文件,我想连接所有文件以生成唯一的文本文件。可以在S3中运行hadoop fs -getmerge吗?
目前我手动将所有文件的文件夹复制到我们的HDFS(hadoop fs copyFromLocal),然后我运行hadoop fs -getmerge和hadoop fs copyToLocal来获取文件。
是否有直接在S3上使用hadoop fs?
我有一个Elastic Map Reduce作业,它正在S3中编写一些文件,我想连接所有文件以生成唯一的文本文件。可以在S3中运行hadoop fs -getmerge吗?
目前我手动将所有文件的文件夹复制到我们的HDFS(hadoop fs copyFromLocal),然后我运行hadoop fs -getmerge和hadoop fs copyToLocal来获取文件。
是否有直接在S3上使用hadoop fs?
实际上,关于getmerge的这个回应是不正确的。 getmerge需要一个本地目标,并且不能与S3一起使用。它会抛出一个IOException
如果您尝试并用-getmerge:Wrong FS:做出响应。
用法:
hadoop fs [generic options] -getmerge [-nl] <src> <localdst>
我自己没有亲自尝试过getmerge命令,但EMR集群节点上的hadoop fs
命令支持像HDFS路径一样的S3路径。例如,您可以SSH到群集的主节点和运行:
hadoop fs -ls s3://<my_bucket>/<my_dir>/
上面的命令将列出了指定的目录路径下的所有S3对象。
我希望hadoop fs -getmerge
以同样的方式工作。因此,只需使用完整的S3路径(以s3://开头)而不是HDFS路径。
一个简单的方法(如果要生成一个适合主计算机上的小文件)是做到以下几点:
合并的文件部分成单个文件到本地机器(Documentation)
hadoop fs -getmerge hdfs://[FILE] [LOCAL FILE]
复制结果文件到S3,然后删除本地文件(Documentation)
hadoop dfs -moveFromLocal [LOCAL FILE] s3n://bucket/key/of/file
'Hadoop的FS -getmerge'只能合并到本地文件系统,而不是S3 – justderb