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