Я имею, устанавливают кластер Hadoop, содержащий 5 узлов на Amazon EC2. Теперь, когда я вхожу в систему в Главный узел и отправляю следующую команду
bin/hadoop jar <program>.jar <arg1> <arg2> <path/to/input/file/on/S3>
Это бросает следующие ошибки (не одновременно.) Первая ошибка брошена, когда я не заменяю наклонные черты '%2F', и второе брошено, когда я заменяю их '%2F':
1) Java.lang.IllegalArgumentException: Invalid hostname in URI S3://<ID>:<SECRETKEY>@<BUCKET>/<path-to-inputfile>
2) org.apache.hadoop.fs.S3.S3Exception: org.jets3t.service.S3ServiceException: S3 PUT failed for '/' XML Error Message: The request signature we calculated does not match the signature you provided. check your key and signing method.
Примечание:
1) когда я отправил jps для наблюдения, какие задачи работали на Ведущем устройстве, он просто показал
1116 NameNode
1699 Jps
1180 JobTracker
отъезд DataNode и TaskTracker.
2) Мой Секретный ключ содержит два '/' (наклонные черты вправо). И я заменяю их '%2F' в S3 URI.
PS: прогоны программы, прекрасные на EC2 при выполнении на единственном узле. Его единственное, когда я запускаю кластер, я сталкиваюсь с проблемами, связанными с копированием данных к/от S3 из/в HDFS. И, что делает distcp? Я должен распределить данные даже после того, как я скопирую данные от S3 до HDFS? (Я думал, HDFS заботился об этом внутренне),
ЕСЛИ Вы могли бы направить меня к ссылке, которая объясняет, что выполнение Отображает/уменьшает программы на hadoop кластере с помощью Amazon EC2/S3. Это было бы большим.
С уважением,
Deepak.
Вы, вероятно, хотите использовать s3n://, а не s3://. s3n:// означает "Обычный файл, доступный для чтения из внешнего мира, по этому S3 url". s3:// относится к файловой системе HDFS, отображенной на S3 bucket.
Чтобы избежать проблемы с экранированием URL для ключа доступа (и сделать жизнь намного проще), поместите их в файл /etc/hadoop/conf/core-site.xml
:
<property>
<name>fs.s3.awsAccessKeyId</name>
<value>0123458712355</value>
</property>
<property>
<name>fs.s3.awsSecretAccessKey</name>
<value>hi/momasgasfglskfghaslkfjg</value>
</property>
<property>
<name>fs.s3n.awsAccessKeyId</name>
<value>0123458712355</value>
</property>
<property>
<name>fs.s3n.awsSecretAccessKey</name>
<value>hi/momasgasfglskfghaslkfjg</value>
</property>
Одно время существовала нерешенная проблема с секретными ключами, содержащими косую черту - URL расшифровывался в некоторых контекстах, но не в других. Я не знаю, было ли это исправлено, но я знаю, что с ключами в .conf это исчезло.
Другие советы:
hadoop fs -cp s3n://myhappybucket/
или hadoop fs -cp s3n://myhappybucket/happyfile. txt /tmp/dest1
и даже hadoop fs -cp /tmp/some_hdfs_file s3n://myhappybucket/will_be_put_into_s3
distcp
запускает команду только для маппера, чтобы скопировать дерево оттуда сюда. Используйте ее, если вам нужно скопировать очень большое количество файлов в HDFS. (Для повседневного использования, hadoop fs -cp src dest
работает просто отлично). SocketTimeoutException
, примените патч для HADOOP-6254. Мы были, и мы сделали, и они исчезли. Попробуйте использовать Amazon Elastic MapReduce. Это устраняет необходимость в настройке узлов hadoop, и вы можете просто получить доступ к объектам в своей учетной записи s3 так, как вы ожидаете.