从 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

针对 AWS EMR 的 AWS Glue 定价

AWS Glue 数据从 S3 迁移到 Redshift

Apache Hudi在AWS Glue和AWS EMR上同步元数据的异同

Apache Hudi在AWS Glue和AWS EMR上同步元数据的异同

我们可以将 AWS Glue 视为 EMR 的替代品吗?