Alluxio简介

Alluxio是一个基于内存的分布式文件系统,它是架构在底层分布式文件系统和上层分布式计算框架之间的一个中间件,主要职责是以文件形式在内存或其它存储设施中提供数据的存取服务

应用场景

flink集成aviator flink alluxio_Alluxio


在大数据领域,最底层的是分布式文件系统,如Amazon S3、Apache HDFS等,而较高层的应用则是一些分布式计算框架,如Spark、MapReduce、HBase、Flink等,这些分布式框架,往往都是直接从分布式文件系统中读写数据,效率比较低,性能消耗比较大。而如果我们将其架构与底层分布式文件系统与上层分布式计算框架之间,以文件的形式在内存中对外提供读写访问服务的话,那么Alluxio可以为那些大数据应用提供一个数量级的加速,而且它只要提供通用的数据访问接口,就能很方便的切换底层分布式文件系统。

组件

Alluxio的设计使用了单Master和多Worker的架构。从高层的概念理解,Alluxio可以被分为三个部分,Master,Worker和Client。 Master和Worker一起组成了Alluxio的服务端,它们是系统管理员维护和管理的组件。Client通常是应用程序,如Spark或MapReduce作业,或者Alluxio的命令行用户。 Alluxio用户一般只与Alluxio的Client组件进行交互。

Master

Alluxio Master有主从两种模式。

主Master

主Master主要负责处理全局的系统元数据,例如,文件系统树。Client可以通过与Master的交互来读取或修改元数据。此外所有的Worker会周期性地发送心跳给主Master, 来确保它们还参与在Alluxio集群中。主Master不会主动发起与其他组件的通信,它只是以回复请求的方式与其他组件进行通信。一个Alluxio集群只有一个主Master。

从Master

从Master不断的读取并处理主Master写的日志。同时从Master会周期性的把所有的状态写入日志。从Master不处理任何请求。

Master部署

Alluxio Master有简单和高可用性 两种部署模式。这两种模式都只有一个主Master。简单模式最多只会有一个从Master,而且这个从Master不会被转换为主Maste。高可用性模式可以有零个或者多个从Master。 当主Master异常的时候,系统会选一个从Master担任新的主Master。

Worker

Alluxio的Worker负责管理分配给Alluxio的本地资源。这些资源可以是本地内存,SDD或者硬盘,其可以由用户配置。 Alluxio的Worker以块的形式存储数据,并通过读或创建数据块的方式处理来自Client读写数据的请求。但Worker只负责这些数据块上的数据;文件到块的实际映 射只会存储在Master上。

Client

Alluxio的Client为用户提供了一个与Alluxio服务端交互的入口。它为用户暴露了一组文件系统API。Client通过发起与Master 的通信来执行元数据操作,并且通过与Worker通信来读取Alluxio上的数据或者向Alluxio上写数据。存储在底层存储系统上而不是Alluxio上的数据可以直接通过 底层存储客户端访问。

构建Alluxio

编译Alluxio

环境要求:

Java 7(或以上)
Maven
Thrift 0.9.3(可选)

从Github上获取主分支并打包 & 支持hadoop的Cloudera发行版:

$>git clone git://github.com/alluxio/alluxio.git
$>cd alluxio
$>mvn install -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.7.0 -DskipTests

编译成功之后:

flink集成aviator flink alluxio_flink集成aviator_02

若需要构建一个特定的版本Alluxio,例如1.6.0,可以这样做

$>cd alluxio
$>git checkout v1.6.0

本地运行Alluxio & 独立模式下运行

  1. 修改配置文件
[$ALLUXIO_HOME/conf/alluxio-site.properties]
alluxio.master.hostname=localhost
alluxio.underfs.address=/hadoop/home/tmp
  1. 开启远程登录服务
    ssh localhost能成功
  2. 格式化Alluxio文件系统
$>cd /opt/app/alluxio 
$>./bin/alluxio format
  1. 本地启动Alluxio文件系统
$>./bin/alluxio-start.sh local
  1. 验证Alluxio是否运行
    查看进程
$>jps

运行一个一个简单的程序,进行更全面的系统完整性检查

$>./bin/alluxio runTests

