全部产品
Search
文档中心

:Mengembangkan aplikasi Spark di MaxCompute menggunakan PySpark

更新时间:Jul 02, 2025

Topik ini menjelaskan cara mengembangkan aplikasi Spark di MaxCompute menggunakan PySpark.

Untuk mengakses tabel MaxCompute dalam aplikasi Anda, Anda harus mengkompilasi paket odps-spark-datasource. Untuk informasi lebih lanjut, lihat Menyiapkan lingkungan pengembangan Linux.

Mengembangkan aplikasi Spark SQL di Spark 1.6

Kode contoh:

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

Jalankan perintah berikut untuk mengirim dan menjalankan kode:

./bin/spark-submit \
--jars cupid/odps-spark-datasource_xxx.jar \
example.py

Mengembangkan aplikasi Spark SQL di Spark 2.3

Kode contoh:

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

Kirim dan jalankan kode.

  • Jalankan perintah berikut untuk mengirim dan menjalankan kode dalam mode kluster:

    spark-submit --master yarn-cluster \
    --jars cupid/odps-spark-datasource_xxx.jar \
    example.py
  • Jalankan perintah berikut untuk mengirim dan menjalankan kode dalam mode lokal:

    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
    Catatan
    • Jika Spark berjalan dalam mode lokal, MaxCompute Tunnel diperlukan untuk mengakses tabel MaxCompute.

    • Jika Spark berjalan dalam mode lokal, gunakan opsi --driver-class-path alih-alih opsi --jars.

Mengembangkan aplikasi Spark SQL di Spark 2.4

Kode contoh berikut memberikan sebuah contoh. Buat proyek Python pada mesin lokal Anda dan paketkan proyek tersebut.

  • 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__':
    
        # Saat melakukan debugging lokal, Anda harus menambahkan kode berikut. Saat menjalankan pekerjaan MaxCompute, Anda harus menghapus kode berikut. Jika tidak menghapus kode, kesalahan akan dilaporkan.
        # .master("local[4]") \
        spark = SparkSession \
            .builder \
            .appName("test_pyspark") \
            .getOrCreate()
    
        sc = spark.sparkContext
        # Verifikasi variabel lingkungan sistem saat ini.
        rdd = sc.parallelize(range(10), 2)
        hosts = rdd.map(noop).distinct().collect()
        print(hosts)
    
        # Verifikasi fungsi yang ditentukan pengguna (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())
                    

Kirim dan jalankan kode.

  • Gunakan klien Spark

    1. Konfigurasikan pengaturan pada klien Spark.

      • Konfigurasikan pengaturan pada klien Spark.

      • Tambahkan parameter berikut untuk sumber daya bersama ke file spark-defaults.conf di folder conf klien Spark:

        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
        Catatan

        Parameter sebelumnya menentukan direktori paket Python. Anda dapat memilih untuk menggunakan paket Python yang diunduh atau paket sumber daya bersama.

    2. Kirim dan jalankan kode.

      # mc_pyspark-0.1.0-py3-none-any.zip adalah file yang berisi kode logika bisnis umum.
      spark-submit --py-files mc_pyspark-0.1.0-py3-none-any.zip spark-test.py
      Catatan

      Jika paket dependensi pihak ketiga yang diunduh tidak dapat diimpor, pesan kesalahan ImportError: cannot import name _distributor_init muncul. Kami sarankan Anda menggunakan paket sumber daya bersama. Untuk informasi lebih lanjut, lihat Versi Python PySpark dan dependensi yang didukung.

  • Gunakan node ODPS Spark DataWorks

    1. Buat node ODPS Spark DataWorks. Untuk informasi lebih lanjut, lihat Mengembangkan tugas MaxCompute Spark.

    2. Kirim dan jalankan kode.

      Tabel berikut menjelaskan parameter yang perlu Anda konfigurasikan saat membuat node ODPS Spark di konsol DataWorks.

      Parameter

      Nilai

      Versi Spark

      Spark2.x

      Bahasa

      Python

      Sumber Daya Utama Python

      spark_test.py

      Item Konfigurasi

      -- Item konfigurasi untuk permintaan sumber daya.
      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=.
      -- Tentukan sumber daya yang akan dirujuk.
      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

      Sumber Daya Python

      mc_pyspark-0.1.0-py3-none-any.zip

    3. Unggah sumber daya.

      # Ubah ekstensi paket kode logika bisnis menjadi .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
      # Jalankan perintah berikut untuk mengunggah paket ke MaxCompute sebagai sumber daya:
      # Direktif `-f` akan menimpa sumber daya dalam proyek MaxCompute yang memiliki nama yang sama. Harap konfirmasi apakah akan menimpa atau mengganti nama.
      add archive /Users/xxx/PycharmProjects/mc-pyspark/dist/mc_pyspark-0.1.0-py3-none-any.zip -f;
    4. Konfigurasikan dan jalankan tugas.

      • Konfigurasi任务配置与执行

      • Eksekusi执行

