python-集群上的pyspark,确保使用了所有节点

部署信息:“ pyspark –master yarn-client –num-executors 16 –driver-memory 16g –executor-memory 2g”

我正在将一个100,000行文本文件(以hdfs dfs格式)转换为带有corpus = sc.textFile(“ my_file_name”)的RDD对象.当我执行corpus.count()时,我得到100000.我意识到所有这些步骤都是在主节点上执行的.

现在,我的问题是,当我执行诸如new_corpus = corpus.map(some_function)之类的操作时,pyspark会自动在所有可用的奴隶(在我的例子中为16个)中分配作业吗?还是我必须指定一些内容?

笔记:

>我认为实际上并没有分发任何东西(或至少不在16个节点上分发),因为当我执行new_corpus.count()时,打印出的内容是[Stage some_number:> (0 2)/ 2],而不是[Stage some_number:> (0 16)/ 16]
>我不认为做corpus = sc.textFile(“ my_file_name”,16)对我来说是解决方案,因为我要应用的功能在行级别有效,因此应应用100,000次(并行化的目标是以加快此过程,例如让每个从站占用100000/16行).不应将它应用于原始文本文件的16个子集16次.

解决方法:

您的观察并不正确.阶段不是“执行者”.在Spark中,我们有工作,任务,然后是阶段.作业由主驱动程序启动,然后将任务分配给不同的工作程序节点,其中stage是具有相同改组依赖性的任务的集合.在您的情况下,改组仅发生一次.

要检查执行者是否真的是16岁,您必须调查资源管理器.由于使用纱线,通常在端口4040.

另外,如果使用rdd.map(),则它应根据定义的分区而不是在sc.textFile(“ my_file_name”,numPartitions)中设置的执行程序并行化.

这里再次是一个概述:
https://spark.apache.org/docs/1.6.0/cluster-overview.html

上一篇:python中的spark自定义排序


下一篇:python-read_csv()中的S3阅读器是先将文件下载到磁盘还是使用流式传输?