首页 > 解决方案 > EMR 和外部 hive/glue 上的 Pyspark - 可以通过 sqlContext 删除但不能创建表

问题描述

我正在从在 EMR 上运行的 pyspark 将数据帧写入外部配置单元表。这项工作涉及从外部 hive 表中删除/截断数据,将数据帧的内容写入上述表,然后将数据从 hive 写入 DynamoDB。我希望写入 EMR 集群上的内部表,但现在我希望配置单元数据可用于后续集群。我可以直接写入 Glue 目录并强制它注册,但这比我需要走的更远。

所有组件在给定的 EMR 集群上单独运行良好:我可以使用脚本或 ssh 和 hive shell 在 EMR 上创建外部 hive 表。这个表可以被 Athena 查询,也可以被 pyspark 读取。我可以创建一个数据框并将数据插入到上述 pyspark 表中。然后,我可以使用 hive shell 将数据从 hive 表复制到 DynamoDB 表中。

我想将所有工作打包到一个 pyspark 脚本中,而不必提交多个不同的步骤。我可以使用删除表 sqlContext.sql("drop table if exists default.my_table")

当我尝试使用创建表时sqlContext.sql("create table default.mytable(id string,val string) STORED AS ORC"),出现以下错误:

org.apache.hadoop.net.ConnectTimeoutException:调用从 ip-xx-xxx-xx-xxx/xx.xxx.xx.xx 到 ip-xxx-xx-xx-xx:8020 套接字超时异常失败:org.apache .hadoop.net.ConnectTimeoutException:等待通道准备好连接时超时 20000 毫秒。ch : java.nio.channels.SocketChannel[connection-pending remote=ip-xxx-xx-xx-xx:8020]; 有关更多详细信息,请参阅: http ://wiki.apache.org/hadoop/SocketTimeout

我不知道为什么我可以在集群上使用 hive shell 在 Glue 中创建外部 hive 表,使用 hive shell 或 pyspark sqlcontext 删除表,但我无法使用 sqlcontext 创建表。我已经检查过了,提供的解决方案在这种情况下没有意义(复制 hive-site.xml),因为我可以毫不费力地清楚地写入所需的地址,而不是在 pyspark 中。更奇怪的是,当我登记入住 Athena 时,我可以丢弃这些桌子,而它们肯定会被丢弃。

运行于:emr-5.28.0,Hadoop 发行版 Amazon 2.8.5 Spark 2.4.4 Hive 2.3.6 Livy 0.6.0(用于笔记本,但我的实验是通过 ssh 和 pyspark shell)

标签: apache-sparkpysparkhiveamazon-emraws-glue

解决方案


事实证明,只要我提供了表的位置,我就可以通过 spark.sql() 调用创建表。似乎 Hive shell 不需要它,但 spark.sql() 需要它。不出所料,但也不完全出人意料。


推荐阅读