Unggah paket yang diperlukan

Cluster MaxCompute tidak mengizinkan instalasi pustaka Python. Jika aplikasi Spark di MaxCompute bergantung pada pustaka Python, plugin, atau proyek, Anda dapat memaketkan sumber daya yang diperlukan di mesin lokal dan menjalankan skrip spark-submit untuk mengunggah paket ke MaxCompute. Untuk beberapa sumber daya khusus, versi Python di mesin lokal yang digunakan untuk memaketkan sumber daya harus sama dengan versi Python di cluster MaxCompute tempat aplikasi berjalan. Pilih salah satu metode berikut untuk memaketkan sumber daya sesuai kompleksitas bisnis Anda.

  • Gunakan sumber daya publik tanpa pemaketan

    • Gunakan sumber daya publik untuk 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

      Pustaka pihak ketiga berikut tersedia:

      $./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
    • Gunakan sumber daya publik untuk 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

      Pustaka pihak ketiga berikut tersedia:

      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                          1.2.0
  • Unggah paket wheel tunggal

    Jika beberapa dependensi Python diperlukan, Anda hanya dapat mengunggah satu paket wheel. Dalam kebanyakan kasus, paket wheel manylinux yang diunggah. Untuk mengunggah paket wheel tunggal, lakukan langkah-langkah berikut:

    1. Kemas paket wheel menjadi paket ZIP. Sebagai contoh, kemas paket pymysql.whl menjadi paket pymysql.zip.

    2. Unggah paket ZIP dan simpan paket tersebut dengan kelas penyimpanan Archive.

    3. Pilih paket ZIP pada tab konfigurasi node Spark di konsol DataWorks.

    4. Ubah variabel lingkungan dalam kode untuk mengimpor paket ZIP.

      sys.path.append('pymysql')
      import pymysql
  • Gunakan file requirements.txt

    Jika sejumlah besar dependensi tambahan diperlukan, Anda harus mengulangi prosedur untuk mengunggah paket wheel beberapa kali. Dalam hal ini, Anda dapat mengunduh skrip dan membuat file requirements.txt yang mencantumkan dependensi yang diperlukan dan menggunakan skrip dan file requirements.txt untuk menghasilkan paket lingkungan Python. Kemudian, Anda dapat mengembangkan aplikasi Spark di MaxCompute menggunakan PySpark.

    • Penggunaan

      $ chmod +x generate_env_pyspark.sh
      $ generate_env_pyspark.sh -h
      Penggunaan:
      generate_env_pyspark.sh [-p] [-r] [-t] [-c] [-h]
      Deskripsi:
      -p ARG, versi python, saat ini mendukung versi python 2.7, 3.5, 3.6 dan 3.7.
      -r ARG, jalur lokal dari persyaratan python Anda.
      -t ARG, direktori keluaran paket terkompresi gz.
      -c, mode bersih, kami hanya akan memaketkan python sesuai dengan persyaratan Anda, tanpa dependensi lain yang disediakan sebelumnya.
      -h, tampilkan bantuan skrip ini.
    • Contoh

      # Hasilkan paket lingkungan Python dengan dependensi yang telah diinstal sebelumnya.
      $ generate_env_pyspark.sh -p 3.7 -r your_path_to_requirements -t your_output_directory
      
      # Hasilkan paket lingkungan Python dalam mode bersih. Dengan cara ini, paket yang Anda hasilkan tidak berisi dependensi yang telah diinstal sebelumnya.
      generate_env_pyspark.sh -p 3.7 -r your_path_to_requirements -t your_output_directory -c
    • Catatan

    • Gunakan paket dalam Spark

      Anda dapat menggunakan skrip generate_env_pyspark.sh untuk menghasilkan paket .tar.gz dari versi Python tertentu di jalur tertentu. Opsi -t menentukan jalur, dan opsi -p menentukan versi Python. Sebagai contoh, jika Python 3.7 digunakan, paket py37.tar.gz dihasilkan. Anda dapat mengunggah paket tersebut sebagai sumber daya dengan kelas penyimpanan Archive di MaxCompute. Anda dapat mengunggah paket tersebut menggunakan klien MaxCompute atau SDK MaxCompute. Untuk informasi lebih lanjut tentang operasi sumber daya, lihat Operasi sumber daya. Untuk menggunakan klien MaxCompute untuk mengunggah paket py37.tar.gz, lakukan langkah-langkah berikut:

      1. Jalankan perintah berikut pada klien MaxCompute untuk menambahkan paket sebagai sumber daya:

        # Direktif `-f` akan menimpa sumber daya dalam proyek MaxCompute yang memiliki nama yang sama. Harap konfirmasi apakah akan menimpa atau mengganti nama.
        add archive /your/path/to/py37.tar.gz -f;
      2. Tambahkan pengaturan parameter berikut ke konfigurasi pekerjaan Spark Anda:

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

        Jika pengaturan parameter di atas tidak berlaku, Anda harus menambahkan konfigurasi berikut ke konfigurasi pekerjaan Spark Anda. Sebagai contoh, jika Anda menggunakan Apache Zeppelin untuk men-debug PySpark, Anda harus menambahkan konfigurasi lingkungan Python berikut ke notebook Apache Zeppelin.

        spark.yarn.appMasterEnv.PYTHONPATH = ./your_project.py37.tar.gz/bin/python
        spark.executorEnv.PYTHONPATH = ./your_project.py37.tar.gz/bin/python
  • Gunakan kontainer Docker

    Metode ini cocok untuk skenario berikut:

    • Jika Anda ingin memaketkan file .so, Anda tidak dapat menggunakan metode yang dijelaskan dalam "Unggah paket wheel tunggal" atau menjalankan pip install.

    • Versi Python yang Anda gunakan bukan Python 2.7, Python 3.5, Python 3.6, atau Python 3.7.

    Dalam skenario di atas, Anda harus memastikan bahwa lingkungan Python yang Anda paketkan sama dengan lingkungan Python tempat pekerjaan Spark Anda berjalan. Sebagai contoh, lingkungan Python yang Anda paketkan dalam sistem operasi macOS mungkin tidak kompatibel dengan lingkungan Python tempat pekerjaan Spark Anda berjalan. Untuk memaketkan lingkungan Python 3.7 menggunakan kontainer Docker, lakukan langkah-langkah berikut:

    1. Buat Dockerfile di host Docker Anda.

      • Kode contoh dalam Python 3:

        FROM centos:7.6.1810
        RUN set -ex \
            # Pra-instal komponen yang diperlukan.
            && 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
        # Tetapkan versi Python default ke Python 3.
        RUN set -ex \
            # Cadangkan sumber daya Python 2.7.
            && mv /usr/bin/python /usr/bin/python27 \
            && mv /usr/bin/pip /usr/bin/pip-python27 \
            # Tetapkan versi Python default ke Python 3.
            && ln -s /usr/local/python3/bin/python3.7 /usr/bin/python \
            && ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
        # Perbaiki bug YUM yang disebabkan oleh perubahan versi Python.
        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
        # Perbarui versi pip.
        RUN pip install --upgrade pip
      • Kode contoh dalam Python 2:

        FROM centos:7.6.1810
        RUN set -ex \
            # Pra-instal komponen yang diperlukan.
            && 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*
        # Tetapkan versi Python default.
        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
        # Perbaiki bug YUM yang disebabkan oleh perubahan versi Python.
        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
        # Perbarui versi pip.
        RUN pip install --upgrade pip
                                                    
    2. Bangun gambar dan jalankan kontainer Docker.

      # Jalankan perintah berikut di jalur tempat Dockerfile disimpan: 
      docker build -t python-centos:3.7 
      docker run -itd --name python3.7 python-centos:3.7
    3. Instal pustaka Python yang diperlukan di dalam kontainer.

      docker attach python3.7
      pip install [Pustaka yang diperlukan]
    4. Kompres semua pustaka Python menjadi satu paket.

      cd /usr/local/
      zip -r python3.7.zip python3/
    5. Salin paket lingkungan Python dari kontainer ke host Anda.

      # Keluar dari kontainer.
      ctrl+P+Q
      # Jalankan perintah berikut di host: 
      docker cp python3.7:/usr/local/python3.7.zip 
    6. Unggah paket Python3.7.zip sebagai sumber daya MaxCompute. Anda dapat menggunakan DataWorks untuk mengunggah paket dengan ukuran maksimum 50 MB. Jika ukuran paket melebihi 50 MB, Anda dapat menggunakan klien MaxCompute untuk mengunggah paket dan menyimpan paket dengan kelas penyimpanan Archive. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya, lihat Tambahkan sumber daya.

      # Direktif `-f` akan menimpa sumber daya dalam proyek MaxCompute yang memiliki nama yang sama. Harap konfirmasi apakah akan menimpa atau mengganti nama.
      add archive /path/to/python3.7.zip -f;
    7. Saat Anda mengirim pekerjaan, tambahkan konfigurasi berikut ke file spark-defaults.conf atau konfigurasi DataWorks:

      spark.hadoop.odps.cupid.resources=[Nama proyek].python3.7.zip
      spark.pyspark.python=./[Nama proyek].python3.7.zip/python3/bin/python3.7
      Catatan

      Saat memaketkan sumber daya dalam kontainer Docker, Anda harus secara manual menempatkan paket .so di lingkungan Python jika paket .so tidak ditemukan. Dalam kebanyakan kasus, paket .so dapat ditemukan di dalam kontainer. Setelah Anda menemukan paket ini, tambahkan variabel lingkungan berikut ke konfigurasi pekerjaan Spark Anda:

      spark.executorEnv.LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./[Nama proyek].python3.7.zip/python3/[Direktori paket .so]
      spark.yarn.appMasterEnv.LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./[Nama proyek].python3.7.zip/python3/[Direktori paket .so]
  • Rujuk paket Python kustom

    Dalam kebanyakan kasus, Anda akan perlu menggunakan file Python kustom. Untuk mencegah beban kerja yang disebabkan oleh pengunggahan berurutan beberapa file '.py', Anda dapat memaketkan file-file ini dengan mengikuti langkah-langkah berikut:

    1. Buat file kosong bernama __init__.py dan kemas kode menjadi paket ZIP.

    2. Unggah paket ZIP sebagai sumber daya MaxCompute dan ubah nama paket. Paket ini diekstraksi ke direktori kerja.

      Catatan

      Untuk informasi lebih lanjut tentang jenis sumber daya yang dapat Anda unggah ke MaxCompute, lihat Sumber Daya.

    3. Konfigurasikan parameter spark.executorEnv.PYTHONPATH=.

    4. Impor file Python utama ke jalur yang ditentukan oleh spark.executorEnv.PYTHONPATH=.