如何将功能从自定义JAR添加到EMR集群?

时间:2019-06-19 11:18:19

标签: apache-spark amazon-emr livy

我使用Spark和Livy在AWS上创建了EMR集群。我提交了一个自定义JAR,其中包含一些其他库(例如,自定义格式的数据源),作为自定义JAR步骤。但是,当我尝试从Livy访问它时,自定义JAR中的内容不可用。

我要怎么做才能使自定义内容在环境中可用?

1 个答案:

答案 0 :(得分:2)

我将其发布为能够接受它的答案-感谢Yuval Itzchakov的评论以及有关Custom Bootstrap Actions的AWS文档。

这就是我所做的:

  1. 我将我的图书馆罐子(用sbt assembly创建的一个胖罐子,其中包含所需的一切)
  2. 创建了一个名为copylib.sh的脚本,其中包含以下内容:

    #!/bin/bash
    
    mkdir -p /home/hadoop/mylib
    aws s3 cp s3://mybucket/mylib.jar /home/hadoop/mylib
    
  3. 创建了以下配置JSON,并将其放入mylib.jarcopylib.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"
       }
    }
    ]
    

    PySpark通过Livy在EMR上使用Python3需要spark-envyarn-env的分类。还有另一个问题:EMR已经为两个extraClassPath填充了许多EMR才能正常运行所需的库,因此我必须在没有lib的情况下运行集群,从{{1}中提取这些设置},然后调整我的分类。否则,S3访问之类的功能将无法正常工作。

  4. 创建集群时,在第1步中,我从spark-defaults.conf中引用了配置JSON文件,在第3步中,我将Edit software settings配置为Custom Bootstrap Action。

我现在可以打开集群的Jupyterhub,启动笔记本并使用我添加的功能。