我编写了一个 Sparkjob,它以 Parquet 格式从 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 实现并行性,或者我是否需要为每个设备甚至每个所有者的每个设备启动单独的作业。
最佳答案
关于spark您必须了解的内容:如果您使用Dataframe或RDD对象,数据将分布在您的执行器上,以便并行化对象上的转换。 您必须了解 Spark 分区的概念。 Spark的并行性:它能够将一个大数据帧分成多个分区,分布在执行器上,执行器将对这些分区进行转换以提高处理性能。
关于mysql - 从单个数据源并行运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56561828/