从 EMR 迁移到 AWS Glue 后在 Spark SQL 中找不到表
Posted
技术标签:
【中文标题】从 EMR 迁移到 AWS Glue 后在 Spark SQL 中找不到表【英文标题】:Tables not found in Spark SQL after migrating from EMR to AWS Glue 【发布时间】:2019-02-08 16:28:29 【问题描述】:我在 EMR 上有 Spark 作业,并且 EMR 配置为使用 Hive 和 Spark 元数据的 Glue 目录。
我创建 Hive 外部表,它们出现在 Glue 目录中,我的 Spark 作业可以在 Spark SQL 中引用它们,例如 spark.sql("select * from hive_table ...")
现在,当我尝试在 Glue 作业中运行相同的代码时,它会因“找不到表”错误而失败。看起来 Glue 作业没有使用 Spark SQL 的 Glue 目录,就像 Spark SQL 在 EMR 中运行的方式一样。
我可以通过使用 Glue API 并将数据帧注册为临时视图来解决这个问题:
create_dynamic_frame_from_catalog(...).toDF().createOrReplaceTempView(...)
但是有没有办法自动做到这一点?
【问题讨论】:
你是如何创建 spark 对象的?你启用 enableHiveSupport() 了吗?glueContext = GlueContext(SparkContext.getOrCreate())
然后spark = glueContext.spark_session
您是否尝试在 EMR 中运行 Glue 作业?
不,相反,尝试运行在 Glue 上的 EMR 中可以工作的东西。
【参考方案1】:
这是一个期待已久的功能请求(将 Glue 数据目录与 Glue ETL 作业一起使用),最近已发布。 创建新作业时,您会找到以下选项
Use Glue data catalog as the Hive metastore
您也可以通过编辑作业并在作业参数中添加--enable-glue-datacatalog
来为现有作业启用它,但不会提供任何值
【讨论】:
【参考方案2】:您应该使用SparkSession.builder().enableHiveSupport().getOrCreate()
,而不是使用SparkContext.getOrCreate()
,而enableHiveSupport()
是缺少的重要部分。我认为可能发生的情况是,您的 Spark 作业实际上并不是在 Glue 中创建表,而是在 Spark 的嵌入式 Hive 元存储中创建它们,因为您尚未启用 Hive 支持。
【讨论】:
【参考方案3】:遇到了同样的问题。它正在我的开发端点上工作,但不是实际的 ETL 工作。它是通过将作业从 Spark 2.2 编辑到 Spark 2.4 来修复的。
【讨论】:
以上是关于从 EMR 迁移到 AWS Glue 后在 Spark SQL 中找不到表的主要内容,如果未能解决你的问题,请参考以下文章
AWS EMR 与 Glue 目录,明确指定 catalogId
Apache Hudi在AWS Glue和AWS EMR上同步元数据的异同