【发布时间】:2019-04-23 05:36:54
【问题描述】:
我需要使用 spark 将数据从 Hive(分区)导出到 Teradata(非分区)。
集群规格:120 个工作节点,每个节点有 16 个核心处理器,128 GB RAM。 表大小约为 130GB,当我用它创建数据帧时,它会产生 1,30,000 个分区。
val df=spark.sql("select * from <hive-external-table>")
df.mode(SaveMode.Append).write.jdbc(<jdbc_url>,<teradata_table>,<connectionproperties>)
我正在使用以下配置在客户端模式下启动 Spark:
--executor-cores 5 --executor-memory 16G --num-executors 200
作业运行顺利,但它在 Teradata 端创建了 300 多个 JDBC 连接,DBA 惊慌失措并杀死了它们,导致我的作业失败。
现在,我的问题是:
-
我应该使用合并来将分区数从 1,30,000 减少吗?如果是,什么是最优的,如何选择?
-
正如我所说,这项工作运行得非常快,它使用了我请求的 1500 个 vcore 中的大约 900 个: 阶段 0> ->-------------- (40230+932)/1,30,000
-
我如何配置它以使我的作业不会创建超过 100 个 JDBC 连接?
-
如果 Teradata 端的目标表分区在同一列上会有帮助吗?怎么样?
它从 Yarn 获得了很多 vcore,因为它们处于空闲状态,但是当提交其他生产作业时,它们运行非常缓慢,因为它们没有获得所需数量的 executor。
-
最重要的问题:Yarn 不应该解除它最初为我的工作提供的执行器并将它们分配给其他工作吗?我在没有任何特殊优先级的默认队列中运行我的工作。
-
我应该不使用 spark 而使用 Sqoop 吗?
如果您需要系统的任何其他信息,请告诉我,如果我不清楚我的问题,请原谅我,因为我没有火花经验。
【问题讨论】:
标签: apache-spark hive teradata hadoop-yarn