1
私はpythonの依存関係をパッケージ化して、というハープ・クラスタに送信しようとしています。これはDRYestの方法で可能です。外部の__main__ファイルからのSparkContextをspark-submitに変更
私は私のmy_spark_app.py
は次のようになりたい:
from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName('MyApp').setMaster('yarn-client')
sc = SparkContext(conf=conf)
sc.addPyFile('/path/to/dependencies.py')
from dependencies import DependencyManager
dm = DependencyManager(sc)
dm.register_lib('dateutil')
import dateutil
# do stuff with dateutil
そしてdependencies.py
はこれです:
import zipfile, os
LIBPATH = '/path/to/my/python/env/lib/python2.7/site-packages/'
class DependencyManager(object):
"""
Collects dependencies to be zipped and sent to the spark context
"""
def __init__(self, spark_context):
self.sc = spark_context
def register_lib(self, p):
libpath = os.path.join(LIBPATH, p)
zippath = libpath + '.zip'
zf = zipfile.PyZipFile(zippath, mode='w')
try:
zf.debug = 3
zf.writepy(libpath)
self.sc.addPyFile(zippath)
finally:
zf.close()
これは、(理由はzf.debug = 3
の)これを生成します:どういうわけか
Adding package in /path/to/env/lib/python2.7/site-packages/dateutil as dateutil
Adding dateutil/__init__.pyc
Adding dateutil/rrule.pyc
Adding dateutil/relativedelta.pyc
Adding package in /path/to/env/lib/python2.7/site-packages/dateutil/zoneinfo as dateutil/zoneinfo
Adding dateutil/zoneinfo/__init__.pyc
Adding dateutil/zoneinfo/rebuild.pyc
Adding dateutil/parser.pyc
Adding dateutil/tzwin.pyc
Adding dateutil/easter.pyc
Adding package in /path/to/env/lib/python2.7/site-packages/dateutil/tz as dateutil/tz
Adding dateutil/tz/__init__.pyc
Adding dateutil/tz/tz.pyc
Adding dateutil/tz/win.pyc
Adding dateutil/tz/_common.pyc
Traceback (most recent call last):
File "/path/to/my_spark_app.py", line 25
import dateutil
ImportError: No module named dateutil
、wからself.sc.addPyFile()
を呼び出すDependencyManager
クラスは、my_spark_app.py
で直接問題なく動作しますが、SparkContextには影響しません。
ここでは何が起こっていますか?
ありがとう、魅力的です –