【问题标题】:how do you perform hadoop fs -getmerge on dataproc from google storage你如何在谷歌存储的 dataproc 上执行 hadoop fs -getmerge
【发布时间】:2016-07-16 00:48:17
【问题描述】:
对于转储到谷歌存储桶的部分文件,您如何在 dataproc 上使用 getmerge。
如果我试试这个hadoop fs -getmerge gs://my-bucket/temp/part-* gs://my-bucket/temp_merged
我收到一个错误
getmerge: /temp_merged (Permission denied)
它适用于hadoop fs -getmerge gs://my-bucket/temp/part-* temp_merged,但它当然会将合并后的文件写入集群机器而不是 GS。
【问题讨论】:
标签:
hadoop
google-cloud-storage
google-cloud-dataproc
【解决方案1】:
根据fsshell documentation,getmerge 命令从根本上将目标路径视为“本地”路径(因此在gs://my-bucket/temp_merged 中,它忽略了“方案”和“权限”组件,试图直接写入您的本地文件系统路径/temp_meged;这不是特定于 GCS 连接器;如果您尝试hadoop fs -getmerge gs://my-bucket/temp/part-* hdfs:///temp_merged,您会看到同样的事情,更糟糕的是,如果您尝试类似hadoop fs -getmerge gs://my-bucket/temp/part-* hdfs:///tmp/temp_merged,您可能会认为它在事实上,该文件没有出现在hdfs:///tmp/temp_merged 中,而是出现在您的本地文件系统file:///tmp/temp_merged 下。
您可以改为使用管道标准输出/标准输入来实现它;不幸的是,由于.crc 文件的权限和使用,-getmerge 不能很好地与/dev/stdout 配合使用,但是您可以使用支持从标准输入读取的hadoop fs -put 中的功能实现相同的效果:
hadoop fs -cat gs://my-bucket/temp/part-* | \
hadoop fs -put - gs://my-bucket/temp_merged