[英]How to Distribute Multiprocessing Pool to Spark Workers
我正在尝试使用多处理并行读取 100 个 csv 文件(然后并行处理它们)。 这是我在 AWS 的 EMR 主节点上托管的 Jupyter 中运行的代码。 (最终它将是 100k csv 文件,因此需要分布式读取)。
import findspark
import boto3
from multiprocessing.pool import ThreadPool
import logging
import sys
findspark.init()
from pyspark import SparkContext, SparkConf, sql
conf = SparkConf().setMaster("local[*]")
conf.set('spark.scheduler.mode', 'FAIR')
sc = SparkContext.getOrCreate(conf)
spark = sql.SparkSession.builder.master("local[*]").appName("ETL").getOrCreate()
s3 = boto3.resource(...)
bucket = ''
bucketObj = s3.Bucket(bucket)
numNodes = 64
def processTest(key):
logger.info(key + ' ---- Start\n')
fLog = spark.read.option("header", "true") \
.option("inferSchema", "true") \
.csv(buildS3Path(bucket) + key)
logger.info(key + ' ---- Finish Read\n')
fLog = renameColumns(NAME_MAP, fLog)
logger.info(key + ' ---- Finish Rename\n')
(landLog, flags) = validate(fLog)
logger.info(key + ' ---- Finish Validation\n')
files = list(bucketObj.objects.filter(Prefix=subfolder))
keys = list(map(lambda obj: obj.key, files))
keys = keys
# files = s3C.list_objects(Bucket=bucket, Prefix=subfolder)['Contents']
p = ThreadPool(numNodes)
p.map(processTest, keys)
蓝线是我的主节点上的 CPU 使用率。 所有日志都显示我在一台机器上运行:
INFO:pyspark:172.31.29.33
我如何让 spark 将池分配给工人?
仔细阅读 SparkSession.Builder API 文档,传递给SparkSession.builder.master('xxxx')
的字符串是通过以下方式连接到主节点的主机:spark://xxxx:7077。 就像 user8371915 说的,我不需要在一个独立的本地主机上。 相反,此修复程序像魅力一样工作:
SparkSession.builder.master('yarn')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.