我有一个复杂的函数complex_function
,我正在尝试对大量数据并行执行。 complex_function
使用scipy和numpy进行曲线拟合。我以文本流text_stream
的形式读取数据,并使用text_stream.map(complex_function)
对RDD中的每个值并行执行complex_function
。我有4个节点,每个节点有2个执行器,每个执行器有3个核心和足够的内存来处理他们正在处理的分区。但是,我观察到的是,一个节点的CPU使用率达到100%,而其他节点则或多或少保持空闲状态,并且队列中充满了待处理的作业。这是由于complex_function
造成的,还是最好将complex_function
分解为RDD上的几个转换?
感觉好像我已经尝试了一切,从更改分区的大小和传入的每个记录的大小以及接收者读取记录的最大速率。我已打印输出,而不是写入hdfs。我已经尽力启用spark.streaming.concurrentJobs
了,它确实允许作业并行运行,但是据我所知,这不能解决我的问题。
sc = SparkContext()
ssc = StreamingContext(sc, 1)
lines = ssc.socketTextStream("textfile_server", 9999)
lines.map(complex_function)\
.saveAsTextFiles('hdfs://spark-namenode:9000/tmp/complex_function_output')
ssc.start()
ssc.awaitTermination()
我希望根据分区设置将RDD分散到整个群集中,然后complex_function
将在每个分区上并行运行。似乎我对Hadoop和Spark的工作方式有所了解。