Multithreading 如何在scala中实现的spark中执行多线程或并行处理

Multithreading 如何在scala中实现的spark中执行多线程或并行处理,multithreading,scala,apache-spark,spark-streaming,azure-eventhub,Multithreading,Scala,Apache Spark,Spark Streaming,Azure Eventhub,您好,我有一个spark流媒体程序,它正在从eventhub读取事件并推送主题。处理每个批次所需的时间几乎是批次时间的10倍 当我尝试实现多线程时,我看不到在处理时间上有多大差别 是否有任何方法可以通过并行处理来提高性能。或者一次启动大约1000个线程,然后继续推送消息 class ThreadExample(msg:String) extends Thread{ override def run { var test = new PushToTopicDr

您好,我有一个spark流媒体程序,它正在从eventhub读取事件并推送主题。处理每个批次所需的时间几乎是批次时间的10倍

当我尝试实现多线程时,我看不到在处理时间上有多大差别

是否有任何方法可以通过并行处理来提高性能。或者一次启动大约1000个线程,然后继续推送消息

class ThreadExample(msg:String) extends Thread{  
        override def run {
         var test = new PushToTopicDriver(msg)
          test.push()
          // println(msg)
        }
}  
object HiveEventsDirectStream {

def b2s(a: Array[Byte]): String = new String(a)

def main(args: Array[String]): Unit = {

val eventhubnamespace = "namespace"
val progressdir = "/Event/DirectStream/"
val eventhubname_d = "namespacestream"
val ehParams = Map[String, String](
  "eventhubs.policyname" -> "PolicyKeyName",
  "eventhubs.policykey" -> "key",
  "eventhubs.namespace" -> "namespace",
  "eventhubs.name" -> "namespacestream",
  "eventhubs.partition.count" -> "30",
  "eventhubs.consumergroup" -> "$default",
  "eventhubs.checkpoint.dir" -> "/EventCheckpoint_0.1",
  "eventhubs.checkpoint.interval" -> "2"
)
println("testing spark")
val conf = new SparkConf().set("spark.serializer", "org.apache.spark.serializer.KryoSerializer").setMaster("local[4]").setAppName("Eventhubs_Test")
conf.registerKryoClasses(Array(classOf[PublishToTopic]))
conf.set("spark.streaming.stopGracefullyOnShutdown", "true")
val sc= new SparkContext(conf)
val hiveContext = new HiveContext(sc)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val pool:ExecutorService=Executors.newFixedThreadPool(30)
val ssc = new StreamingContext(sc, Seconds(2))
var dataString :RDD[String] =sc.emptyRDD
val stream=EventHubsUtils.createDirectStreams(ssc,eventhubnamespace,progressdir,Map(eventhubname_d -> ehParams))
val kv1 = stream.map(receivedRecord => (new String(receivedRecord.getBody))).persist()
kv1.foreachRDD(rdd_1 => rdd_1.foreachPartition(line => line.foreach(msg => {var t1 = new ThreadExample(msg) t1.start()})))
ssc.start()
ssc.awaitTermination()

}
}

谢谢


Ankush Reddy.

Spark已经进行了并行处理。通常,您不希望生成自己的线程,而是希望通过spark处理并行性。您可以尝试增加分区的数量,但添加并行性并不一定会有帮助,这取决于您的数据和您尝试执行的转换。@puhlen当我尝试通过重新分区来增加分区时,这会花费一些时间。我正在处理实时数据,所以需要以非常好的速度使用数据。我真的很惊讶你能做到这一点。您是否丢失了任何数据?我有一个类似的问题,但没有找到解决办法@Falan没有,但每个作业都在等待最后一个任务执行。在下一批的启动过程中再次出现延迟。仍在探索解决方案。你肯定不想开始自己的线程。您可能需要更多的执行器(您现在有多少个?)或者更多的碎片和读卡器(您现在有多少个?),Spark已经进行了并行处理。通常,您不希望生成自己的线程,而是希望通过spark处理并行性。您可以尝试增加分区的数量,但添加并行性并不一定会有帮助,这取决于您的数据和您尝试执行的转换。@puhlen当我尝试通过重新分区来增加分区时,这会花费一些时间。我正在处理实时数据,所以需要以非常好的速度使用数据。我真的很惊讶你能做到这一点。您是否丢失了任何数据?我有一个类似的问题,但没有找到解决办法@Falan没有,但每个作业都在等待最后一个任务执行。在下一批的启动过程中再次出现延迟。仍在探索解决方案。你肯定不想开始自己的线程。你可能需要更多的执行者(你现在有多少?)或者更多的碎片和阅读器(你现在有多少?)。