

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 Python 库与 EMR Serverless 结合使用
<a name="using-python-libraries"></a>

在 Amazon EMR 无服务器应用程序上运行 PySpark 作业时，请将各种 Python 库打包为依赖项。为此，请使用原生 Python 功能，构建虚拟环境，或者直接将 PySpark 作业配置为使用 Python 库。本页涵盖了每种方法。

## 使用 Python 原生功能
<a name="using-native-python-features"></a>

设置以下配置时，使用 PySpark 将 Python 文件 (`.py`)、压缩的 Python 包 (`.zip`) 和 Egg 文件 (`.egg`) 上传到 Spark 执行器。

```
--conf spark.submit.pyFiles=s3://amzn-s3-demo-bucket/EXAMPLE-PREFIX/<.py|.egg|.zip file>
```

有关如何使用 Python 虚拟环境执行 PySpark 作业的更多详细信息，请参阅[使用 PySpark 原生功能](https://spark.apache.org/docs/latest/api/python/tutorial/python_packaging.html#using-pyspark-native-features)。

使用 EMR Notebook 时，您可以通过执行以下代码来使 Python 依赖项在 Notebook 中可用：

```
    %%configure -f
 {
    "conf": {
    "spark.submit.pyFiles":"s3:///amzn-s3-demo-bucket/EXAMPLE-PREFIX/<.py|.egg|.zip file>
                   }
 }
```

## 构建 Python 虚拟环境
<a name="building-python-virtual-env"></a>

要为一项 PySpark 作业打包多个 Python 库，请创建隔离的 Python 虚拟环境。

1. 要构建 Python 虚拟环境，请使用以下命令。所示示例将 `scipy` 和 `matplotlib` 包安装到虚拟环境包中，并将存档复制到 Amazon S3 位置。
**重要**  
您必须在类似的 Amazon Linux 2 环境中运行以下命令，并使用与 EMR Serverless 中所用版本相同的 Python，即适用于 Amazon EMR 6.6.0 的 Python 3.7.10。你可以在 [EMR](https://github.com/aws-samples/emr-serverless-samples/tree/main/examples/pyspark/dependencies) 无服务器示例存储库中找到 Dockerfile 示例。 GitHub 

   ```
   # initialize a python virtual environment
   python3 -m venv pyspark_venvsource
   source pyspark_venvsource/bin/activate
   
   # optionally, ensure pip is up-to-date
   pip3 install --upgrade pip
   
   # install the python packages
   pip3 install scipy
   pip3 install matplotlib
   
   # package the virtual environment into an archive
   pip3 install venv-pack
   venv-pack -f -o pyspark_venv.tar.gz
   
   # copy the archive to an S3 location
   aws s3 cp pyspark_venv.tar.gz s3://amzn-s3-demo-bucket/EXAMPLE-PREFIX/
   
   # optionally, remove the virtual environment directory
   rm -fr pyspark_venvsource
   ```

1. 提交 Spark 作业，并将属性设置为使用 Python 虚拟环境。

   ```
   --conf spark.archives=s3://amzn-s3-demo-bucket/EXAMPLE-PREFIX/pyspark_venv.tar.gz#environment 
   --conf spark.emr-serverless.driverEnv.PYSPARK_DRIVER_PYTHON=./environment/bin/python
   --conf spark.emr-serverless.driverEnv.PYSPARK_PYTHON=./environment/bin/python 
   --conf spark.executorEnv.PYSPARK_PYTHON=./environment/bin/python
   ```

   请注意，如果不覆盖原始 Python 二进制文件，前面设置序列中的第二个配置将是 `--conf spark.executorEnv.PYSPARK_PYTHON=python`。

   有关如何使用 Python 虚拟环境进行 PySpark 作业的更多信息，请参阅[使用 Virtualenv](https://spark.apache.org/docs/latest/api/python/tutorial/python_packaging.html#using-virtualenv)。有关如何提交 Spark 作业的更多示例，请参阅[运行 EMR Serverless 作业时使用 Spark 配置](jobs-spark.md)。

## 将 PySpark 作业配置为使用 Python 库
<a name="configuring-pyspark-jobs"></a>

在 Amazon EMR 6.12.0 及更高版本中，您可以直接将 EMR 无服务器 PySpark作业配置为使用流行的数据科学 Python 库，例如 p [andas](https://pandas.pydata.org/docs/user_guide/index.html)，无需任何其他设置。[NumPy[PyArrow](https://arrow.apache.org/docs/python/index.html)](https://numpy.org/doc/stable/user/index.html)

以下示例演示如何为 PySpark作业打包每个 Python 库。

------
#### [ NumPy ]

NumPy 是一个用于科学计算的 Python 库，它为数学、排序、随机模拟和基本统计提供多维数组和运算。要使用 NumPy，请运行以下命令：

```
import numpy
```

------
#### [ pandas ]

pandas 是一个基于它的 Python 库。 NumPy熊猫图书馆为数据科学家提供了[DataFrame](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html)数据结构和数据分析工具。要使用 pandas，请运行以下命令：

```
import pandas
```

------
#### [ PyArrow ]

PyArrow 是一个 Python 库，用于管理内存中的列式数据以提高工作性能。 PyArrow 基于 Apache Arrow 跨语言开发规范，这是一种以列式格式表示和交换数据的标准方法。要使用 PyArrow，请运行以下命令：

```
import pyarrow
```

------