【问题标题】:Hadoop distcp to S3 behind HTTP proxyHadoop distcp 到 HTTP 代理后面的 S3
【发布时间】:2013-12-13 01:32:48
【问题描述】:
我正在尝试使用 distcp 将一些文件从 HDFS 复制到 Amazon s3。我的 Hadoop 集群通过 HTTP 代理连接到互联网,但我不知道在连接到 s3 时如何指定它。我目前遇到了这个问题:
httpclient.HttpMethodDirector: I/O exception (org.apache.commons.httpclient.ConnectTimeoutException) caught when processing request: The host did not accept the connection within timeout of 60000 ms
这表明它正在尝试直接连接到亚马逊。如何让distcp 使用代理主机?
【问题讨论】:
标签:
hadoop
amazon-s3
hdfs
【解决方案1】:
在文件 /etc/hadoop/conf/jets3t.properties 中设置这些属性
httpclient.proxy-host = proxy.domain.com
httpclient.proxy-port = 12345
如果这在任何地方都有记录,我找不到它。但是处理它的代码在 RestS3Service 类中。您需要将此文件分发到所有节点,以便它可以进行分布式副本。
【解决方案2】:
我在这里发布另一个答案,因为这是 Google 在询问 hdfs s3 代理时出现的第一个 SOW 问题,而现有的答案在我看来并不是最好的。
为 HDFS 配置 S3 最好在每个节点上的 hdfs-site.xml 文件上完成。通过这种方式,它适用于 distcp(从 HDFS 复制到 S3,反之亦然),但也适用于 Impala 和其他可能使用 S3 的 Hadoop 组件。
因此,将以下属性添加到您的 hdfs-site.xml :
<property>
<name>fs.s3a.access.key</name>
<value>your_access_key</value>
</property>
<property>
<name>fs.s3a.secret.key</name>
<value>your_secret_key</value>
</property>
<property>
<name>fs.s3a.proxy.host</name>
<value>your_proxy_host</value>
</property>
<property>
<name>fs.s3a.proxy.port</name>
<value>your_proxy_port</value>
</property>