Конвейер данных AWS: Tez не работает с простой HiveActivity

Я пытаюсь запустить простой конвейер данных AWS для своего POC. Случай, который у меня есть, следующий: получить данные из CSV, хранящиеся на S3, выполнить для них простой запрос куста и вернуть результаты обратно на S3.

Я создал очень простое определение конвейера и попытался запустить его на разных версиях emr: 4.2.0 и 5.3.1 — обе не работают, хотя и в разных местах.

Итак, определение конвейера следующее:

{
  "objects": [
    {
      "resourceRole": "DataPipelineDefaultResourceRole",
      "role": "DataPipelineDefaultRole",
      "maximumRetries": "1",
      "enableDebugging": "true",
      "name": "EmrCluster",
      "keyPair": "Jeff Key Pair",
      "id": "EmrClusterId_CM5Td",
      "releaseLabel": "emr-5.3.1",
      "region": "us-west-2",
      "type": "EmrCluster",
      "terminateAfter": "1 Day"
    },
    {
      "column": [
        "policyID INT",
        "statecode STRING"
      ],
      "name": "SampleCSVOutputFormat",
      "id": "DataFormatId_9sLJ0",
      "type": "CSV"
    },
    {
      "failureAndRerunMode": "CASCADE",
      "resourceRole": "DataPipelineDefaultResourceRole",
      "role": "DataPipelineDefaultRole",
      "pipelineLogUri": "s3://aws-logs/datapipeline/",
      "scheduleType": "ONDEMAND",
      "name": "Default",
      "id": "Default"
    },
    {
      "directoryPath": "s3://data-pipeline-input/",
      "dataFormat": {
        "ref": "DataFormatId_KIMjx"
      },
      "name": "InputDataNode",
      "id": "DataNodeId_RyNzr",
      "type": "S3DataNode"
    },
    {
      "s3EncryptionType": "NONE",
      "directoryPath": "s3://data-pipeline-output/",
      "dataFormat": {
        "ref": "DataFormatId_9sLJ0"
      },
      "name": "OutputDataNode",
      "id": "DataNodeId_lnwhV",
      "type": "S3DataNode"
    },
    {
      "output": {
        "ref": "DataNodeId_lnwhV"
      },
      "input": {
        "ref": "DataNodeId_RyNzr"
      },
      "stage": "true",
      "maximumRetries": "2",
      "name": "HiveTest",
      "hiveScript": "INSERT OVERWRITE TABLE ${output1} select policyID, statecode from ${input1};",
      "runsOn": {
        "ref": "EmrClusterId_CM5Td"
      },
      "id": "HiveActivityId_JFqr5",
      "type": "HiveActivity"
    },
    {
      "name": "SampleCSVDataFormat",
      "column": [
        "policyID INT",
        "statecode STRING",
        "county STRING",
        "eq_site_limit FLOAT",
        "hu_site_limit FLOAT",
        "fl_site_limit FLOAT",
        "fr_site_limit FLOAT",
        "tiv_2011 FLOAT",
        "tiv_2012 FLOAT",
        "eq_site_deductible FLOAT",
        "hu_site_deductible FLOAT",
        "fl_site_deductible FLOAT",
        "fr_site_deductible FLOAT",
        "point_latitude FLOAT",
        "point_longitude FLOAT",
        "line STRING",
        "construction STRING",
        "point_granularity INT"
      ],
      "id": "DataFormatId_KIMjx",
      "type": "CSV"
    }
  ],
  "parameters": []
}

И файл CSV выглядит так:

policyID,statecode,county,eq_site_limit,hu_site_limit,fl_site_limit,fr_site_limit,tiv_2011,tiv_2012,eq_site_deductible,hu_site_deductible,fl_site_deductible,fr_site_deductible,point_latitude,point_longitude,line,construction,point_granularity
119736,FL,CLAY COUNTY,498960,498960,498960,498960,498960,792148.9,0,9979.2,0,0,30.102261,-81.711777,Residential,Masonry,1
448094,FL,CLAY COUNTY,1322376.3,1322376.3,1322376.3,1322376.3,1322376.3,1438163.57,0,0,0,0,30.063936,-81.707664,Residential,Masonry,3
206893,FL,CLAY COUNTY,190724.4,190724.4,190724.4,190724.4,190724.4,192476.78,0,0,0,0,30.089579,-81.700455,Residential,Wood,1

HiveActivity — это просто простой запрос (копия из документации AWS):

"ВСТАВЬТЕ ТАБЛИЦУ ПЕРЕЗАПИСИ ${output1} выберите policyID, код состояния из ${input1};"

