Проблема с копированием локальных данных в HDFS в кластере Hadoop с помощью Amazon EC2 / S3 - PullRequest
8 голосов
/ 10 июня 2010

Я настроил кластер Hadoop, содержащий 5 узлов на Amazon EC2. Теперь, когда я вхожу в мастер-узел и отправляю следующую команду

bin/hadoop jar <program>.jar <arg1> <arg2> <path/to/input/file/on/S3>

Выдает следующие ошибки (не одновременно). Первая ошибка выдается, когда я не заменяю косые черты на «% 2F», а вторая выдается, когда я заменяю их на «% 2F»: 1004 *

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, чтобы увидеть, какие задачи выполнялись на Master, он просто показал

1116 NameNode
1699 Jps
1180 JobTracker

оставляя DataNode и TaskTracker.

2) Мой секретный ключ содержит два символа «/» (косая черта). И я заменяю их на «% 2F» в S3 URI.

PS: Программа отлично работает на EC2 при запуске на одном узле. Только когда я запускаю кластер, я сталкиваюсь с проблемами, связанными с копированием данных в / из S3 из / в HDFS. И что делает distcp? Нужно ли распространять данные даже после того, как я скопирую данные из S3 в HDFS? (Я думал, HDFS позаботился об этом внутри)

ЕСЛИ вы могли бы направить меня по ссылке, объясняющей запуск программ Map / Reduce в кластере hadoop с использованием Amazon EC2 / S3. Это было бы здорово.

С уважением,

Дипак.

Ответы [ 4 ]

21 голосов
/ 13 июня 2010

Возможно, вы хотите использовать s3n: // urls, а не s3: // urls. s3n: // означает «Обычный файл, читаемый из внешнего мира, по этому URL S3». s3: // относится к файловой системе HDFS, отображаемой в корзину S3.

Чтобы избежать проблемы с выходом 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, которые прекрасно работают с URL-адресами s3n: // (и s3: //). Попробуйте 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 отлично работает).
  • Вам не нужно перемещать данные в HDFS, если вы не хотите. Вы можете извлекать все исходные данные прямо из s3, делать все дальнейшие манипуляции с HDFS или S3 по своему усмотрению.
  • Hadoop может запутаться, если есть файл s3n: // myhappybucket / foo / bar и «каталог» (много файлов с ключами s3n: // myhappybucket / foo / bar / что-то). Некоторые старые версии команды s3sync оставляли именно такие 38-байтовые преобразования в дереве S3.
  • Если вы начинаете видеть SocketTimeoutException, примените патч для HADOOP-6254 . Мы были, и мы сделали, и они ушли.
4 голосов
/ 10 июня 2011

Вы также можете Apache Whirr для этого рабочего процесса.Обратитесь к Краткое руководство по началу работы и 5 минут руководство для получения дополнительной информации.

Отказ от ответственности: я один из коммиттеров.

3 голосов
/ 16 июня 2010

Попробуйте использовать Amazon Elastic MapReduce. Это устраняет необходимость в настройке узлов hadoop, и вы можете просто получать доступ к объектам в вашей учетной записи s3 так, как вы ожидаете.

0 голосов
/ 08 мая 2014

Использование

-Dfs.s3n.awsAccessKeyId=<your-key> -Dfs.s3n.awsSecretAccessKey=<your-secret-key>

например

hadoop distcp -Dfs.s3n.awsAccessKeyId=<your-key> -Dfs.s3n.awsSecretAccessKey=<your-secret-key> -<subsubcommand> <args>

или

hadoop fs -Dfs.s3n.awsAccessKeyId=<your-key> -Dfs.s3n.awsSecretAccessKey=<your-secret-key> -<subsubcommand> <args>
...