EMR 和外部 hive/glue 上的 Pyspark - 可以删除但不能通过 sqlContext 创建表
Pyspark on EMR and external hive/glue - can drop but not create tables via sqlContext
我正在从 EMR 上的 pyspark 运行 将数据帧写入外部配置单元 table。这项工作涉及 dropping/truncating 来自外部配置单元 table 的数据,将数据帧的内容写入上述 table,然后将数据从配置单元写入 DynamoDB。我希望写入 EMR 集群上的内部 table,但现在我希望 Hive 数据可用于后续集群。我可以直接写入 Glue 目录并强制其注册,但这比我需要做的更进一步。
所有组件在给定的 EMR 集群上单独运行良好:我可以在 EMR 上创建外部配置单元 table,使用脚本或 ssh 和配置单元 shell。这个table可以被Athena查询,也可以被pyspark读取。我可以在 pyspark 中创建一个数据框并将数据插入到上述 table 中。
然后我可以使用配置单元 shell 将数据从配置单元 table 复制到 DynamoDB table.
我想将所有工作打包到一个 pyspark 脚本中,而不必提交多个不同的步骤。
我可以使用 tables 删除
sqlContext.sql("drop table if exists default.my_table")
当我尝试使用 sqlContext.sql("create table default.mytable(id string,val string) STORED AS ORC")
创建 table 时,出现以下错误:
org.apache.hadoop.net.ConnectTimeoutException: Call From ip-xx-xxx-xx-xxx/xx.xxx.xx.xx to ip-xxx-xx-xx-xx:8020 failed on socket timeout exception: org.apache.hadoop.net.ConnectTimeoutException: 20000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=ip-xxx-xx-xx-xx:8020]; For more details see: http://wiki.apache.org/hadoop/SocketTimeout
我不明白为什么我可以在集群上使用配置单元 shell 在 Glue 中创建外部配置单元 table,使用配置单元 shell 删除 table或 pyspark sqlcontext,但我无法使用 sqlcontext 创建 table。我已经检查过,提供的解决方案在这种情况下没有意义(复制 hive-site.xml),因为我可以毫不费力地清楚地写入所需的地址,而不是在 pyspark 中。更奇怪的是,当我签入 Athena 时,我可以删除 tables 而它们肯定会被删除。
运行 在:
emr-5.28.0,
Hadoop 分发 Amazon 2.8.5
火花 2.4.4
配置单元 2.3.6
Livy 0.6.0(用于笔记本,但我的实验是通过 ssh 和 pyspark shell)
事实证明,我可以通过 spark.sql() 调用创建表格,只要我提供表格的位置即可。似乎 Hive shell 不需要它,但 spark.sql() 需要。出乎意料,但并非完全不足为奇。
补充@Zeathor 的回答。配置 EMR 和 Glue 连接和权限后(您可以在此处查看更多信息:https://www.youtube.com/watch?v=w20tapeW1ME),您只需要编写 sparkSQL 命令:
spark = SparkSession.builder.appName('TestSession').getOrCreate()
spark.sql("create database if not exists test")
然后您可以从数据帧创建表格:
df.createOrReplaceTempView("first_table");
spark.sql("create table test.table_name as select * from first_table");
所有数据库和表格元数据随后将存储在 AWS Glue Catalogue 中。
我正在从 EMR 上的 pyspark 运行 将数据帧写入外部配置单元 table。这项工作涉及 dropping/truncating 来自外部配置单元 table 的数据,将数据帧的内容写入上述 table,然后将数据从配置单元写入 DynamoDB。我希望写入 EMR 集群上的内部 table,但现在我希望 Hive 数据可用于后续集群。我可以直接写入 Glue 目录并强制其注册,但这比我需要做的更进一步。
所有组件在给定的 EMR 集群上单独运行良好:我可以在 EMR 上创建外部配置单元 table,使用脚本或 ssh 和配置单元 shell。这个table可以被Athena查询,也可以被pyspark读取。我可以在 pyspark 中创建一个数据框并将数据插入到上述 table 中。 然后我可以使用配置单元 shell 将数据从配置单元 table 复制到 DynamoDB table.
我想将所有工作打包到一个 pyspark 脚本中,而不必提交多个不同的步骤。
我可以使用 tables 删除
sqlContext.sql("drop table if exists default.my_table")
当我尝试使用 sqlContext.sql("create table default.mytable(id string,val string) STORED AS ORC")
创建 table 时,出现以下错误:
org.apache.hadoop.net.ConnectTimeoutException: Call From ip-xx-xxx-xx-xxx/xx.xxx.xx.xx to ip-xxx-xx-xx-xx:8020 failed on socket timeout exception: org.apache.hadoop.net.ConnectTimeoutException: 20000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=ip-xxx-xx-xx-xx:8020]; For more details see: http://wiki.apache.org/hadoop/SocketTimeout
我不明白为什么我可以在集群上使用配置单元 shell 在 Glue 中创建外部配置单元 table,使用配置单元 shell 删除 table或 pyspark sqlcontext,但我无法使用 sqlcontext 创建 table。我已经检查过,提供的解决方案在这种情况下没有意义(复制 hive-site.xml),因为我可以毫不费力地清楚地写入所需的地址,而不是在 pyspark 中。更奇怪的是,当我签入 Athena 时,我可以删除 tables 而它们肯定会被删除。
运行 在: emr-5.28.0, Hadoop 分发 Amazon 2.8.5 火花 2.4.4 配置单元 2.3.6 Livy 0.6.0(用于笔记本,但我的实验是通过 ssh 和 pyspark shell)
事实证明,我可以通过 spark.sql() 调用创建表格,只要我提供表格的位置即可。似乎 Hive shell 不需要它,但 spark.sql() 需要。出乎意料,但并非完全不足为奇。
补充@Zeathor 的回答。配置 EMR 和 Glue 连接和权限后(您可以在此处查看更多信息:https://www.youtube.com/watch?v=w20tapeW1ME),您只需要编写 sparkSQL 命令:
spark = SparkSession.builder.appName('TestSession').getOrCreate()
spark.sql("create database if not exists test")
然后您可以从数据帧创建表格:
df.createOrReplaceTempView("first_table");
spark.sql("create table test.table_name as select * from first_table");
所有数据库和表格元数据随后将存储在 AWS Glue Catalogue 中。