我在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。任何人都可以帮我这个吗?我被困在这几天了。非常感谢你提前。
答案 0 :(得分:0)
来自@LostInOverflow:
此代码不解释单个任务,如果确实如此。 可能根本没有足够的数据。
这是对的。在将数据增加到几万条记录后,任务将被拆分并分配给所有执行程序。