访问Web UI
http://localhost:19999/

  1. 注意
    在Linux上运行Alluxio需要sudo权限
    建议以root用户去运行,否则可能会报一堆错
  2. 停止Alluxio文件系统
    $>./bin/alluxio-stop.sh local
  3. 构建成功截图
    成功启动 & 访问web ui

    runTests成功

支持Spark计算框架

编译支持Spark

执行命令

$>mvn clean package -Pspark -DskipTests

编译成功:

flink集成aviator flink alluxio_Alluxio_03

在Alluxio上运行Spark

  1. 修改配置文件
[$SPARK_HOME/conf/spark-defaults.conf]
spark.driver.extraClassPath     /<PATH_TO_ALLUXIO>/core/client/runtime/target/alluxio-core-client-runtime-1.6.0-jar-with-dependencies.jar
spark.executor.extraClassPath   /<PATH_TO_ALLUXIO>/core/client/runtime/target/alluxio-core-client-runtime-1.6.0-jar-with-dependencies.jar
  1. 上传page_view.data到alluxio
$>cd /opt/app/alluxio
$>./bin/alluxio fs copyFromLocal /root/page_views.dat /data
  1. 启动spark-shell
$>cd $SPARK_HOME
$>./bin spark-shell
  1. 运行wordcount
scala> val lines = sc.textFile("alluxio://localhost:19998/data")
    scala> val words = lines.flatMap { line => line.split("\t") }
    scala> val pairs = words.map { word => (word, 1) }
    scala> val wordCounts = pairs.reduceByKey(_ + _)
    scala> wordCounts.saveAsTextFile("alluxio://localhost:19998/output_spark")
  1. 运行成功 & 时间

支持MapReduce计算框架

  1. 修改配置文件
[$HADOOP_HOME/etc/hadoop/core-site.xml]
<property>
  <name>fs.alluxio.impl</name>
  <value>alluxio.hadoop.FileSystem</value>
  <description>The Alluxio FileSystem (Hadoop 1.x and 2.x)</description>
</property>
<property>
  <name>fs.AbstractFileSystem.alluxio.impl</name>
  <value>alluxio.hadoop.AlluxioFileSystem</value>
  <description>The Alluxio AbstractFileSystem (Hadoop 2.x)</description>
</property>
[$HADOOP_HOME/etc/hadoop/hadoop-env.sh]
export HADOOP_CLASSPATH=/<PATH_TO_ALLUXIO>/core/client/runtime/target/alluxio-core-client-runtime-1.6.0-jar-with-dependencies.jar:${HADOOP_CLASSPATH}
  1. 在本地模式的Alluxio上运行Hadoop wordcount
    启动伪分布式集群
$>start-all.sh

本地模式启动Alluxio

$>./bin/alluxio-start.sh local

运行一个用于wordcount的MapReduce作业

$>hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount -libjars /<PATH_TO_ALLUXIO>/core/client/runtime/target/alluxio-core-client-runtime-1.6.0-jar-with-dependencies.jar alluxio://localhost:19998/data alluxio://localhost:19998/output_mapreduce
  1. 运行成功 & 时间

编译报错 & 解决方案

  1. 若出现java.lang.OutOfMemoryError: Java heap space
$>export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
  1. 出现错误:
[ERROR] Failed to execute goal on project alluxio-core-server-common: Could not resolve dependencies for project org.alluxio:alluxio-core-server-common:jar:1.7.0-SNAPSHOT: Failed to collect dependencies at org.eclipse.jetty:jetty-jsp:jar:9.2.16.v20160414 -> org.glassfish.web:javax.servlet.jsp:jar:2.3.2 -> org.glassfish:javax.el:jar:3.0.1-b07-SNAPSHOT: Failed to read artifact descriptor for org.glassfish:javax.el:jar:3.0.1-b07-SNAPSHOT: Could not transfer artifact org.glassfish:javax.el:pom:3.0.1-b07-SNAPSHOT from/to sonatype-nexus-snapshots (https://oss.sonatype.org/content/repositories/snapshots): oss.sonatype.org: Unknown host oss.sonatype.org -> [Help 1]

造成这个错误的原因是因为所需要的jar包是需要走外网去下载的,有时候网络状况不好,
就会出现这种情况,建议开VPN进行编译
若没有,重新执行一次编译命令即可
亲测:重新执行一次就成功了