查询纱线和火花

时间:2018-11-20 17:48:35

标签: apache-spark hive teradata yarn

我需要使用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. 我应该使用合并将分区数量从1,30,000减少到多少吗?如果可以,什么是最佳选择?如何选择?

  2. 正如我所说的那样,这项工作运行得非常快,在我要求的1500个内核中,它使用了大约900个内核: 阶段0>-> --------------------------(40230 + 932)/ 1,30,000

  3. 我该如何配置它,以便我的工作不会创建超过100个的JDBC连接?

  4. 如果Teradata端的目标表分区在同一列上会有所帮助吗?怎么样?

    由于Yarn处于空闲状态,因此获得了许多vcore,但是当提交其他生产作业时,它们的运行速度非常慢,因为它们没有获得所需数量的执行者。

  5. 最重要的问题:Yarn不应该取消最初提供给我的工作的执行者并将他们分配给其他工作吗?我在默认队列中运行我的工作,该队列没有任何特殊优先级。

  6. 我不应该使用spark而是使用Sqoop吗?

如果您需要该系统的其他信息,请告诉我,如果我不清楚我的问题是不好意思,请问我。

1 个答案:

答案 0 :(得分:1)

我将尝试回答上述一些问题:

  1. 关于合并功能,没有通用的准则可以遵循。您需要查看在vcore数量和任务执行方面哪个更适合您。

  2. YARN的
  3. 动态分配功能可确保在初始分配完成后返回执行程序,并且在执行过程中不使用执行程序。这有助于释放群集上的资源,并确保我们不会将群集资源仅硬连接到一项工作。

  4. Spark和Sqoop是两回事。 Spark用于内存中的数据处理/并行处理(来自一个或多个数据源/分布式系统)。 Sqoop从一个来源获取数据并加载到另一个来源。比较这两个不是一个好主意。