Yarn和Spark查询

z4iuyo4d  于 2021-06-27  发布在  Hive
关注(0)|答案(2)|浏览(231)

我需要使用spark将数据从hive(分区的)导出到teradata(非分区的)。
集群规范:120个工作节点,每个节点有16个核心处理器,128gbram。表的大小大约是130gb,当我用它创建一个Dataframe时,它会产生13000个分区。

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惊慌失措并杀死了它们,导致我的作业失败。
现在,我的问题是:
我应该使用coalesce将分区的数量从1,30000减少吗?如果是,什么是最佳的,如何选择?
正如我所说的,这个作业运行得相当快,我请求的1500个vcore中大约有900个在使用:stage 0>->

eagi6jfj

eagi6jfj1#

我将尝试回答上述一些问题:
关于合并函数没有可遵循的通用准则。你需要看看哪一个在vcore的数量和任务的执行方面更适合你。
yarn的动态分配功能确保在初始分配完成后返回执行器,并且在执行期间不使用执行器。这有助于释放集群上的资源,并确保不会将集群资源硬连接到一个作业。
spark和sqoop是两个不同的东西。spark用于内存处理/并行处理数据(来自一个或多个数据源/分布式系统)。sqoop从一个源获取数据并加载到另一个源中。比较这两者不是一个好主意。

zmeyuzjn

zmeyuzjn2#

-----(40230+932)/1,30000
如何配置它,使我的作业不会创建超过100个jdbc连接?
如果teradata端的目标表分区在同一列上,会有帮助吗?怎样?
它从Yarn中获得了许多vcore,因为它们是空闲的,但是当提交其他生产作业时,它们运行得非常慢,因为它们没有获得所需数量的执行器。
最重要的问题是:难道不应该把最初提供给我工作的执行者分配给其他工作吗?我在默认队列中运行作业,该队列没有任何特殊优先级。
我应该不使用spark而使用sqoop吗?
请让我知道,如果你需要任何其他信息的系统,并请原谅,如果我不清楚我的问题,因为我不是那么有经验的Spark。

相关问题