Как добавить функции из пользовательских JAR в кластер EMR? - PullRequest
2 голосов
/ 19 июня 2019

Я создал кластер EMR на AWS с Spark и Livy. Я представил пользовательский JAR с некоторыми дополнительными библиотеками (например, источниками данных для пользовательских форматов) в качестве пользовательского шага JAR. Однако материал из пользовательского JAR недоступен, когда я пытаюсь получить к нему доступ из Ливий.

Что мне нужно сделать, чтобы пользовательский материал был доступен в окружающей среде?

1 Ответ

2 голосов
/ 19 июня 2019

Я отправляю это как ответ, чтобы иметь возможность принять его - я понял это благодаря комментариям Ювала Ицхакова и документации AWS о пользовательских действиях начальной загрузки.

Итак, вот что я сделал:

  1. Я положил свою библиотечную банку (толстую банку, созданную с помощью sbt assembly, содержащую все необходимое) в корзину S3
  2. Создан скрипт с именем copylib.sh, который содержит следующее:

    #!/bin/bash
    
    mkdir -p /home/hadoop/mylib
    aws s3 cp s3://mybucket/mylib.jar /home/hadoop/mylib
    
  3. Создал следующую конфигурацию JSON и поместил ее в ту же корзину, кроме mylib.jar и copylib.sh:

    [{
       "configurations": [{
           "classification": "export",
           "properties": {
               "PYSPARK_PYTHON": "/usr/bin/python3"
           }
       }],
       "classification": "spark-env",
       "properties": {}
    }, {
       "configurations": [{
           "classification": "export",
           "properties": {
               "PYSPARK_PYTHON": "/usr/bin/python3"
           }
       }],
       "classification": "yarn-env",
       "properties": {}
    },
    {
       "Classification": "spark-defaults",
       "Properties": {
           "spark.executor.extraClassPath": "/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/goodies/lib/emr-spark-goodies.jar:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/usr/share/aws/emr/s3select/lib/emr-s3-select-spark-connector.jar:/home/hadoop/mylib/mylib.jar",
           "spark.driver.extraClassPath": "/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/goodies/lib/emr-spark-goodies.jar:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/usr/share/aws/emr/s3select/lib/emr-s3-select-spark-connector.jar:/home/hadoop/mylib/mylib.jar"
       }
    }
    ]
    

    Классификации для spark-env и yarn-env необходимы для PySpark для работы с Python3 на EMR через Livy. И есть еще одна проблема: EMR уже заполняет два extraClassPath s множеством библиотек, которые необходимы для правильной работы EMR, поэтому мне пришлось запустить кластер без моей библиотеки, извлечь эти параметры из spark-defaults.conf и настроить мои классификация впоследствии. В противном случае такие вещи, как доступ к S3, не будут работать.

  4. При создании кластера на шаге 1 я ссылался на файл конфигурации JSON сверху в Edit software settings, а на шаге 3 я настраивал copylib.sh как пользовательское действие начальной загрузки.

Теперь я могу открыть Jupyterhub кластера, запустить ноутбук и работать с моими добавленными функциями.

...