从单个数据源并行运行代码

时间:2019-06-12 12:04:51

标签: mysql scala apache-spark

我写了一个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实现并行性,还是我需要为每个设备甚至每个所有者的每个设备启动单独的工作。

1 个答案:

答案 0 :(得分:0)

使用spark需要了解的内容:如果使用Dataframe或RDD对象,则数据将分布在执行程序上,以并行化对象上的转换。 您必须了解使用spark进行分区的概念。 spark的并行性:能够将大数据帧分隔在执行器上分布的分区中,这将对这些分区进行转换以提高处理性能。