Pyspark - Dataframe foreach函数不适用于多个worker / parallelize

时间:2016-12-06 17:23:01

标签: apache-spark pyspark spark-dataframe pyspark-sql

我在EC2上运行一个Spark StandAlone集群,其中包含1个主服务器和2个从服务器。群集正在运行。我有一个python应用程序从s3加载数据。代码如下:

spark = SparkSession.builder.appName("Example").getOrCreate()
df = spark.read.csv("s3n://bucket-name/file-name.csv", header=True, mode="DROPMALFORMED")

然后我在df上应用.foreach(func)来对df的每一行做一些工作:

def test_func(row):
    row = modify(row)
    row.save() # just an example

df.foreach(test_func)

我已经阅读了文档,他们说.foreach()已经针对分布式/并行处理进行了优化。但是,test_func仅在1个节点上运行,请参阅下面的日志:(任务3是.foreach(test_func)

INFO TaskSchedulerImpl: Adding task set 3.0 with 1 tasks
INFO TaskSetManager: Starting task 0.0 in stage 3.0 (TID 3, 1xx.xxx.xxx.xx2, partition 0, PROCESS_LOCAL, 17460 bytes)
INFO CoarseGrainedSchedulerBackend$DriverEndpoint: Launching task 3 on executor id: 0 hostname: 1xx.xxx.xxx.xx2

无论如何将此test_func分发给群集中的多个节点/工作人员?非常感谢帮助。提前谢谢。

****** ****** UPDATE

我已经提升了数据,但仍然只有1个任务分配给1个工作人员,并且运行该功能需要花费大量时间。 这就是我运行应用程序的方式

./bin/spark-submit --packages com.amazonaws:aws-java-sdk-pom:1.10.34,org.apache.hadoop:hadoop-aws:2.7.2 --master spark://ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal:7077 examples/src/main/python/test.py --executor-memory 5G --deploy-mode cluster

另一件事是我设置--executor-memory 5G,但工人只使用1Gb Ram。任何人都可以帮我这个吗?我被困在这几天了。非常感谢你提前。

1 个答案:

答案 0 :(得分:0)

来自@LostInOverflow:

  

此代码不解释单个任务,如果确实如此。   可能根本没有足够的数据。

这是对的。在将数据增加到几万条记录后,任务将被拆分并分配给所有执行程序。