Однако при работе на emr-5.3.1 происходит сбой:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask
/mnt/taskRunner/./hive-script:617:in `<main>': Error executing cmd: /usr/share/aws/emr/scripts/hive-script "--base-path" "s3://us-west-2.elasticmapreduce/libs/hive/" "--hive-versions" "latest" "--run-hive-script" "--args" "-f"

Углубляясь в журналы, я мог найти следующее исключение:

2017-02-25T00:33:00,434 ERROR [316e5d21-dfd8-4663-a03c-2ea4bae7b1a0 main([])]: tez.DagUtils (:()) - Could not find the jar that was being uploaded
2017-02-25T00:33:00,434 ERROR [316e5d21-dfd8-4663-a03c-2ea4bae7b1a0 main([])]: exec.Task (:()) - Failed to execute tez graph.
java.io.IOException: Previous writer likely failed to write hdfs://ip-170-41-32-05.us-west-2.compute.internal:8020/tmp/hive/hadoop/_tez_session_dir/31ae6d21-dfd8-4123-a03c-2ea4bae7b1a0/emr-hive-goodies.jar. Failing because I am unlikely to write too.
    at org.apache.hadoop.hive.ql.exec.tez.DagUtils.localizeResource(DagUtils.java:1022)
    at org.apache.hadoop.hive.ql.exec.tez.DagUtils.addTempResources(DagUtils.java:902)
    at org.apache.hadoop.hive.ql.exec.tez.DagUtils.localizeTempFilesFromConf(DagUtils.java:845)
    at org.apache.hadoop.hive.ql.exec.tez.TezSessionState.refreshLocalResourcesFromConf(TezSessionState.java:466)
    at org.apache.hadoop.hive.ql.exec.tez.TezTask.updateSession(TezTask.java:294)
    at org.apache.hadoop.hive.ql.exec.tez.TezTask.execute(TezTask.java:155)

При запуске на emr-4.2.0 у меня другой сбой:

Number of reduce tasks is set to 0 since there's no reduce operator
java.lang.NullPointerException
    at org.apache.hadoop.fs.Path.<init>(Path.java:105)
    at org.apache.hadoop.fs.Path.<init>(Path.java:94)
    at org.apache.hadoop.hive.ql.exec.Utilities.toTempPath(Utilities.java:1517)
    at org.apache.hadoop.hive.ql.exec.Utilities.createTmpDirs(Utilities.java:3555)
    at org.apache.hadoop.hive.ql.exec.Utilities.createTmpDirs(Utilities.java:3520)

И кластер S3, и кластер EMR находятся в одном регионе и работают под одной и той же учетной записью AWS. Я пробовал кучу экспериментов с конфигурациями S3DataNode и EMRCluster, но он всегда дает сбой. Также я не смог найти ни одного рабочего примера конвейера данных с HiveActivity ни в документации, ни на github.

Может кто-нибудь, пожалуйста, помогите мне разобраться? Спасибо.


person Andrii Gorishnii    schedule 25.02.2017    source источник
comment
Получилось ли решение? Столкнулся с той же ошибкой.   -  person red-devil    schedule 07.04.2017
comment
Привет @red-devil Я связался со службой поддержки AWS, и они дали мне советы, которые помогли решить проблему. Вот ключевые моменты, которые я получил от них: 1. Пока не используйте ZIP для входных файлов. 2. В настройке EMR есть ошибка, поэтому вы должны удалить файл jar перед выполнением фактического сценария HIVE. Просто добавьте следующую строку в свой сценарий перед фактическим запросом: delete jar /mnt/taskRunner/emr-hive-goodies.jar; 3. Убедитесь, что вы работаете в каталогах, а не в корне корзины, поскольку HIVE еще не поддерживает перезапись в корень корзины. Так что просто создайте подпапки и сохраните данные внутри. Все это помогло мне.   -  person Andrii Gorishnii    schedule 10.04.2017
comment
Столкнулись с той же проблемой, что и вы, и попробуйте предложенные вами шаги. Это не сработало. Данные не заархивированы, и я не пишу в s3. Однако я попробовал delete jar /mnt/taskRunner/emr-hive-goodies.jar, но это не сработало. stackoverflow.com/questions/47858108/   -  person user1322092    schedule 21.12.2017


Ответы (1)


Я столкнулся с той же проблемой при обновлении моего кластера EMR с версии 4.*.* до версии 5.28.0. После смены лейбла релиза я последовал за комментарием @andrii-gorishnii и добавил

delete jar /mnt/taskRunner/emr-hive-goodies.jar;

в начало моего сценария Hive, и это решило мою проблему! Спасибо @andrii-gorishnii

person saaisha singh    schedule 25.02.2020