全部產品
Search
文件中心

MaxCompute:PySpark開發樣本

更新時間:Jun 19, 2024

本文為您介紹PySpark開發樣本。

如果要訪問MaxCompute表,則需要編譯datasource包,詳細步驟請參見搭建Linux開發環境

SparkSQL應用樣本(Spark1.6)

詳細代碼

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

SparkSQL應用樣本(Spark2.3)

詳細代碼

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()

提交運行

  • Cluster模式提交運行

    spark-submit --master yarn-cluster \
    --jars cupid/odps-spark-datasource_xxx.jar \
    example.py
  • Local模式運行

    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
    說明
    • Local模式訪問表需要依賴Tunnel。

    • Local模式要用--driver-class-path而非--jars

Spark SQL應用樣本(Spark2.4)

相關代碼

  • 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__':
    
        # 本地調試時添加,MaxCompute運行時需要刪除,否則會報錯
        # .master("local[4]") \
        spark = SparkSession \
            .builder \
            .appName("test_pyspark") \
            .getOrCreate()
    
        sc = spark.sparkContext
        # 驗證系統當前環境變數
        rdd = sc.parallelize(range(10), 2)
        hosts = rdd.map(noop).distinct().collect()
        print(hosts)
    
        # 驗證UDF
        # 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用戶端提交

    1. Spark用戶端配置。

      • 配置Spark用戶端。

      • 在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包或者直接採用公用資源。

    2. 提交運行。

      # mc_pyspark-0.1.0-py3-none-any.zip為通用商務邏輯代碼
      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 Spark節點提交。

    1. 建立Spark節點:建立方式請參考開發ODPS Spark任務

    2. 提交運行。

      在DataWorks的ODPS Spark節點配置以下參數:

      參數名

      配置詳情

      spark版本

      Spark2.x

      語言

      Python

      選擇主python資源

      spark_test.py

      配置項

      -- 資源申請相關配置
      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=.
      -- 指定需要引用的資源
      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

    3. 資源上傳。

      # 修改商務邏輯程式碼封裝的尾碼名為.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
      # 在ODPSCMD添加到MaxCompute資源中
      add archive /Users/xxx/PycharmProjects/mc-pyspark/dist/mc_pyspark-0.1.0-py3-none-any.zip -f;
    4. 任務配置與執行。

      • 配置任務配置與執行

      • 執行執行

Package依賴

