簡體   English   中英

如何將多處理池分配給 Spark Worker

[英]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')

https://spark.apache.org/docs/2.3.0/api/java/org/apache/spark/sql/SparkSession.Builder.html#master-java.lang.String-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM