11.2 Spark与Alluxio整合原理与实战
Alluxio以前称为Tachyon,是世界上第一个内存速度虚拟分布式存储系统。它统一数据访问、桥接计算框架和底层存储系统。应用程序只需要连接Alluxio来访问存储在任何底层存储系统中的数据。Alluxio以内存为中心的架构使数据访问速度比现有解决方案更快。
本节讲解Spark与Alluxio整合原理及Spark与Alluxio整合实战。
11.2.1 Spark与Alluxio整合原理
在大数据生态系统中,Alluxio位于计算框架或作业jobs之间,如Apache Spark、Apache MapReduce、Apache HBase、Apache Hive或Apache Flink,以及各种存储系统,如Amazon S3、Google Cloud Storage、OpenStack Swift、GlusterFS、HDFS、MaprFS、Ceph、NFS和Alibaba OSS。Alluxio为生态系统带来显著的性能改善。例如,百度使用Alluxio提升数据分析速度近30倍;Barclays(巴克莱)银行使用Alluxio把不可能变成了可能,从之前计算的小时级变成了秒级;Qunar(去哪儿网)在Alluxio之上进行实时数据分析。除了性能外,传统存储系统中的数据通过桥接存储在Alluxio中进行新的工作负载。用户可以使用其独立的集群模式运行Alluxio。例如,在Amazon EC2、Google Compute Engine上,或者使用Apache Mesos或Apache Yarn启动Alluxio。
Alluxio兼容Hadoop。现有的数据分析应用程序,如Spark和MapReduce程序,可以运行在Alluxio上,无须任何代码更改。Alluxio项目是Apache License 2.0下的开源项目,部署在许多公司。它是增长速度最快的开源项目之一。Alluxio拥有三年的开源历史,吸引了来自150多家机构的600多名参与者,包括阿里巴巴、Alluxio、百度、CMU、谷歌、IBM、英特尔、NJU、红帽、加州大学伯克利分校。Alluxio项目是Berkeley数据分析堆栈(BDAS)的存储层,也是Fedora发行版的一部分。Alluxio由100多个组织部署在生产中,并且运行在超过1000个节点的集群上。
Alluxio功能如下。
灵活的文件API: Alluxio的原生API类似于java.io.File类,提供InputStream和OutputStream接口以及对内存映射I/O的高效支持。建议使用此API从Alluxio获得最佳性能。Alluxio还提供了一个兼容Hadoop的FileSystem接口,允许Hadoop MapReduce和Spark使用Alluxio代替HDFS。
提供容错能力的可插拔存储:Alluxio将内存中的数据checkpoints到底层存储系统。Alluxio具有通用接口,可以方便地插入不同的底层存储系统。Alluxio目前支持Amazon S3、Google Cloud Storage、OpenStack Swift、GlusterFS、HDFS、MaprFS、Ceph、NFS、Alibaba OSS和单节点本地文件系统,并支持许多其他文件系统。
采用分层存储,除了内存外,Alluxio还可以管理SSD和HDD,允许将更大的数据集存储在Alluxio中。数据将自动在不同层之间进行管理,保持热数据。自定义策略插拔、引脚允许直接的用户控制。
统一命名空间: Alluxio通过安装功能实现跨不同存储系统的有效数据管理。此外,透明命名可确保在将这些对象持久存储到底层存储系统时,保留在Alluxio中创建的对象的文件名和目录层次结构。
Lineage血统: Alluxio可以实现高吞吐量写入,通过使用Lineage提供容错性,通过重新执行创建输出的作业恢复丢失的输出。使用Lineage,应用程序将输出写入内存,Alluxio会以异步方式定期检查输出到文件系统。如果出现故障,Alluxio将启动重新计算,以恢复丢失的文件。
Web UI和命令行:用户可以通过Web UI轻松浏览文件系统。在调试模式下,管理员可以查看每个文件的详细信息,包括位置、检查点路径等。用户还可以使用./bin/alluxio fs与Alluxio进行交互,例如,复制数据进出文件系统。
在Alluxio上运行Apache Spark。HDFS作为分布式存储系统,除了HDFS外,Alluxio还支持许多其他存储系统,支持Spark等框架从任何数量的系统读取数据或写入数据。Alluxio与Spark 1.1之后的新版本配合使用。
11.2.2 Spark与Alluxio整合实战
本节根据Alluxio本地模式与Spark进行整合实战。
1.在本地运行Alluxio部署的步骤
(1)在Linux系统上安装JDK 7或更高版本。
(2)安装部署Alluxio 1.5.0。
下载alluxio-1.5.0的Jar安装包。
1. wget http://alluxio.org/downloads/files/1.5.0/alluxio-1.5.0-bin.tar.gz 2. tar xvfz alluxio-1.5.0-bin.tar.gz 3. cd alluxio-1.5.0
在本地独立模式下运行,配置以下内容。
设置alluxio.master.hostname:在conf/alluxio-site.properties配置为localhost(即alluxio.master.hostname=localhost)。
设置alluxio.underfs.address:在conf/alluxio-site.properties配置本地文件系统中的tmp目录(例如,alluxio.underfs.address=/tmp)。
打开远程登录服务:登录ssh localhost成功。如无需重复输入密码,则可配置主机的公共ssh密钥~/.ssh/authorized_keys。
格式化Alluxio文件系统。注意:首次运行Alluxio时,才需要执行此步骤。如果为现有Alluxio群集运行此命令,则Alluxio文件系统中之前存储的所有数据和元数据将被删除。但是,存储中的数据将不会更改。
1. ./bin/alluxio format
在本地启动Alluxio文件系统:运行以下命令启动Alluxio文件系统。在Linux上,为了设置RAMFS,此命令可能需要输入密码,以获取sudo权限。
1. ./bin/alluxio-start.sh local
(3)验证Alluxio正在运行。
要验证Alluxio是否正在运行,可以访问http://localhost:19999,或查看logs文件夹中的日志。也可运行runTests命令进行检查。
1. ./bin/alluxio runTests
(4)停止Alluxio运行。
1. ./bin/alluxio-stop.sh local
2.Alluxio本地模式与Spark进行整合
(1)Alluxio客户端使用Spark特定的配置文件进行编译。alluxio使用以下命令从顶级目录构建整个项目。
1. mvn clean package -Pspark -DskipTests
(2)添加以下行到spark/conf/spark-defaults.conf。
1. spark.driver.extraClassPath /<PATH_TO_ALLUXIO>/core/client/runtime/target/ alluxio-core-client-runtime-1.6.0-SNAPSHOT-jar-with-dependencies.jar 2. spark.executor.extraClassPath /<PATH_TO_ALLUXIO>/core/client/runtime/ target/alluxio-core-client-runtime-1.6.0-SNAPSHOT-jar-with-dependenci es.jar
(3)HDFS的附加设置:如果Alluxio运行在Hadoop 1.x群集上,则创建一个spark/conf/ core-site.xml包含以下内容的新文件。
1. <configuration> 2. <property> 3. <name>fs.alluxio.impl</name> 4. <value>alluxio.hadoop.FileSystem</value> 5. </property> 6. </configuration>
(4)如果使用zookeeper在容错模式下运行alluxio,并且Hadoop集群是1.x,将以下内容添加到之前的spark/conf/core-site.xml。
1. <property> 2. <name>fs.alluxio-ft.impl</name> 3. <value>alluxio.hadoop.FaultTolerantFileSystem</value> 4. </property>
增加以下内容到spark/conf/spark-defaults.conf。
1. spark.driver.extraJavaOptions -Dalluxio.zookeeper.address=zookeeperHost1:2181,zookeeperHost2:2181 -Dalluxio.zookeeper.enabled=true 2. spark.executor.extraJavaOptions -Dalluxio.zookeeper.address=zookeeperHost1:2181,zookeeperHost2:2181 -Dalluxio.zookeeper.enabled=true
(5)使用Alluxio作为Spark应用程序的输入和输出源。
使用Alluxio中的数据。首先,把一些本地数据复制到Alluxio文件系统。将文件LICENSE放入Alluxio中,假设在Alluxio项目目录中:
1. bin/alluxio fs copyFromLocal LICENSE /LICENSE
运行spark-shell,Alluxio Master在localhost模式下运行。
1. > val s = sc.textFile("alluxio://localhost:19998/LICENSE") 2. > val double = s.map(line => line + line) 3. > double.saveAsTextFile("alluxio://localhost:19998/LICENSE2")
(6)我们已经在Spark应用程序中读入和保存了Alluxio系统中的文件,进行检查验证。
打开浏览器检查http://localhost:19999/browse。应该有一个输出文件LICENSE2,使LICENSE原文件中的每行内容都输出两次。
Alluxio的更多内容,读者可以登录Alluxio的官网(http://www.alluxio.org/)进行学习。