Alluxio以前称为Tachyon,是世界上第一个内存速度虚拟分布式存储系统。它统一数据访问、桥接计算框架和底层存储系统。应用程序只需要连接Alluxio来访问存储在任何底层存储系统中的数据。Alluxio以内存为中心的架构使数据访问速度比现有解决方案更快。Alluxio 1.7.0 Release最新版本于2018年1月16日发布。
在大数据生态系统中,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是AmpLab的李浩源(Li Haoyuan)所开发的一个基于内存的分布式文件系统,Alluxio的架构图如图6-1所示。
图 6 - 1Alluxio 架构图
Spark这种内存计算框架,只是提供了强大的内存计算能力,并未提供存储能力。通过Alluxio内存分布式文件系统,可以为Spark等计算框架提供内存存储能力。不仅如此,Alluxio内存分布式文件系统可以为集群中部署的计算框架提供内存级别的数据共享,即不同框架中的应用都可以基于Alluxio来共享数据。
Spark计算框架内跨进程的数据共享:存储引擎和计算引擎在同一个进程(JVM)内,不同的jobs之间共享数据是通过磁盘读写来实现的,如图6-2所示。
图 6 - 2 Spark计算框架内跨进程的数据共享
Spark计算框架与Hadoop计算框架间的数据共享也需要通过磁盘读写来实现,如图6-3所示。
图 6 - 3 Spark与Hadoop间的数据共享
基于Alluxio,可以实现多个计算框架间的数据共享,如图6-4所示。
图 6 - 4 Spark与Hadoop间的数据共享
同时,单独抽离出一个内存分布式文件系统,还可以避免由于计算框架执行失败而导致数据丢失等问题,比如Spark内部进程crash而导致的内存数据丢失问题,如图6-5所示。
图 6 - 5进程crash而导致的内存数据丢失
使用Alluxio不仅可以避免了多个框架多个内存缓存,还避免了因进程crash而导致的数据丢失问题,同时还引入了堆外内存(off-heap memory)技术来避免GC的开销。
Alluxio与Spark的兼容性:Alluxio直接兼容Spark 1.1版本或更新版本而无需修改。
Alluxio 与Hadoop的兼容性:Alluxio 1.7.0预编译版可兼容各种不同Hadoop版本(Hadoop 1.0、Hadoop 2.2、Hadoop 2.3、Hadoop 2.4、Hadoop 2.5、Hadoop 2.6、Hadoop 2.7、Hadoop 2.8)。
Alluxio与Hadoop、Spark都兼容,因此可以从Alluxio官网(https://www.alluxio.org/download)直接下载Alluxio 1.7.0的各种预编译版。
读者也可以下载Alluxio源码自己进行编译,本节提供Alluxio与Spark自己编译的实战案例。
基于Windows 10 + VMware Workstation 搭建的Linux虚拟机系统,首先在Linux系统安装Maven编译工具。
1) 在Maven官网http://maven.apache.org/download.cgi下载apache-maven-
3.5.2-bin包到Windows本地目录,解压缩以后使用Winscp文件传输工具将apache-maven-3.5.2-bin目录从本地Windows传送到远程虚拟机系统;打开Winscp工具,连接Linux虚拟机,复制到/usr/local/目录。
2) 使用PieTTY远程连接工具,登录到Linux远程虚拟机,输入命令cd /usr/local
进入/usr/local目录,输入ls命令,查看apache-maven-3.5.2-bin目录已经传到了远程虚拟机上。
root@master:~# cd /usr/local
root@master:/usr/local# ls | grep maven
apache-maven-3.5.2-bin
3) 配置Linux maven的全局环境变量
输入名称# vi /etc/profile打开profile文件,按i可以进入文本输入模式,在profile文件的最后增加MAVEN_HOME及修改PATH的环境变量,输入:wq!保存退出。
export MAVEN_HOME=/usr/local/apache-maven-3.5.2-bin
exportPATH=.:$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$SCALA_HOME/bin :$MAVEN_HOME/bin
4) 环境变量配置生效
在命令行中输入source /etc/profile,使刚才修改的MAVEN_HOME及PATH配置文件生效。
[root@master ~]#source /etc/profile
5) Maven测试验证
在命令行输入 #mvn -version,显示Maven版本。
Maven home: /usr/local/apache-maven-3.5.2-bin
Java version: 1.8.0_60, vendor: Oracle Corporation
Java home: /usr/local/jdk1.8.0_60/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version:"3.16.0-30-generic", arch: "amd64", family:"unix"
基于Windows 10 + VMware Workstation 搭建的Linux虚拟机系统,在Linux系统中下载Alluxio源码自己进行编译。
1) 下载Alluxio 1.7.0版本的源代码:
git clonegit://github.com/alluxio/alluxio.git
cd alluxio
2)进入Alluxio目录,使用Mvn命令对Alluxio进行编译。
mvn package-DskipTests -Dhadoop.version=2.6.0命令各个参数的含义:
l DskipTests:不执行测试用例。
l Dhadoop.version:Hadoop 版本号。
root@master:~/alluxio# mvn package -DskipTests-Dhadoop.version=2.6.0
[INFO] Scanning for projects...
Downloading from central:https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/7/oss-parent-7.pom
Downloaded from central:https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/7/oss-parent-7.pom(4.8 kB at 100 B/s)
[INFO]------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] Alluxio Parent
[INFO] Alluxio Core
……
3) Mvn命令编译完成,Alluxio 1.7.0编译成功。
……
[INFO] Alluxio Under File System - HDFS................... SUCCESS [ 13.763 s]
[INFO] Alluxio Under File System -Aliyun OSS ............. SUCCESS [ 11.425 s]
[INFO] Alluxio Under File System - S3A.................... SUCCESS [ 15.121 s]
[INFO] Alluxio Under File System - Swift.................. SUCCESS [ 12.524 s]
[INFO] Alluxio Under File System -Microsoft Azure Blob Storage SUCCESS [01:33 min]
[INFO]------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 28:29 min
[INFO] Finished at:2018-02-09T22:53:17+08:00
[INFO] Final Memory: 122M/333M
[INFO]------------------------------------------------------------------------
root@master:~/alluxio#
4) 查询Alluxio 1.7.0打包成功的部分Jar文件。
root@master:~# cd~/alluxio
root@master:~/alluxio#
root@master:~/alluxio#find ./ -name *.jar | grep alluxio-core-client-fs-1.7.0
./core/client/fs/target/alluxio-core-client-fs-1.7.0-javadoc.jar
./core/client/fs/target/alluxio-core-client-fs-1.7.0.jar
./core/client/fs/target/alluxio-core-client-fs-1.7.0-tests.jar
./core/client/fs/target/alluxio-core-client-fs-1.7.0-sources.jar
基于Windows 10 + VMware Workstation 搭建的Linux虚拟机系统,在Linux系统中对Spark 2.2.1源码自己进行编译。
1) 在Spark官网http://spark.apache.org/downloads.html下载spark-2.2.1.tgz包
到Windows本地目录,解压缩为spark-2.2.1-src目录,使用Winscp文件传输工具将spark-2.2.1-src目录从本地Windows传送到远程虚拟机系统;打开Winscp工具,连接Linux虚拟机,复制到/usr/local/目录。
2) 使用PieTTY远程连接工具,登录到Linux远程虚拟机,输入命令cd /usr/local
进入/usr/local目录,输入ls命令,查看spark-2.2.1-src目录已经传到了远程虚拟机上。
root@master:/usr/local# cd /usr/local
root@master:/usr/local# ls |grep spark-2.2.1-src
spark-2.2.1-src
3) 修改spark-2.2.1-src目录的/usr/local/spark-2.2.1-src/spark-2.2.1/core里面的
pom.xml,在pom.xml中增加Alluxio 1.7.0的依赖。
root@master:/usr/local/spark-2.2.1-src/spark-2.2.1#vi pom.xml
…….
…..
4) 进入spark-2.2.1目录,使用Mvn命令对Spark 2.2.1 源码进行编译。
mvn -Pyarn -Phadoop-2.6–Dhadoop.version=2.6.0 -Phive-Phive-thriftserver -Psparkr -DskipTests clean package命令各个参数的含义:
l Pyarn :是否支持Hadoop Yarn,不加参数时为不支持Yarn。
l Phadoop-2.6:支持Hadoop 2.6。
l Dhadoop.version:Hadoop 版本号。
l Phive和Phive-thriftserver:是否在Spark SQL 中支持Hive,不加此参数时为不支持Hive。
l Psparkr:支持Spark R。
l DskipTests:不执行测试用例。
l clean package:编译打包。
root@master:/usr/local/spark-2.2.1-src/spark-2.2.1#mvn -Pyarn -Phadoop-2.6 –
Dhadoop.version=2.6.0 -Phive -Phive-thriftserver -Psparkr-DskipTests clean package
[INFO] Scanning for projects...
Downloading from central:https://repo.maven.apache.org/maven2/org/apache/apache/18/apache-18.pom
Downloaded from central:https://repo.maven.apache.org/maven2/org/apache/apache/18/apache-18.pom (16 kBat 5.0 kB/s)
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
…….
5) 在Spark 2.2.1编译过程中可能遇到的问题:
l OutOfMemoryError内存溢出。
root@master:/usr/local/spark-2.2.1-src/spark-2.2.1#mvn -Pyarn -Phadoop-2.6 –
Dhadoop.version=2.6.0 -Phive -Phive-thriftserver -Psparkr-DskipTests clean package
……
[ERROR] For more information about theerrors and possible solutions, please read the following articles:
[ERROR] [Help 1]http://cwiki.apache.org/confluence/display/MAVEN/OutOfMemoryError
……
解决措施:修改Maven的配置文件,配置Maven使用的内存信息。
root@master:/usr/local/apache-maven-3.5.2-bin/bin#vi mvn
MAVEN_OPTS="$MAVEN_OPTS -Xms800m-Xmx800m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=64m"
l 文件执行权限拒绝。
root@master:/usr/local/spark-2.2.1-src/spark-2.2.1#mvn -Pyarn -Phadoop-2.6 –
Dhadoop.version=2.6.0 -Phive -Phive-thriftserver -Psparkr-DskipTests clean package
……
[ERROR] Failed to execute goalorg.codehaus.mojo:exec-maven-plugin:1.5.0:exec (sparkr-pkg) on projectspark-core_2.11: Command execution failed.: Cannot run program"/usr/local/spark-2.2.1-src/spark-2.2.1/core/../R/install-dev.sh" (indirectory "/usr/local/spark-2.2.1-src/spark-2.2.1/core"): error=13,Permission denied -> [Help 1]
…….
解决措施:修改spark-2.2.1-src目录及文件为可执行权限。
root@master:/usr/local# chmod -R 777spark-2.2.1-src
l R语言提示出错。
root@master:/usr/local/spark-2.2.1-src/spark-2.2.1#mvn -Pyarn -Phadoop-2.6 –
Dhadoop.version=2.6.0 -Phive -Phive-thriftserver -Psparkr-DskipTests clean package
…….
Cannot find 'R_HOME'. Please specify'R_HOME' or make sure R is properly installed.
++ echo 'Cannot find '\''R_HOME'\''.Please specify '\''R_HOME'\'' or make sure R is properly installed.'
++ exit 1
解决措施:安装R语言包。
root@master:/usr/local/spark-2.2.1-src/spark-2.2.1#sudo apt-get install r-base-core
……
root@master:/usr/local/spark-2.2.1-src/spark-2.2.1#R --version
R version 3.0.2 (2013-09-25) --"Frisbee Sailing"
Copyright (C) 2013 The R Foundation forStatistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELYNO WARRANTY.
You are welcome to redistribute it underthe terms of the
GNU General Public License versions 2 or3.
For more information about these matterssee
http://www.gnu.org/licenses/.
6) 进入spark-2.2.1目录,再次使用Mvn命令对Spark 2.2.1 源码进行编译。编译Spark 2.2.1成功。
root@master:/usr/local/spark-2.2.1-src/spark-2.2.1#mvn -Pyarn -Phadoop-2.6 –
Dhadoop.version=2.6.0 -Phive -Phive-thriftserver -Psparkr-DskipTests clean package
…….
[INFO] Reactor Summary:
[INFO]
[INFO] Spark Project Parent POM........................... SUCCESS [ 13.440 s]
[INFO] Spark Project Tags................................. SUCCESS [ 16.008 s]
[INFO] Spark Project Sketch............................... SUCCESS [ 13.524 s]
[INFO] Spark Project Networking........................... SUCCESS [ 15.624 s]
[INFO] Spark Project Shuffle StreamingService ............ SUCCESS [ 9.659 s]
[INFO] Spark Project Unsafe............................... SUCCESS [ 18.168 s]
[INFO] Spark Project Launcher............................. SUCCESS [ 12.561 s]
[INFO] Spark Project Core................................. SUCCESS [07:44 min]
[INFO] Spark Project ML Local Library..................... SUCCESS [01:20 min]
[INFO] Spark Project GraphX............................... SUCCESS [02:18 min]
[INFO] Spark Project Streaming............................ SUCCESS [04:20 min]
[INFO] Spark Project Catalyst............................. SUCCESS [06:55 min]
[INFO] Spark Project SQL.................................. SUCCESS [13:00 min]
[INFO] Spark Project ML Library ...........................SUCCESS [08:58 min]
[INFO] Spark Project Tools................................ SUCCESS [ 43.784 s]
[INFO] Spark Project Hive................................. SUCCESS [11:29 min]
[INFO] Spark Project REPL................................. SUCCESS [01:16 min]
[INFO] Spark Project YARN ShuffleService ................. SUCCESS [01:02 min]
[INFO] Spark Project YARN................................. SUCCESS [02:22 min]
[INFO] Spark Project Hive Thrift Server................... SUCCESS [02:57 min]
[INFO] Spark Project Assembly............................. SUCCESS [ 31.124 s]
[INFO] Spark Project External Flume Sink.................. SUCCESS [02:50 min]
[INFO] Spark Project External Flume....................... SUCCESS [02:18 min]
[INFO] Spark Project External FlumeAssembly .............. SUCCESS [ 14.471 s]
[INFO] Spark Integration for Kafka 0.8.................... SUCCESS [05:22 min]
[INFO] Kafka 0.10 Source for StructuredStreaming ......... SUCCESS [05:33 min]
[INFO] Spark Project Examples............................. SUCCESS [02:11 min]
[INFO] Spark Project External KafkaAssembly .............. SUCCESS [ 19.310 s]
[INFO] Spark Integration for Kafka 0.10................... SUCCESS [02:51 min]
[INFO] Spark Integration for Kafka 0.10Assembly .......... SUCCESS [ 14.252 s]
[INFO]------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO]------------------------------------------------------------------------
[INFO] Total time: 01:28 h
[INFO] Finished at:2018-02-10T19:59:33+08:00
[INFO] Final Memory: 113M/773M
[INFO]------------------------------------------------------------------------
7) 查询Spark 2.2.1打包成功的部分Jar文件。
root@master:/usr/local/spark-2.2.1-src/spark-2.2.1#find ./ -name *.jar |grep spark-core_2.11-2.2.1
./assembly/target/scala-2.11/jars/spark-core_2.11-2.2.1.jar
./core/target/spark-core_2.11-2.2.1-test-sources.jar
./core/target/original-spark-core_2.11-2.2.1.jar
./core/target/spark-core_2.11-2.2.1-sources.jar
./core/target/spark-core_2.11-2.2.1.jar
./core/target/spark-core_2.11-2.2.1-tests.jar