<commit_before>---
layout: global
title: Apache Spark 使用 Alluxio
nickname: Apache Spark
group: Data Applications
priority: 0
---

该指南描述了如何配置 [Apache Spark](http://spark-project.org/) 来访问 Alluxio。

* 内容列表
{:toc}

## 概览

Spark 1.1 或更高版本的 Spark 应用程序可以通过其与 HDFS 兼容的接口直接访问 Alluxio 集群。
使用 Alluxio 作为数据访问层，Spark 应用程序可以透明地访问许多不同类型的持久化存储服务（例如，AWS S3 bucket、Azure Object Store buckets、远程部署的 HDFS 等）的数据，也可以透明地访问同一类型持久化存储服务不同实例中的数据。
为了加快 I/O 性能，用户可以主动获取数据到 Alluxio 中或将数据透明地缓存到 Alluxio 中。
这种做法尤其是在 Spark 部署位置与数据相距较远时特别有效。
此外，通过将计算和物理存储解耦，Alluxio 能够有助于简化系统架构。
当底层持久化存储中真实数据的路径对 Spark 隐藏时，对底层存储的更改可以独立于应用程序逻辑；同时，Alluxio 作为邻近计算的缓存，仍然可以给计算框架提供类似 Spark 数据本地性的特性。

## 前期准备

* 安装 Java 8 Update 60 或更高版本（8u60+）的 64 位 Java。
* 已经安装并运行 Alluxio。
  本指南假设底层持久存储为本地部署的 HDFS。例如，`${ALLUXIO_HOME}/conf/alluxio-site.properties`中包含`alluxio.master.mount.table.root.ufs=hdfs://localhost:9000/alluxio/`这一行。
  请注意，除了 HDFS，Alluxio 还支持许多其他底层存储系统。
  从任意数量的这些系统中访问数据与本指南的重点是垂直的，
  [统一和透明的名称空间]({{ '/cn/advanced/Namespace-Management.html' | relativize_url }})介绍了相关内容。
* 确保 Alluxio 客户端 jar 包是可用的。
  在从 Alluxio [下载页面](http://www.alluxio.org/download)下载的压缩包的`{{site.ALLUXIO_CLIENT_JAR_PATH}}`中，可以找到 Alluxio 客户端 jar 包。
  高级用户也可以从源代码编译该客户端 jar 包，可以参考[从源代码构建 Alluxio 的步骤]({{ '/cn/contributor/Building-Alluxio-From-Source.html' | relativize_url }})。

## 基础设置

将 Alluxio客户端 jar 包分发在运行 Spark driver 或 executor 的节点上。具体地说，将客户端 jar 包放在每个节点上的同一本地路径（例如`{{site.ALLUXIO_CLIENT_JAR_PATH}}`）。

将 Alluxio 客户端 jar 包添加到 Spark driver 和 executor 的 classpath 中，以便 Spark 应用程序能够使用客户端 jar 包在 Alluxio 中读取和写入文件。具体来说，在运行 Spark 的每个节点上，将以下几行添加到`spark/conf/spark-defaults.conf`中。

```bash
spark.driver.extraClassPath   {{site.ALLUXIO_CLIENT_JAR_PATH}}
spark.executor.extraClassPath {{site.ALLUXIO_CLIENT_JAR_PATH}}
```

## 示例：使用 Alluxio 作为输入和输出

本节介绍如何使用 Alluxio 作为 Spark 应用程序的输入和输出。

### 访问仅在Alluxio中的数据

将本地数据复制到 Alluxio 文件系统中。
假设你在 Alluxio 项目目录中，将`LICENSE`文件放入 Alluxio，运行：

```bash
bin/alluxio fs copyFromLocal LICENSE /Input
```

假设 Alluxio Master 运行在`localhost`上，在`spark-shell`中运行如下命令：

```scala
> val s = sc.textFile("alluxio://localhost:19998/Input")
> val double = s.map(line => line + line)
> double.saveAsTextFile("alluxio://localhost:19998/Output")
```

打开浏览器，查看 [http://localhost:19999/browse](http://localhost:19999/browse)。
应该存在一个输出目录`/Output`，其中包含了输入文件`Input`的双倍内容。

### 访问底层存储中的数据

给出准确路径后，Alluxio 支持透明地从底层存储系统中获取数据。
在本节中，使用 HDFS 作为分布式存储系统的示例。

将`Input_HDFS`文件放入到 HDFS 中：

```bash
hdfs dfs -put -f ${ALLUXIO_HOME}/LICENSE hdfs://localhost:9000/alluxio/Input_HDFS
```

请注意，Alluxio 并不知道该文件。你可以通过访问 Web UI 来验证这一点。
假设 Alluxio Master 运行在`localhost`上，在`spark-shell`中运行如下命令：

```scala
> val s = sc.textFile("alluxio://localhost:19998/Input_HDFS")
> val double = s.map(line => line + line)
> double.saveAsTextFile("alluxio://localhost:19998/Output_HDFS")
```

打开浏览器，查看 [http://localhost:19999/browse](http://localhost:19999/browse)。
应该存在一个输出目录`Output_HDFS`，其中包含了输入文件`Input_HDFS`的双倍内容。
同时，现在输入文件`Input_HDFS`会被 100% 地加载到 Alluxio 的文件系统空间。

## 高级设置

### 为所有 Spark 作业自定义 Alluxio 用户属性

让我们以设置 Spark 与 HA 模式的 Alluxio 服务进行通信为例。
如果你运行多个 Alluxio master，其中 Zookeeper 服务运行在`zkHost1:2181`、`zkHost2:2181`和`zkHost3:2181`，
将以下几行添加到`${SPARK_HOME}/conf/spark-defaults.conf`中：

```bash
spark.driver.extraJavaOptions   -Dalluxio.zookeeper.address=zkHost1:2181,zkHost2:2181,zkHost3:2181 -Dalluxio.zookeeper.enabled=true
spark.executor.extraJavaOptions -Dalluxio.zookeeper.address=zkHost1:2181,zkHost2:2181,zkHost3:2181 -Dalluxio.zookeeper.enabled=true
```

或者，你也可以在 Hadoop 配置文件`${SPARK_HOME}/conf/core-site.xml`中添加如下属性：

```xml
<configuration>
  <property>
    <name>alluxio.zookeeper.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>alluxio.zookeeper.address</name>
    <value>zkHost1:2181,zkHost2:2181,zkHost3:2181</value>
  </property>
</configuration>
```

在 Alluxio 1.8 （不包含 1.8）后，用户可以在 Alluxio URI 中编码 Zookeeper 服务地址（见[详细说明]({{ '/cn/deploy/Running-Alluxio-On-a-Cluster.html' | relativize_url })#ha-configuration-parameters）。
这样，就不需要为 Spark 配置额外设置。

### 为单个 Spark 作业自定义 Alluxio 用户属性

Spark 用户可以将 JVM 系统设置传递给 Spark 作业，通过将`"-Dproperty=value"`添加到`spark.executor.extraJavaOptions`来设置 Spark executor，将`"-Dproperty=value"`添加到`spark.driver.extraJavaOptions`中来设置 spark driver。例如，要在写入 Alluxio 时提交`CACHE_THROUGH`写模式的 Spark 作业，请执行以下操作：

```bash
spark-submit \
--conf 'spark.driver.extraJavaOptions=-Dalluxio.user.file.writetype.default=CACHE_THROUGH' \<commit_msg>[DOCFIX] Fix liquid syntax error<commit_after>---
layout: global
title: Apache Spark 使用 Alluxio
nickname: Apache Spark
group: Data Applications
priority: 0
---

该指南描述了如何配置 [Apache Spark](http://spark-project.org/) 来访问 Alluxio。

* 内容列表
{:toc}

## 概览

Spark 1.1 或更高版本的 Spark 应用程序可以通过其与 HDFS 兼容的接口直接访问 Alluxio 集群。
使用 Alluxio 作为数据访问层，Spark 应用程序可以透明地访问许多不同类型的持久化存储服务（例如，AWS S3 bucket、Azure Object Store buckets、远程部署的 HDFS 等）的数据，也可以透明地访问同一类型持久化存储服务不同实例中的数据。
为了加快 I/O 性能，用户可以主动获取数据到 Alluxio 中或将数据透明地缓存到 Alluxio 中。
这种做法尤其是在 Spark 部署位置与数据相距较远时特别有效。
此外，通过将计算和物理存储解耦，Alluxio 能够有助于简化系统架构。
当底层持久化存储中真实数据的路径对 Spark 隐藏时，对底层存储的更改可以独立于应用程序逻辑；同时，Alluxio 作为邻近计算的缓存，仍然可以给计算框架提供类似 Spark 数据本地性的特性。

## 前期准备

* 安装 Java 8 Update 60 或更高版本（8u60+）的 64 位 Java。
* 已经安装并运行 Alluxio。
  本指南假设底层持久存储为本地部署的 HDFS。例如，`${ALLUXIO_HOME}/conf/alluxio-site.properties`中包含`alluxio.master.mount.table.root.ufs=hdfs://localhost:9000/alluxio/`这一行。
  请注意，除了 HDFS，Alluxio 还支持许多其他底层存储系统。
  从任意数量的这些系统中访问数据与本指南的重点是垂直的，
  [统一和透明的名称空间]({{ '/cn/advanced/Namespace-Management.html' | relativize_url }})介绍了相关内容。
* 确保 Alluxio 客户端 jar 包是可用的。
  在从 Alluxio [下载页面](http://www.alluxio.org/download)下载的压缩包的`{{site.ALLUXIO_CLIENT_JAR_PATH}}`中，可以找到 Alluxio 客户端 jar 包。
  高级用户也可以从源代码编译该客户端 jar 包，可以参考[从源代码构建 Alluxio 的步骤]({{ '/cn/contributor/Building-Alluxio-From-Source.html' | relativize_url }})。

## 基础设置

将 Alluxio客户端 jar 包分发在运行 Spark driver 或 executor 的节点上。具体地说，将客户端 jar 包放在每个节点上的同一本地路径（例如`{{site.ALLUXIO_CLIENT_JAR_PATH}}`）。

将 Alluxio 客户端 jar 包添加到 Spark driver 和 executor 的 classpath 中，以便 Spark 应用程序能够使用客户端 jar 包在 Alluxio 中读取和写入文件。具体来说，在运行 Spark 的每个节点上，将以下几行添加到`spark/conf/spark-defaults.conf`中。

```bash
spark.driver.extraClassPath   {{site.ALLUXIO_CLIENT_JAR_PATH}}
spark.executor.extraClassPath {{site.ALLUXIO_CLIENT_JAR_PATH}}
```

## 示例：使用 Alluxio 作为输入和输出

本节介绍如何使用 Alluxio 作为 Spark 应用程序的输入和输出。

### 访问仅在Alluxio中的数据

将本地数据复制到 Alluxio 文件系统中。
假设你在 Alluxio 项目目录中，将`LICENSE`文件放入 Alluxio，运行：

```bash
bin/alluxio fs copyFromLocal LICENSE /Input
```

假设 Alluxio Master 运行在`localhost`上，在`spark-shell`中运行如下命令：

```scala
> val s = sc.textFile("alluxio://localhost:19998/Input")
> val double = s.map(line => line + line)
> double.saveAsTextFile("alluxio://localhost:19998/Output")
```

打开浏览器，查看 [http://localhost:19999/browse](http://localhost:19999/browse)。
应该存在一个输出目录`/Output`，其中包含了输入文件`Input`的双倍内容。

### 访问底层存储中的数据

给出准确路径后，Alluxio 支持透明地从底层存储系统中获取数据。
在本节中，使用 HDFS 作为分布式存储系统的示例。

将`Input_HDFS`文件放入到 HDFS 中：

```bash
hdfs dfs -put -f ${ALLUXIO_HOME}/LICENSE hdfs://localhost:9000/alluxio/Input_HDFS
```

请注意，Alluxio 并不知道该文件。你可以通过访问 Web UI 来验证这一点。
假设 Alluxio Master 运行在`localhost`上，在`spark-shell`中运行如下命令：

```scala
> val s = sc.textFile("alluxio://localhost:19998/Input_HDFS")
> val double = s.map(line => line + line)
> double.saveAsTextFile("alluxio://localhost:19998/Output_HDFS")
```

打开浏览器，查看 [http://localhost:19999/browse](http://localhost:19999/browse)。
应该存在一个输出目录`Output_HDFS`，其中包含了输入文件`Input_HDFS`的双倍内容。
同时，现在输入文件`Input_HDFS`会被 100% 地加载到 Alluxio 的文件系统空间。

## 高级设置

### 为所有 Spark 作业自定义 Alluxio 用户属性

让我们以设置 Spark 与 HA 模式的 Alluxio 服务进行通信为例。
如果你运行多个 Alluxio master，其中 Zookeeper 服务运行在`zkHost1:2181`、`zkHost2:2181`和`zkHost3:2181`，
将以下几行添加到`${SPARK_HOME}/conf/spark-defaults.conf`中：

```bash
spark.driver.extraJavaOptions   -Dalluxio.zookeeper.address=zkHost1:2181,zkHost2:2181,zkHost3:2181 -Dalluxio.zookeeper.enabled=true
spark.executor.extraJavaOptions -Dalluxio.zookeeper.address=zkHost1:2181,zkHost2:2181,zkHost3:2181 -Dalluxio.zookeeper.enabled=true
```

或者，你也可以在 Hadoop 配置文件`${SPARK_HOME}/conf/core-site.xml`中添加如下属性：

```xml
<configuration>
  <property>
    <name>alluxio.zookeeper.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>alluxio.zookeeper.address</name>
    <value>zkHost1:2181,zkHost2:2181,zkHost3:2181</value>
  </property>
</configuration>
```

在 Alluxio 1.8 （不包含 1.8）后，用户可以在 Alluxio URI 中编码 Zookeeper 服务地址（见[详细说明]({{ '/cn/deploy/Running-Alluxio-On-a-Cluster.html' | relativize_url }})#ha-configuration-parameters）。
这样，就不需要为 Spark 配置额外设置。

### 为单个 Spark 作业自定义 Alluxio 用户属性

Spark 用户可以将 JVM 系统设置传递给 Spark 作业，通过将`"-Dproperty=value"`添加到`spark.executor.extraJavaOptions`来设置 Spark executor，将`"-Dproperty=value"`添加到`spark.driver.extraJavaOptions`中来设置 spark driver。例如，要在写入 Alluxio 时提交`CACHE_THROUGH`写模式的 Spark 作业，请执行以下操作：

```bash
spark-submit \
--conf 'spark.driver.extraJavaOptions=-Dalluxio.user.file.writetype.default=CACHE_THROUGH' \
{'fraction_non_alphanumeric': 0.13444520081688224, 'fraction_numerical': 0.028817789879736783, 'mean_word_length': 6.592592592592593, 'pattern_counts': {'":': 0, '<': 31, '<?xml version=': 0, '>': 47, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 4}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3273493', 'n_tokens_mistral': 5076, 'n_tokens_neox': 5232, 'n_words': 608}