我写了一个sparkjob,它以拼花格式从hdfs中获取数据。 现在,我想根据设备类型区分执行的代码,并为每个设备所有者执行。查看日志时,代码是顺序执行的,而不是并行执行的。我尝试了不同的#workers #cores数量的ram组合,而没有改变执行时间。
在我看来,应该可以并行执行n * m次执行,其中n是设备数量,m是所有者数量,因为数据之间没有任何连接。
代码通常看起来像这样
df = readFromParquetHDFS //contains data for every device and every owner
dfTypeA = df.where($"device" === "TypeA")
df_analysis = doStuff(dfTypeA) //analysis happens per device
array_owner.foreach(owner => {
df_owner = df_analysis.where($"owner" === owner)
spark.writeToMysql(df_owner) //writes to mysql table DeviceA_OwnerA
})
dfTypeB = df.where($"device" === "TypeB")
df_analysis = doDifferentStuff(dfTypeB)
array_owner.foreach(owner => {
df_owner = df_analysis.where($"owner" === owner")
spark.writeToMysql(df_owner)
})
可以通过这种方式通过spark实现并行性,还是我需要为每个设备甚至每个所有者的每个设备启动单独的工作。
答案 0 :(得分:0)
使用spark需要了解的内容:如果使用Dataframe或RDD对象,则数据将分布在执行程序上,以并行化对象上的转换。 您必须了解使用spark进行分区的概念。 spark的并行性:能够将大数据帧分隔在执行器上分布的分区中,这将对这些分区进行转换以提高处理性能。