EMR上的PySpark(步骤/作业)无法连接到AWS Glue数据目录,但Zeppelin可以

时间:2019-05-24 08:49:51

标签: apache-spark pyspark amazon-emr

我已经设置了启用了数据目录的EMR集群

enter image description here

使用齐柏林飞艇时,我可以访问数据目录,但是我提交的作业/步骤如下:

aws emr add-steps --cluster-id j-XXXXXX --steps "Type=spark,Name=Test,Args=[--deploy-mode,cluster,--master,yarn,--conf,spark.yarn.submit.waitAppCompletion=false,--num-executors,2,--executor-cores,2,--executor-memory,8g,s3://XXXXXX/emr-test.py],ActionOnFailure=CONTINUE"

使用spark.sql("USE xxx")spark.sql("SHOW DATABASES")时为什么看不到数据目录。

from pyspark import SparkContext
from pyspark.sql import SparkSession

sc = SparkContext()
spark = SparkSession \
    .builder \
    .appName("Test") \
    .config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") \
    .getOrCreate()

spark.sql("USE ...")
spark.sql("SHOW TABLES").show()
spark.sql("SELECT querydatetime FROM flights LIMIT 10").show(10)

sc.stop()

我得到类似:

pyspark.sql.utils.AnalysisException: u"Database 'xxxxxx' not found;"

1 个答案:

答案 0 :(得分:0)

我从https://michael.ransley.co/2018/08/28/spark-glue.html发现

  

要在Spark步骤中访问表,您需要使用粘合目录实例化spark会话:

Lambda Function: my_function:dev

我错过了spark = SparkSession.builder \ .appName(job_name) \ .config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") \ .enableHiveSupport() \ .getOrCreate() spark.catalog.setCurrentDatabase("mydatabase") 行。遗憾的是,官方文档中似乎没有对此进行记录。