2015-02-07 6 views
1

TL; DRКак загрузить дополнительные JARs для работы Hadoop Streaming на Amazon EMR

Как я могу загрузить или задать дополнительные JARs к Hadoop Streaming Работа на Amazon Elastic MapReduce (Amazon EMR)?

Длинная версия

Я хочу проанализировать набор Avro файлов (> 2000 файлов) с использованием Hadoop на Amazon Elastic MapReduce (Amazon EMR). Это должно быть простое упражнение, через которое я должен получить некоторую уверенность в MapReduce и Amazon EMR (я новичок в обоих).

Поскольку python - мой любимый язык, я решил использовать Hadoop Streaming. Я построил простой mapper и редуктор в python, и я проверил его на локальном Hadoop (установка одного узла). Команда, которую я выдавала на моей местной установке Hadoop, была следующей:

$HADOOP_PREFIX/bin/hadoop jar $HADOOP_PREFIX/share/hadoop/tools/lib/hadoop-streaming-2.4.0-amzn-1.jar \ 
        -files avro-1.7.7.jar,avro-mapred-1.7.7.jar \ 
        -libjars avro-1.7.7.jar,avro-mapred-1.7.7.jar \ 
        -input "input" \ 
        -mapper "python2.7 $PWD/mapper.py" \ 
        -reducer "python2.7 $PWD/reducer.py" \ 
        -output "output/outdir" \ 
        -inputformat org.apache.avro.mapred.AvroAsTextInputFormat 

и работа выполнена успешно.

У меня есть ведро на Amazon S3 с папкой, содержащей все входные файлы и другую папку с скриптами картографа и редуктора (и reducer.py соответственно).

Использование интерфейса я создал небольшой кластер, а затем я добавил bootstrap action установить все необходимые питон модули на каждом узле, а затем я добавил "Hadoop Streaming" step указав расположение Mapper и редукторных скриптов на S3.

Проблема в том, что у меня нет ни малейшего представления о , как я могу загрузить или указать в параметрах два JARs - avro-1.7.7.jar и avro-mapred-1.7.7.jar - требуется для запуска этой работы?

я пытался несколько вещей:

  • используя -files флаг в сочетании с -libjars в необязательные аргументы;
  • добавление другого загрузочного действия, которое загружает JAR на каждом узле (и я попытался загрузить его в разных местах на узлах);
  • Я попытался загрузить JAR на моем ковше и указать полный путь s3://... как аргумент -libjars (обратите внимание: этот файл активно игнорируется Hadoop и выдается предупреждение) в параметрах;

Если я не сдал два JARs задание выходит из строя (она не признает -inputformat класса), но я попробовал все возможности (и их комбинации!) Я мог думать без толка.

ответ

1

В конце концов, я цифра это (и это было, конечно, очевидного):

Вот как я это сделал:

  1. добавить самозагрузки действия, которое загружает коробит каждый узел, к примеру, вы можете загрузить JARs в вашем ведре, сделать их достоянием общественности, а затем сделать:

    wget https://yourbucket/path/somejar.jar -O $HOME/somejar.jar 
    wget https://yourbucket/path/avro-1.7.7.jar -O $HOME/avro-1.7.7.jar 
    wget https://yourbucket/path/avro-mapred-1.7.7.jar -O $HOME/avro-mapred-1.7.7.jar 
    
  2. при указании -libjars в необязательные аргументы использовать abosolute путь, так:

    -libjars /home/hadoop/somejar.jar,$HOME/avro-1.7.7.jar,/home/hadoop/avro-mapred-1.7.7.jar 
    

Я потерял несколько часов, что я стыжусь сказать, надеюсь, это поможет кому-то еще.

Edit (Feb десятом, 2015)

Я проверил, и я хочу отметить, что, кажется, что переменная окружения не расширена при передаче необязательного поля аргументов. Таким образом, использовать явную $ HOME путь (т.е. /home/hadoop)

Edit (Feb 11-я, 2015)

Если вы хотите, чтобы запустить потоковое работу на Amazon EMR с помощью АМС кли вы можете использовать следующие команда.

aws emr create-cluster --ami-version '3.3.2' \ 
         --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType='m1.medium' InstanceGroupType=CORE,InstanceCount=2,InstanceType='m3.xlarge' \ 
         --name 'TestStreamingJob' \ 
         --no-auto-terminate \ 
         --log-uri 's3://path/to/your/bucket/logs/' \ 
         --no-termination-protected \ 
         --enable-debugging \ 
         --bootstrap-actions Path='s3://path/to/your/bucket/script.sh',Name='ExampleBootstrapScript' Path='s3://path/to/your/bucket/another_script.sh',Name='AnotherExample' \ 
         --steps file://./steps_test.json 

и вы можете указать шаги в JSON файла:

[ 
{ 
    "Name": "Avro", 
    "Args": ["-files","s3://path/to/your/mapper.py,s3://path/to/your/reducer.py","-libjars","/home/hadoop/avro-1.7.7.jar,/home/hadoop/avro-mapred-1.7.7.jar","-inputformat","org.apache.avro.mapred.AvroAsTextInputFormat","-mapper","mapper.py","-reducer","reducer.py","-input","s3://path/to/your/input_directory/","-output","s3://path/to/your/output_directory/"], 
    "ActionOnFailure": "CONTINUE", 
    "Type": "STREAMING" 
} 
] 

(обратите внимание, что official Amazon documentation несколько устарели, на самом деле он использует старый инструмент Amazon EMR CLI, который deprecated в пользу от более поздних AWS CLI)