[英]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.