sparksql系列(九) spark多job提交,spark多目录处理
在生产环境中遇到了这种情况:spark程序需要处理输入是多个目录,输出也是多个目录。
但是处理的逻辑都是相同的。使用方法经历多次修改,最终成功完成任务。其中涉及到spark多job提交和spark多个目录同时处理,在此记录一下。
程序中所有异常处理,建议都在函数里面处理好,不要直接写一些处理代码。这样的话直接调用函数就行。
方法一:for直接上
典型的:减少使用资源,拉长运行时间
val sparkSession= SparkSession.builder().master("local").appName("AppName").getOrCreate()
val dataArray = "10450013、3593084 、13568083、32456733、78783125、5689865、23459806".split("、")
for(index <- dataArray){
val path = "/data/"+index
sparkSession.read.json(path).//逻辑代码
}
优点
1.使用最少的资源
2.前后有依赖的任务适合
缺点
1.运行时间最长
方法二:多个job同时运行
使用多倍的资源,减少运行的时间。这种方法在sparkUI界面上看是同时有多个job在运行的。
val sparkSession= SparkSession.builder().master("local").appName("AppName").getOrCreate()
val dataArray = "10450013、3593084 、13568083、32456733、78783125、5689865、23459806".split("、")
val executorService = Executors.newFixedThreadPool(5)
优点
1.运行时间是方法一的1/N。
缺点
1.使用的资源是方法一的N倍。
2.没有办法确定运行结束的顺序
3.前后有依赖的任务不适合
方法三:partationby函数
生成的目录是根据
partitionBy("colmn")的值确定的,也可以写多个partitionBy("colmn"),这样就生成了多级目录
代码
val dataArray = "10450013、3593084 、13568083、32456733、78783125、5689865、23459806".split("、")
sparkSession.read.json(dataArray.map(x=>("/data/"+x)):_*).write.partitionBy("colmn").csv("")
使用范围
最好能确定多个文件之间的大小差不多,要不然容易文件倾斜。
搬砖多年终不得要领,遂载源码看之望得真经。
分类:
spark-sql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?