由於MaxCompute叢集無法自由安裝Python庫,PySpark依賴其它Python庫、外掛程式、專案時,通常需要在本地打包後通過Spark-submit上傳。對於特定依賴,打包環境需與線上環境保持一致。打包方式如下,請根據業務的複雜度進行選擇:

  • 不打包直接採用公用資源

    • 預設提供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
  • 上傳單個WHEEL包

    如果依賴較為簡單,則可以只上傳單個WHEEL包,通常需要選用manylinux版本。使用方式如下:

    1. 將WHEEL包重新命名為ZIP包,例如將pymysql的WHEEL包重新命名為pymysql.zip。

    2. 將重新命名後的ZIP包上傳,檔案類型為ARCHIVE。

    3. 在DataWorks Spark節點引用,檔案類型為ARCHIVE。

    4. 在代碼中修改環境變數後即可匯入。

      sys.path.append('pymysql')
      import pymysql
  • 利用指令碼一鍵打包

    若需要的額外依賴較多,上傳單個WHEEL包會導致重複操作量倍增。您可以下載指令碼,只需提供一個編輯好的requirements檔案,就能夠直接產生完整的Python環境用於PySpark使用,具體如下。

    • 使用

      $ 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_env_pyspark.sh -p 3.7 -r your_path_to_requirements -t your_output_directory
      
      # 不帶預裝依賴的打包方式(clean mode)
      generate_env_pyspark.sh -p 3.7 -r your_path_to_requirements -t your_output_directory -c
    • 說明

      • 指令碼適用於Mac或Linux環境,需要預先安裝Docker,安裝指導請參見Docker協助文檔

      • 目前僅支援Python 2.7、3.5、3.6和3.7版本,如果對Python版本不敏感,推薦使用Python 3.7。

      • -c選項表示是否開啟clean mode。clean mode無法使用預裝依賴,但輸出的Python包更小。各版本的依賴請參見Python 2.7預裝依賴Python 3.5預裝依賴Python 3.6預裝依賴Python 3.7預裝依賴

      • 當前MaxCompute對上傳資源的大小有500 MB的限制,因此如果大部分預裝依賴用不到,推薦使用-c選項打包。

    • Spark中使用

      generate_env_pyspark.sh指令碼的輸出為在指定目錄下(-t選項)產生指定Python版本(-p選項)的GZ包。以Python3.7為例,將產生py37.tar.gz,後續再將此包上傳為ARCHIVE資源。您可以通過MaxCompute用戶端上傳,也可以使用odps-sdk上傳。各種資源操作,請參見資源操作。以MaxCompute用戶端為例,使用方式如下。

      1. 在MaxCompute用戶端中執行如下命令添加資源。

        add archive /your/path/to/py37.tar.gz -f;
      2. 在Spark配置中增加如下兩個參數。

        spark.hadoop.odps.cupid.resources = your_project.py37.tar.gz
        spark.pyspark.python = your_project.py37.tar.gz/bin/python

        若上述兩個參數不生效,還需在Spark作業中增加如下兩項配置。例如使用zeppelin調試Pyspark時,notebook中的Python環境配置。

        spark.yarn.appMasterEnv.PYTHONPATH = ./your_project.py37.tar.gz/bin/python
        spark.executorEnv.PYTHONPATH = ./your_project.py37.tar.gz/bin/python
  • 利用Docker容器打包Python環境

    該方式適用於如下情境:

    • 需要引入的依賴包含so檔案時,無法通過上述ZIP檔案的方式使用,無法進行pip install安裝。

    • 對除2.7、3.5、3.6、3.7以外的Python版本有特殊需求。

    針對以上特殊情況,同時保證打包環境與線上環境一致(Mac打出來的Python環境與線上環境存在相容性問題)。以Python3.7為例,基於Docker的打包步驟如下。

    1. 在安裝Docker環境的宿主機建立一個Dockerfile檔案。

      • Python 3樣本參考如下。

        FROM centos:7.6.1810
        RUN set -ex \
            # 預先安裝所需組件
            && 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
        # 設定預設為python3
        RUN set -ex \
            # 備份舊版本python
            && mv /usr/bin/python /usr/bin/python27 \
            && mv /usr/bin/pip /usr/bin/pip-python27 \
            # 配置預設為python3
            && ln -s /usr/local/python3/bin/python3.7 /usr/bin/python \
            && ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
        # 修複因修改python版本導致yum失效問題
        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
        # 更新pip版本
        RUN pip install --upgrade pip
      • Python 2樣本參考如下。

        FROM centos:7.6.1810
        RUN set -ex \
            # 預先安裝所需組件
            && 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*
        # 設定預設為python
        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
        # 修複因修改python版本導致yum失效問題
        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
        # 更新pip版本
        RUN pip install --upgrade pip
                                                    
    2. 構建鏡像並運行容器。

      # 在Dockerfile檔案的目錄下運行如下命令。
      docker build -t python-centos:3.7 
      docker run -itd --name python3.7 python-centos:3.7
    3. 進入容器安裝所需的Python依賴庫。

      docker attach python3.7
      pip install [所需依賴庫]
    4. 打包Python環境。

      cd /usr/local/
      zip -r python3.7.zip python3/
    5. 拷貝容器中的Python環境到宿主機。

      # 退出容器
      ctrl+P+Q
      # 在宿主機運行命令。
      docker cp python3.7:/usr/local/python3.7.zip 
    6. 上傳Python3.7.zip包為MaxCompute資源。DataWorks最大隻能上傳50 MB的包,如果大於50 MB可以通過MaxCompute用戶端上傳,檔案類型為ARCHIVE。上傳資源操作,請參見添加資源

      add archive /path/to/python3.7.zip -f;
    7. 提交作業時只需要在spark-default.conf或DataWorks配置項中添加以下配置即可。

      spark.hadoop.odps.cupid.resources=[project名稱].python3.7.zip
      spark.pyspark.python=./[project名].python3.7.zip/python3/bin/python3.7
      說明

      通過Docker容器打包,如果遇到so包找不到的情況,則需要手動將so包放到Python環境中。一般so包在容器中都能找到,並在Spark作業中添加以下環境變數。

      spark.executorEnv.LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./[project名].python3.7.zip/python3/[建立的so包目錄]
      spark.yarn.appMasterEnv.LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./[project名].python3.7.zip/python3/[建立的so包目錄]
  • 引用使用者自訂的Python包

    通常情況下,使用者需要使用自訂的Python檔案,可以打包提交,這樣避免了上傳多個".py"檔案,步驟如下:

    1. 將使用者代碼打包為ZIP包,需要在目錄下自訂一個空白的__init__.py。

    2. 將使用者代碼ZIP包以MaxCompute資源形式上傳,並重新命名,該資源在工作目錄中將會被解壓。

      說明

      MaxCompute支援上傳的資源類型請參考資源

    3. 配置參數spark.executorEnv.PYTHONPATH=

    4. 完成上述步驟,主Python檔案就可以匯入該目錄下的Python檔案。