ここでは、PySpark を使用して Spark on MaxCompute アプリケーションを開発する方法について説明します。
アプリケーションでMaxComputeテーブルにアクセスする場合は、odps-spark-datasourceパッケージをコンパイルする必要があります。 詳細については、「Linux開発環境の設定」をご参照ください。
Spark 1.6 での Spark SQL アプリケーション開発
サンプルコード:
from pyspark import SparkContext, SparkConf
from pyspark.sql import OdpsContext
if __name__ == '__main__':
conf = SparkConf().setAppName("odps_pyspark")
sc = SparkContext(conf=conf)
sql_context = OdpsContext(sc)
sql_context.sql("DROP TABLE IF EXISTS spark_sql_test_table")
sql_context.sql("CREATE TABLE spark_sql_test_table(name STRING, num BIGINT)")
sql_context.sql("INSERT INTO TABLE spark_sql_test_table SELECT 'abc', 100000")
sql_context.sql("SELECT * FROM spark_sql_test_table").show()
sql_context.sql("SELECT COUNT(*) FROM spark_sql_test_table").show()
次のコマンドを実行して、コードをコミットして実行します。
./bin/spark-submit \
--jars cupid/odps-spark-datasource_xxx.jar \
example.py
Spark 2.3 での Spark SQL アプリケーション開発
サンプルコード:
from pyspark.sql import SparkSession
if __name__ == '__main__':
spark = SparkSession.builder.appName("spark sql").getOrCreate()
spark.sql("DROP TABLE IF EXISTS spark_sql_test_table")
spark.sql("CREATE TABLE spark_sql_test_table(name STRING, num BIGINT)")
spark.sql("INSERT INTO spark_sql_test_table SELECT 'abc', 100000")
spark.sql("SELECT * FROM spark_sql_test_table").show()
spark.sql("SELECT COUNT(*) FROM spark_sql_test_table").show()
コードをコミットして実行します。
次のコマンドを実行して、コードをクラスターモードでコミットして実行します。
spark-submit --master yarn-cluster \ --jars cupid/odps-spark-datasource_xxx.jar \ example.py
次のコマンドを実行して、コードをローカルモードでコミットして実行します。
cd $SPARK_HOME ./bin/spark-submit --master local[4] \ --driver-class-path cupid/odps-spark-datasource_xxx.jar \ /path/to/odps-spark-examples/spark-examples/src/main/python/spark_sql.py
説明Sparkがローカルモードで実行される場合、MaxComputeテーブルへのアクセスにはMaxCompute Tunnelが必要です。
Sparkをローカルモードで実行する場合は、-- jarオプションの代わりに -- driver-class-pathオプションを使用する必要があります。
Spark 2.4でSpark SQLアプリケーションを開発する
次のサンプルコードに例を示します。 オンプレミスのマシンでPythonプロジェクトを作成し、Pythonプロジェクトをパッケージ化する必要があります。
spark-test.py
# -*- coding: utf-8 -*- import os from pyspark.sql import SparkSession from mc.service.udf.udfs import udf_squared, udf_numpy def noop(x): import socket import sys host = socket.gethostname() + ' '.join(sys.path) + ' '.join(os.environ) print('host: ' + host) print('PYTHONPATH: ' + os.environ['PYTHONPATH']) print('PWD: ' + os.environ['PWD']) print(os.listdir('.')) return host if __name__ == '__main__': # When you perform local debugging, you must add the following code. When you run a MaxCompute job, you must delete the following code. If you do not delete the code, an error is reported. # .master("local[4]") \ spark = SparkSession \ .builder \ .appName("test_pyspark") \ .getOrCreate() sc = spark.sparkContext # Verify the current environment variables of the system. rdd = sc.parallelize(range(10), 2) hosts = rdd.map(noop).distinct().collect() print(hosts) # Verify user-defined functions (UDFs). # https://docs.databricks.com/spark/latest/spark-sql/udf-python.html# spark.udf.register("udf_squared", udf_squared) spark.udf.register("udf_numpy", udf_numpy) tableName = "test_pyspark1" df = spark.sql("""select id, udf_squared(age) age1, udf_squared(age) age2, udf_numpy() udf_numpy from %s """ % tableName) print("rdf count, %s\n" % df.count()) df.show()
udfs.py
# -*- coding: utf-8 -*- import numpy as np def udf_squared(s): """ spark udf :param s: :return: """ if s is None: return 0 return s * s def udf_numpy(): rand = np.random.randn() return rand if __name__ == "__main__": print(udf_numpy())
コードをコミットして実行します。
Sparkクライアントの使用
Sparkクライアントの設定を構成します。
Sparkクライアントの設定を構成します。
Linux開発環境を設定する方法の詳細については、「Linux開発環境の設定」をご参照ください。
Windows開発環境を構成する方法の詳細については、「Windows開発環境の設定」をご参照ください。
共有リソース用の次のパラメーターを、Sparkクライアントの
conf
フォルダー内のspark-defaults.confファイルに追加します。spark.hadoop.odps.cupid.resources = public.python-2.7.13-ucs4.tar.gz spark.pyspark.python = ./public.python-2.7.13-ucs4.tar.gz/python-2.7.13-ucs4/bin/python
説明上記のパラメーターは、Pythonパッケージのディレクトリを指定します。 ダウンロードするPythonパッケージまたは共有リソースパッケージを使用することができます。
コードをコミットして実行します。
# mc_pyspark-0.1.0-py3-none-any.zip is a file that contains the common business logic code. spark-submit --py-files mc_pyspark-0.1.0-py3-none-any.zip spark-test.py
説明ダウンロードしたサードパーティの依存関係パッケージをインポートできない場合、エラーメッセージ
ImportError: cannot import name _distributor_init
が表示されます。 共有リソースパッケージを使用することを推奨します。 詳細については、「PySpark Pythonのバージョンとサポートされている依存関係」をご参照ください。
DataWorks ODPS Sparkノードの使用
DataWorks ODPS Sparkノードを作成します。 詳細については、「MaxCompute Sparkタスクの開発」をご参照ください。
コードをコミットして実行します。
次の表に、DataWorksコンソールでODPS Sparkノードを作成するときに設定する必要があるパラメーターを示します。
パラメーター
値
Sparkバージョン
Spark2.x
言語
Python
主要なPythonリソース
spark_test.py
構成アイテム
-- Configure items for resource application. spark.executor.instances=3 spark.executor.cores=1 spark.executor.memory=4g spark.driver.cores=1 spark.driver.memory=4g -- spark.executorEnv.PYTHONPATH=. spark.yarn.appMasterEnv.PYTHONPATH=. -- Specify the resources to be referenced. spark.hadoop.odps.cupid.resources = public.python-2.7.13-ucs4.tar.gz spark.pyspark.python = ./public.python-2.7.13-ucs4.tar.gz/python-2.7.13-ucs4/bin/python
Pythonリソース
mc_pyspark-0.1.0-py3-none-any.zip
リソースをアップロードします。
# Change the extension of the business logic code package to .zip. cp /Users/xxx/PycharmProjects/mc-pyspark/dist/mc_pyspark-0.1.0-py3-none-any.whl /Users/xxx/PycharmProjects/mc-pyspark/dist/mc_pyspark-0.1.0-py3-none-any.zip # Run the following command to upload the package to MaxCompute as a resource: # The `-f` directive will overwrite resources in the MaxCompute project that have the same name. Please confirm whether to overwrite or rename. add archive /Users/xxx/PycharmProjects/mc-pyspark/dist/mc_pyspark-0.1.0-py3-none-any.zip -f;
タスクを設定して実行します。
設定
実行
必要なパッケージのアップロード
MaxComputeクラスターでは、Pythonライブラリをインストールできません。 Spark on MaxComputeアプリケーションがPythonライブラリ、プラグイン、またはプロジェクトに依存している場合、必要なリソースをオンプレミスマシンにパッケージ化し、spark-submitスクリプトを実行してパッケージをMaxComputeにアップロードできます。 一部の特別なリソースでは、リソースのパッケージ化に使用するオンプレミスマシンのPythonバージョンは、アプリケーションが実行されるMaxComputeクラスターのPythonバージョンと同じである必要があります。 ビジネスの複雑さに基づいて、アプリケーションのリソースをパッケージ化するには、次のいずれかの方法を選択します。
パッケージなしでパブリックリソースを使用する
Python 2.7.13のパブリックリソースを使用します。
spark.hadoop.odps.cupid.resources = public.python-2.7.13-ucs4.tar.gz spark.pyspark.python = ./public.python-2.7.13-ucs4.tar.gz/python-2.7.13-ucs4/bin/python
次のサードパーティライブラリが利用可能です。
$./bin/pip list Package Version ----------------------------- ----------- absl-py 0.11.0 aenum 2.2.4 asn1crypto 0.23.0 astor 0.8.1 astroid 1.6.1 atomicwrites 1.4.0 attrs 20.3.0 backports.functools-lru-cache 1.6.1 backports.lzma 0.0.14 backports.weakref 1.0.post1 beautifulsoup4 4.9.3 bleach 2.1.2 boto 2.49.0 boto3 1.9.147 botocore 1.12.147 bz2file 0.98 cachetools 3.1.1 category-encoders 2.2.2 certifi 2019.9.11 cffi 1.11.2 click 6.7 click-plugins 1.1.1 cligj 0.7.0 cloudpickle 0.5.3 configparser 4.0.2 contextlib2 0.6.0.post1 cryptography 2.6.1 cssutils 1.0.2 cycler 0.10.0 Cython 0.29.5 dask 0.18.1 DBUtils 1.2 decorator 4.2.1 docutils 0.16 entrypoints 0.2.3 enum34 1.1.10 fake-useragent 0.1.11 Fiona 1.8.17 funcsigs 1.0.2 functools32 3.2.3.post2 future 0.16.0 futures 3.3.0 gast 0.2.2 gensim 3.8.3 geopandas 0.6.3 getpass3 1.2 google-auth 1.23.0 google-auth-oauthlib 0.4.1 google-pasta 0.2.0 grpcio 1.33.2 h5py 2.7.0 happybase 1.1.0 html5lib 1.0.1 idna 2.10 imbalanced-learn 0.4.3 imblearn 0.0 importlib-metadata 2.0.0 ipaddress 1.0.23 ipython-genutils 0.2.0 isort 4.3.4 itchat 1.3.10 itsdangerous 0.24 jedi 0.11.1 jieba 0.42.1 Jinja2 2.10 jmespath 0.10.0 jsonschema 2.6.0 kafka-python 1.4.6 kazoo 2.5.0 Keras-Applications 1.0.8 Keras-Preprocessing 1.1.2 kiwisolver 1.1.0 lazy-object-proxy 1.3.1 libarchive-c 2.8 lightgbm 2.3.1 lml 0.0.2 lxml 4.2.1 MarkupSafe 1.0 matplotlib 2.2.5 mccabe 0.6.1 missingno 0.4.2 mistune 0.8.3 mock 2.0.0 more-itertools 5.0.0 munch 2.5.0 nbconvert 5.3.1 nbformat 4.4.0 networkx 2.1 nose 1.3.7 numpy 1.16.1 oauthlib 3.1.0 opt-einsum 2.3.2 packaging 20.4 pandas 0.24.2 pandocfilters 1.4.2 parso 0.1.1 pathlib2 2.3.5 patsy 0.5.1 pbr 3.1.1 pexpect 4.4.0 phpserialize 1.3 pickleshare 0.7.4 Pillow 6.2.0 pip 20.2.4 pluggy 0.13.1 ply 3.11 prompt-toolkit 2.0.1 protobuf 3.6.1 psutil 5.4.3 psycopg2 2.8.6 ptyprocess 0.5.2 py 1.9.0 py4j 0.10.6 pyasn1 0.4.8 pyasn1-modules 0.2.8 pycosat 0.6.3 pycparser 2.18 pydot 1.4.1 Pygments 2.2.0 pykafka 2.8.0 pylint 1.8.2 pymongo 3.11.0 PyMySQL 0.10.1 pynliner 0.8.0 pyodps 0.9.3.1 pyOpenSSL 17.5.0 pyparsing 2.2.0 pypng 0.0.20 pyproj 2.2.2 PyQRCode 1.2.1 pytest 4.6.11 python-dateutil 2.8.1 pytz 2020.4 PyWavelets 0.5.2 PyYAML 3.12 redis 3.2.1 requests 2.25.0 requests-oauthlib 1.3.0 rope 0.10.7 rsa 4.5 ruamel.ordereddict 0.4.15 ruamel.yaml 0.11.14 s3transfer 0.2.0 scandir 1.10.0 scikit-image 0.14.0 scikit-learn 0.20.3 scipy 1.2.3 seaborn 0.9.1 Send2Trash 1.5.0 setuptools 41.0.0 Shapely 1.7.1 simplegeneric 0.8.1 singledispatch 3.4.0.3 six 1.15.0 sklearn2 0.0.13 smart-open 1.8.1 soupsieve 1.9.6 SQLAlchemy 1.3.20 statsmodels 0.11.0 subprocess32 3.5.4 tabulate 0.8.7 tensorflow 2.0.0 tensorflow-estimator 2.0.1 termcolor 1.1.0 testpath 0.3.1 thriftpy 0.3.9 timeout-decorator 0.4.1 toolz 0.9.0 tqdm 4.32.2 traitlets 4.3.2 urllib3 1.24.3 wcwidth 0.2.5 webencodings 0.5.1 Werkzeug 1.0.1 wheel 0.35.1 wrapt 1.11.1 xgboost 0.82 xlrd 1.2.0 XlsxWriter 1.0.7 zipp 1.2.0
Python 3.7.9のパブリックリソースを使用します。
spark.hadoop.odps.cupid.resources = public.python-3.7.9-ucs4.tar.gz spark.pyspark.python = ./public.python-3.7.9-ucs4.tar.gz/python-3.7.9-ucs4/bin/python3
次のサードパーティライブラリが利用可能です。
Package Version ----------------------------- ----------- appnope 0.1.0 asn1crypto 0.23.0 astroid 1.6.1 attrs 20.3.0 autopep8 1.3.4 backcall 0.2.0 backports.functools-lru-cache 1.5 backports.weakref 1.0rc1 beautifulsoup4 4.6.0 bidict 0.17.3 bleach 2.1.2 boto 2.49.0 boto3 1.9.147 botocore 1.12.147 bs4 0.0.1 bz2file 0.98 cached-property 1.5.2 cachetools 3.1.1 category-encoders 2.2.2 certifi 2019.11.28 cffi 1.11.2 click 6.7 click-plugins 1.1.1 cligj 0.7.0 cloudpickle 0.5.3 cryptography 2.6.1 cssutils 1.0.2 cycler 0.10.0 Cython 0.29.21 dask 0.18.1 DBUtils 1.2 decorator 4.2.1 docutils 0.16 entrypoints 0.2.3 fake-useragent 0.1.11 Fiona 1.8.17 future 0.16.0 gensim 3.8.3 geopandas 0.8.0 getpass3 1.2 h5py 3.1.0 happybase 1.1.0 html5lib 1.0.1 idna 2.10 imbalanced-learn 0.4.3 imblearn 0.0 importlib-metadata 2.0.0 iniconfig 1.1.1 ipykernel 5.3.4 ipython 7.19.0 ipython-genutils 0.2.0 isort 4.3.4 itchat 1.3.10 itsdangerous 0.24 jedi 0.11.1 jieba 0.42.1 Jinja2 2.10 jmespath 0.10.0 jsonschema 2.6.0 jupyter-client 6.1.7 jupyter-core 4.6.3 kafka-python 1.4.6 kazoo 2.5.0 kiwisolver 1.3.1 lazy-object-proxy 1.3.1 libarchive-c 2.8 lightgbm 2.3.1 lml 0.0.2 lxml 4.2.1 Mako 1.0.10 MarkupSafe 1.0 matplotlib 3.3.3 mccabe 0.6.1 missingno 0.4.2 mistune 0.8.3 mock 2.0.0 munch 2.5.0 nbconvert 5.3.1 nbformat 4.4.0 networkx 2.1 nose 1.3.7 numpy 1.19.4 packaging 20.4 pandas 1.1.4 pandocfilters 1.4.2 parso 0.1.1 patsy 0.5.1 pbr 3.1.1 pexpect 4.4.0 phpserialize 1.3 pickleshare 0.7.4 Pillow 6.2.0 pip 20.2.4 plotly 4.12.0 pluggy 0.13.1 ply 3.11 prompt-toolkit 2.0.1 protobuf 3.6.1 psutil 5.4.3 psycopg2 2.8.6 ptyprocess 0.5.2 py 1.9.0 py4j 0.10.6 pycodestyle 2.3.1 pycosat 0.6.3 pycparser 2.18 pydot 1.4.1 Pygments 2.2.0 pykafka 2.8.0 pylint 1.8.2 pymongo 3.11.0 PyMySQL 0.10.1 pynliner 0.8.0 pyodps 0.9.3.1 pyOpenSSL 17.5.0 pyparsing 2.2.0 pypng 0.0.20 pyproj 3.0.0.post1 PyQRCode 1.2.1 pytest 6.1.2 python-dateutil 2.8.1 pytz 2020.4 PyWavelets 0.5.2 PyYAML 3.12 pyzmq 17.0.0 qtconsole 4.3.1 redis 3.2.1 requests 2.25.0 retrying 1.3.3 rope 0.10.7 ruamel.yaml 0.16.12 ruamel.yaml.clib 0.2.2 s3transfer 0.2.0 scikit-image 0.14.0 scikit-learn 0.20.3 scipy 1.5.4 seaborn 0.11.0 Send2Trash 1.5.0 setuptools 41.0.0 Shapely 1.7.1 simplegeneric 0.8.1 six 1.15.0 sklearn2 0.0.13 smart-open 1.8.1 SQLAlchemy 1.3.20 statsmodels 0.12.1 tabulate 0.8.7 testpath 0.3.1 thriftpy 0.3.9 timeout-decorator 0.4.1 toml 0.10.2 toolz 0.9.0 tornado 6.1 tqdm 4.32.2 traitlets 4.3.2 urllib3 1.24.3 wcwidth 0.2.5 webencodings 0.5.1 wheel 0.35.1 wrapt 1.11.1 xgboost 1.2.1 xlrd 1.2.0 XlsxWriter 1.0.7 zipp 3.4.0
単一ホイールパッケージのアップロード
いくつかのPython依存関係が必要な場合は、ホイールパッケージを1つだけアップロードできます。 ほとんどの場合、manylinuxホイールパッケージがアップロードされます。 単一ホイールパッケージをアップロードするには、次の手順を実行します。
ホイールパッケージをZIPパッケージにパッケージ化します。 たとえば、pymysql.whlパッケージをpymysql.zipパッケージにパッケージ化します。
ZIPパッケージをアップロードし、Archiveのストレージクラスでパッケージを保存します。
DataWorksコンソールのSparkノードの設定タブでZIPパッケージを選択します。
コード内の環境変数を変更して、ZIPパッケージをインポートします。
sys.path.append('pymysql') import pymysql
requirements.txtファイルを使用する
多数の追加の依存関係が必要な場合は、ホイールパッケージをアップロードする手順を数回繰り返す必要があります。 この場合、スクリプトをダウンロードし、必要な依存関係をリストするrequirements.txtファイルを作成し、スクリプトとrequirements.txtファイルを使用してPython環境パッケージを生成できます。 次に、PySparkを使用してSpark on MaxComputeアプリケーションを開発できます。
使用法
$ chmod +x generate_env_pyspark.sh $ generate_env_pyspark.sh -h Usage: generate_env_pyspark.sh [-p] [-r] [-t] [-c] [-h] Description: -p ARG, the version of python, currently supports python 2.7, 3.5, 3.6 and 3.7 versions. -r ARG, the local path of your python requirements. -t ARG, the output directory of the gz compressed package. -c, clean mode, we will only package python according to your requirements, without other pre-provided dependencies. -h, display help of this script.
例
# Generate a Python environment package with preinstalled dependencies. $ generate_env_pyspark.sh -p 3.7 -r your_path_to_requirements -t your_output_directory # Generate a Python environment package in clean mode. This way, the package that you generate does not contain preinstalled dependencies. generate_env_pyspark.sh -p 3.7 -r your_path_to_requirements -t your_output_directory -c
ノート
このスクリプトは、macOSまたはLinuxオペレーティングシステムで実行できます。 スクリプトを使用するには、事前にDockerをインストールする必要があります。 Dockerのインストール方法の詳細については、「Dockerドキュメント」をご参照ください。
Python 2.7、Python 3.5、Python 3.6、およびPython 3.7のPythonバージョンがサポートされています。 Pythonバージョンに特別な要件がない場合は、Python 3.7を使用することを推奨します。
-c
オプションは、クリーンモードを有効にするかどうかを指定します。 クリーンモードでは、プリインストールされた依存関係をパッケージ化できません。 したがって、Pythonパッケージのサイズは小さくなります。 各Pythonバージョンの依存関係の詳細については、「Preinstalled dependencies of Python 2.7」、「Preinstalled dependencies of Python 3.5」、「Preinstalled dependencies of Python 3.6」、「Preinstalled dependencies of Python 3.7」をご参照ください。MaxComputeでは、最大サイズ500 MBのリソースパッケージをアップロードできます。 プリインストールされた依存関係がほとんど使用されない場合は、
-c
オプションを設定してリソースをクリーンモードでパッケージ化することを推奨します。
Sparkでのパッケージの使用
generate_env_pyspark.shスクリプトを使用して、指定されたパス内の指定されたPythonバージョンのtar.gzパッケージ。
-t
オプションはパスを指定し、-p
オプションはPythonのバージョンを指定します。 たとえば、Python 3.7を使用すると、py37.tar.gzパッケージが生成されます。 MaxComputeのArchiveのストレージクラスを使用して、パッケージをリソースとしてアップロードできます。 MaxComputeクライアントまたはMaxCompute SDKを使用してパッケージをアップロードできます。 リソース操作の詳細については、「リソース操作」をご参照ください。 MaxComputeクライアントを使用してpy37.tar.gzパッケージをアップロードするには、次の手順を実行します。MaxComputeクライアントで次のコマンドを実行して、パッケージをリソースとして追加します。
# The `-f` directive will overwrite resources in the MaxCompute project that have the same name. Please confirm whether to overwrite or rename. add archive /your/path/to/py37.tar.gz -f;
Sparkジョブの設定に次のパラメーター設定を追加します。
spark.hadoop.odps.cupid.resources = your_project.py37.tar.gz spark.pyspark.python = your_project.py37.tar.gz/bin/python
上記のパラメーター設定が有効にならない場合は、Sparkジョブの設定に次の設定を追加する必要があります。 たとえば、Apache Zeppelinを使用してPySparkをデバッグする場合は、次のPython環境設定をApache Zeppelinノートブックに追加する必要があります。
spark.yarn.appMasterEnv.PYTHONPATH = ./your_project.py37.tar.gz/bin/python spark.executorEnv.PYTHONPATH = ./your_project.py37.tar.gz/bin/python
Dockerコンテナの使用
この方法は、次のシナリオに適しています。
aをパッケージ化したい場合。ファイルの場合、「単一ホイールパッケージのアップロード」で説明されている方法を使用したり、
pip install
を実行したりすることはできません。使用するPythonバージョンは、Python 2.7、Python 3.5、Python 3.6、またはPython 3.7ではありません。
上記のシナリオでは、パッケージ化するPython環境が、Sparkジョブが実行されているPython環境と同じであることを確認する必要があります。 たとえば、macOSオペレーティングシステムにパッケージ化したPython環境は、Sparkジョブが実行されているPython環境と互換性がない場合があります。 Dockerコンテナを使用してPython 3.7環境をパッケージ化するには、次の手順を実行します。
DockerホストにDockerfileを作成します。
Python 3のサンプルコード:
FROM centos:7.6.1810 RUN set -ex \ # Pre-install the required components. && yum install -y wget tar libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make initscripts zip\ && wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz \ && tar -zxvf Python-3.7.0.tgz \ && cd Python-3.7.0 \ && ./configure prefix=/usr/local/python3 \ && make \ && make install \ && make clean \ && rm -rf /Python-3.7.0* \ && yum install -y epel-release \ && yum install -y python-pip # Set the default Python version to Python 3. RUN set -ex \ # Back up resources of Python 2.7. && mv /usr/bin/python /usr/bin/python27 \ && mv /usr/bin/pip /usr/bin/pip-python27 \ # Set the default Python version to Python 3. && ln -s /usr/local/python3/bin/python3.7 /usr/bin/python \ && ln -s /usr/local/python3/bin/pip3 /usr/bin/pip # Fix the YUM bug that is caused by the change in the Python version. RUN set -ex \ && sed -i "s#/usr/bin/python#/usr/bin/python27#" /usr/bin/yum \ && sed -i "s#/usr/bin/python#/usr/bin/python27#" /usr/libexec/urlgrabber-ext-down \ && yum install -y deltarpm # Update the pip version. RUN pip install --upgrade pip
Python 2のサンプルコード:
FROM centos:7.6.1810 RUN set -ex \ # Pre-install the required components. && yum install -y wget tar libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make initscripts zip\ && wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz \ && tar -zxvf Python-2.7.18.tgz \ && cd Python-2.7.18 \ && ./configure prefix=/usr/local/python2 \ && make \ && make install \ && make clean \ && rm -rf /Python-2.7.18* # Set the default Python version. RUN set -ex \ && mv /usr/bin/python /usr/bin/python27 \ && ln -s /usr/local/python2/bin/python /usr/bin/python RUN set -ex \ && wget https://bootstrap.pypa.io/get-pip.py \ && python get-pip.py RUN set -ex \ && rm -rf /usr/bin/pip \ && ln -s /usr/local/python2/bin/pip /usr/bin/pip # Fix the YUM bug that is caused by the change in the Python version. RUN set -ex \ && sed -i "s#/usr/bin/python#/usr/bin/python27#" /usr/bin/yum \ && sed -i "s#/usr/bin/python#/usr/bin/python27#" /usr/libexec/urlgrabber-ext-down \ && yum install -y deltarpm # Update the pip version. RUN pip install --upgrade pip
イメージを構築し、Dockerコンテナを実行します。
# Run the following commands in the path in which the Dockerfile is stored: docker build -t python-centos:3.7 docker run -itd --name python3.7 python-centos:3.7
必要なPythonライブラリをコンテナにインストールします。
docker attach python3.7 pip install [Required library]
すべてのPythonライブラリをパッケージに圧縮します。
cd /usr/local/ zip -r python3.7.zip python3/
Python環境パッケージをコンテナからホストにコピーします。
# Exit the container. ctrl+P+Q # Run the following command on the host: docker cp python3.7:/usr/local/python3.7.zip
Python3.7.zipパッケージをMaxComputeリソースとしてアップロードします。 DataWorksを使用して、最大サイズ50 MBのパッケージをアップロードできます。 パッケージのサイズが50 MBを超える場合、MaxComputeクライアントを使用してパッケージをアップロードし、Archiveのストレージクラスでパッケージを保存できます。 リソースのアップロード方法の詳細については、「リソースの追加」をご参照ください。
# The `-f` directive will overwrite resources in the MaxCompute project that have the same name. Please confirm whether to overwrite or rename. add archive /path/to/python3.7.zip -f;
ジョブを送信するときは、spark-defaults.confファイルまたはDataWorks設定に次の設定を追加するだけです。
spark.hadoop.odps.cupid.resources=[Project name].python3.7.zip spark.pyspark.python=./[Project name].python3.7.zip/python3/bin/python3.7
説明Dockerコンテナにリソースをパッケージ化するときは、手動で の場合は、Python環境でパッケージ化します。パッケージが見つかりません。 ほとんどの場合、。そうパッケージは容器で見つけることができます。 このパッケージを見つけたら、次の環境変数をSparkジョブの設定に追加します。
spark.executorEnv.LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./[Project name].python3.7.zip/python3/[Directory of the .so package] spark.yarn.appMasterEnv.LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./[Project name].python3.7.zip/python3/[Directory of the .so package]
カスタムPythonパッケージの参照
ほとんどの場合、カスタムPythonファイルを使用する必要があります。 複数の '.py' ファイルを順次アップロードすることによるワークロードを防ぐには、次の手順に従ってこれらのファイルをパッケージ化します。
__init__.pyという名前の空のファイルを作成し、コードをZIPパッケージにパッケージ化します。
ZIPパッケージをMaxComputeリソースとしてアップロードし、パッケージの名前を変更します。 このパッケージは作業ディレクトリに解凍されます。
説明MaxComputeにアップロードできるリソースの種類の詳細については、「リソース」をご参照ください。
パラメーター
spark.exe cutorEnv.PYTHONPATH=
を設定します。spark.exe cutorEnv.PYTHONPATH=で指定されたパスにメインのPythonファイルをインポートします。