Python multiprocessing.Pool.map_async()不能使用SparkContext

时间:2019-01-22 19:43:17

标签: python pyspark multiprocessing python-multiprocessing

我想使用我拥有的32个核心将文件从一种格式转换为另一种格式。我有这段代码应该做我想要的。即循环浏览所有文件,并将类似XML的文件转换为镶木地板。顺序无关紧要。因此,当作业完成时,应仅继续下一个文件并进行转换,而无需等待其他作业。作业总数不应超过procs中给出的最大值。它开始非常有前景,但是在第一次迭代之后,该过程基本上停止了。我还尝试了Pool.mapPool.apply_async。我在jupyter笔记本中使用pyspark上下文,不确定在这里是否重要。

import pandas as pd
from pyspark import SQLContext
from pyteomics import mzxml
from glob import glob

sc = SparkContext.getOrCreate()
sqlContext = SQLContext(sc)
from multiprocessing import Process, Queue, Pool
from random import shuffle

def mzxml_to_pandas_df(filename):
    slices = []
    file = mzxml.MzXML(filename)
    # print('Reading:', filename)
    while True:
        try:
            slices.append(pd.DataFrame(file.next()))
        except:
            break
    return pd.concat(slices)

def fix_column_names_for_spark(df):
    df.rename(columns={'m/z array': 'mz_array', 
                       'intensity array': 'intensity_array'}, inplace=True)

def mzxml_to_parquet(filename):
    new_name = filename.replace('.mzXML', '.parquet')
    print(new_name, end=" ")
    if os.path.isdir(new_name):
        print('already exists.')
        return None
    df = mzxml_to_pandas_df(filename)
    fix_column_names_for_spark(df)
    sqlContext.createDataFrame(df).write.save(new_name)
    print('done')

mzxml_files = glob('./data/*mzXML')  # list of filenames
procs = 10
pool = Pool(procs)
shuffle(mzxml_files)  # Does not help. 
pool.map_async(mzxml_to_parquet, mzxml_files)
pool.close()
pool.join()

为什么该代码会在某个时刻停止,而不继续处理其余文件?我对如何正确地使用多处理感兴趣,但同时也对以更优雅的方式完成任务很感兴趣。谢谢!

现在,我能够重现这些错误。我确实似乎是一个火花问题:

  

错误:py4j.java_gateway:尝试连接到时发生错误   Java服务器(127.0.0.1:34967)追溯(最近一次调用为最后一次):
  文件   “ /home/.../software/spark-2.3.1-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”,   send_command中的第1145行       self.socket.sendall(command.encode(“ utf-8”))BrokenPipeError:[Errno 32]管道损坏

     

在处理上述异常期间,发生了另一个异常:

     

回溯(最近通话最近):文件   “ /home/.../software/spark-2.3.1-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”,   send_command中的第985行       响应= connection.send_command(命令)文件“ /home/.../software/spark-2.3.1-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py ”,   send_command中的第1149行       py4j.protocol.Py4JNetworkError:“发送时出错”,proto.ERROR_ON_SEND)

     

在处理上述异常期间,发生了另一个异常:

     

回溯(最近通话最近):文件   “ /home/.../software/spark-2.3.1-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”,   _get_connection中的第929行       connection = self.deque.pop()IndexError:从一个空的双端队列弹出

     

在处理上述异常期间,发生了另一个异常:

     

回溯(最近通话最近):文件   “ /home/.../software/spark-2.3.1-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”,   1067行,开始       self.socket.connect(((self.address,self.port))ConnectionRefusedError:[Errno 111]连接被拒绝

这是否意味着不应将多处理与Spark一起使用?

0 个答案:

没有答案