我需要使用spark将数据从Hive(已分区)导出到Teradata(非分区)。
集群规范:120个工作节点,每个节点有16个核心处理器,128 GB RAM。表大小约为130GB,当我从中创建数据帧时,它会产生1,30,000个分区。
val df=spark.sql("select * from ")
df.mode(SaveMode.Append).write.jdbc(,,)
我使用下面的配置在客户端模式下启动spark:
--executor-cores 5 --executor-memory 16G --num-executors 200
这项工作运行顺利,但它在Teradata端创建了300多个JDBC连接,DBA恐慌并 挂掉它们导致我的工作失败。
现在,我的问题是:
我应该使用coalesce来减少1,30,000的分区数量吗?如果是,那么什么是最佳的以及如何选择它?
正如我所说,这项工作运行得相当快,它在我要求的1500个中使用了大约900个vcores:第0阶段> - > --------------------- -----(40230 + 932)/ 1,30,000
我如何配置这个,以便我的作业不会创建超过100个JDBC连接?
如果Teradata端的目标表在同一列上分区,会有帮助吗?怎么样?
它得到了许多来自Yarn的vcores,因为它们处于闲置状态,但是当提交其他生产作业时,由于没有获得所需数量的执行程序,它们运行速度非常慢。
最重要的问题:yarn不应该释放它最初提供给我的工作的执行者并将它们分配给其他工作吗?我在默认队列中运行我的工作,该队列没有任何特殊优先级。
我不应该使用spark并使用Sqoop吗?
关于可以遵循的合并功能,没有通用的指导原则。在vcores的数量和任务的执行方面,你需要看看哪个更适合你。
YARN的动态分配功能可确保在初始分配完成后返回执行程序,并且在执行期间不执行执行程序。这有助于释放群集上的资源,并确保我们不会将群集资源仅连接到一个作业。
Spark和Sqoop是两回事。Spark用于数据的内存处理/并行处理(来自一个或多个数据源/分布式系统)。Sqoop从一个源获取数据并加载到另一个源。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。