一、Alluxio概述
Alluxio(前身Tachyon)是世界上第一個以內存為中心的虛擬的分布式存儲系統。它統一了數據訪問的方式,為上層計算框架和底層存儲系統構建了橋梁。
Alluxio項目源自加州大學伯克利分校AMPLab,作為伯克利數據分析堆棧(BDAS)的數據訪問層。Alluxio是增長最快的開源項目之一,吸引了來自300多家機構的1000多名貢獻者,包括阿里巴巴,Alluxio,百度,CMU,谷歌,IBM,英特爾,NJU,紅帽,騰訊,加州大學伯克利分校,以及雅虎。

二、優勢
通過簡化應用程序訪問其數據的方式(無論數據是什么格式或位置),Alluxio 能夠幫助克服從數據中提取信息所面臨的困難。Alluxio 的優勢包括:
-  
內存速度 I/O:Alluxio 能夠用作分布式共享緩存服務,這樣與 Alluxio 通信的計算應用程序可以透明地緩存頻繁訪問的數據(尤其是從遠程位置),以提供內存級 I/O 吞吐率。此外,Alluxio的層次化存儲機制能夠充分利用內存、固態硬盤或者磁盤,降低具有彈性擴張特性的數據驅動型應用的成本開銷。
 -  
簡化雲存儲和對象存儲接入:與傳統文件系統相比,雲存儲系統和對象存儲系統使用不同的語義,這些語義對性能的影響也不同於傳統文件系統。在雲存儲和對象存儲系統上進行常見的文件系統操作(如列出目錄和重命名)通常會導致顯著的性能開銷。當訪問雲存儲中的數據時,應用程序沒有節點級數據本地性或跨應用程序緩存。將 Alluxio 與雲存儲或對象存儲一起部署可以緩解這些問題,因為這樣將從 Alluxio 中檢索讀取數據,而不是從底層雲存儲或對象存儲中檢索讀取。
 -  
簡化數據管理:Alluxio 提供對多數據源的單點訪問。除了連接不同類型的數據源之外,Alluxio 還允許用戶同時連接同一存儲系統的不同版本,如多個版本的 HDFS,並且無需復雜的系統配置和管理。
 -  
應用程序部署簡易:Alluxio 管理應用程序和文件或對象存儲之間的通信,將應用程序的數據訪問請求轉換為底層存儲接口的請求。Alluxio 與 Hadoop 生態系統兼容,現有的數據分析應用程序,如 Spark 和 MapReduce 程序,無需更改任何代碼就能在 Alluxio 上運行
 

三、Alluxio架構
Alluxio是大數據和機器學習生態系統中的新數據訪問層。Alluxio作為據訪問層處於持久存儲層(如Amazon S3,Microsoft Azure Object Store,Apache HDFS或OpenStack Swift)和計算框架層(如Apache Spark,Presto或Hadoop MapReduce)之間。

Alluxio主要包括3個角色:masters, workers, 和clients。典型的集群是由主備masters,主備job master,workers和job workers組成。
Job Masters和Job Workers可以作為單獨的功能,即Job Service。Job Service是一個輕量級的任務調度框架,負責為Job Worker分配各種不同類型的操作。
- 將UFS的數據加載到Alluxio
 - 數據保留到UFS
 - 復制Alluxio中的文件
 - UFS/Alluxio之間移動或復制數據
 
Ⅰ).Masters

Alluxio包括2類主進程:
- Master: 為元數據的變更(用戶請求和日志文件系統)提供服務
 - Job Master: 做為輕便的調度器,對執行在Job Master上的文件操作提供調度
 
HA集群角色
a).Leading Master
Alluxio集群只能由一個Leading Master進程,Leading Master負責管理系統的全局元數據。包括file system metadata、block metadata 和 worker capacity metadata,Alluxio客戶端通過與Leading Master交互來讀取或修改元數據。所有的Workers定時向Leading Master發送心跳信息,Leading Master會記錄所有的文件操作到日志中
b).Standby Master
Standby Master在運行在與Leading Master不同的服務器上,以便在HA模式下運行Alluxio時提供容錯功能。Standby Master會及時同步讀取Leading Master的日志。
c).Secondary Master
Alluxio不是HA模式時,可以在Leading Master服務器上啟動Secondary Master來編寫journals檢查點。當Leading Master無法工作時,提供快速服務恢復;但Secondary Master永遠不能能做為Standby Master。
d).Job Master
Job Master是一個獨立的進程,負責在Alluxio中異步處理一些更重量級的文件系統的操作。
Ⅱ).Workers

1.Alluxio Workers
Workers負責管理分配用戶可配置的本地資源(例如內存,SSD,HDD)。Alluxio workers 通過 在其本地資源創建新的blocks存儲或讀取blocks來響應client的讀寫數據請求。Workers 只負責管理blocks,實際的映射關系( files to blocks )只存儲在master。
2.Alluxio Job Workers
Job Workers做為Alluxio文件系統的客戶端,負責執行Job Master分配他的任務。
Ⅲ).Client
Alluxio client為用戶提供了與Alluxio servers交互的網關。Client和Leading Master交互操作元數據信息,再向workers交互讀寫請求。
注意Alluxio clients 不能直接訪問底層存儲系統,數據是通過Alluxio workers被轉換傳遞的。
四、安裝部署
1.前期准備
需要:
Mac OS X 或 Linux
安裝 SSH (Mac OS X)
如果你使用 Mac OS X,你必須能夠 ssh 到 localhost。遠程登錄開啟方法:打開系統偏好設置,然后打開共享,確保遠程登錄已開啟。
2.下載 Alluxio
從這里下載 Alluxio。
$ tar -xzf alluxio-2.7.3-bin.tar.gz $ cd alluxio-2.7.3
    這會創建一個包含所有的 Alluxio 源文件和 Java 二進制文件的文件夾alluxio-2.7.3。在本教程中,這個文件夾的路徑將被引用為${ALLUXIO_HOME}。
3.配置 Alluxio
    在${ALLUXIO_HOME}/conf目錄下,根據模板文件創建conf/alluxio-site.properties配置文件。
    $ cp conf/alluxio-site.properties.template conf/alluxio-site.properties 
             在conf/alluxio-site.properties文件中修改 alluxio.master.hostname,默認是本地文件系統。
關於掛載特定版本hdfs請參考https://docs.alluxio.io/os/user/stable/cn/ufs/HDFS.html,下文也有掛載hdfs介紹。
alluxio.master.hostname=localhost
4.驗證 Alluxio 運行環境
在啟動 Alluxio 前,要保證當前系統環境下 Alluxio 可以正常運行。可以通過運行如下命令來驗證 Alluxio 的本地運行環境:
    $ ./bin/alluxio validateEnv local 
         該命令將匯報在本地環境運行 Alluxio 可能出現的問題。
    你可以在這里查看更多關於validateEnv命令的信息。
5.啟動 Alluxio
在啟動 Alluxio 進程前,需要進行格式化。如下命令會格式化 Alluxio 的日志和 worker 存儲目錄。
  $ ./bin/alluxio format 
         默認配置下,本地運行 Alluxio 會啟動一個 master 和一個 worker。我們可以用如下命令在 localhost 啟動 Alluxio:
  $ ./bin/alluxio-start.sh local SudoMount

 
          
可以訪問 http://localhost:19999 查看 Alluxio master 的運行狀態

訪問 http://localhost:30000 查看 Alluxio worker 的運行狀態

6.使用 Alluxio Shell
Alluxio shell 包含多種與 Alluxio 交互的命令行操作。如果要查看文件系統操作命令列表,運行:
    $ ./bin/alluxio fs

 
               通過ls命令列出 Alluxio 里的文件。比如列出根目錄下所有文件:
    $ ./bin/alluxio fs ls /
 
                目前 Alluxio 里沒有文件。copyFromLocal命令可以拷貝本地文件到 Alluxio 中。
    $ ./bin/alluxio fs copyFromLocal LICENSE /LICENSE     Copied LICENSE to /LICENSE 
                 再次列出 Alluxio 里的文件,可以看到剛剛拷貝的LICENSE文件:
    $ ./bin/alluxio fs ls / 
 
             輸出顯示 LICENSE 文件在 Alluxio 中,也包含一些其他的有用信息,比如文件的大小、創建的日期、文件的所有者和組以及 Alluxio 中這個文件的緩存占比。
    cat命令可以打印文件的內容。
    $ ./bin/alluxio fs cat /LICENSE  Apache License  Version 2.0, January 2004  http://www.apache.org/licenses/   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION ... 
                 默認設置中,Alluxio 使用本地文件系統作為底層文件系統 (UFS)。默認的 UFS 路徑是./underFSStorage。我們可以查看 UFS 中的內容:
   $ ls ./underFSStorage/ 
             然而,這個目錄不存在!這是由於 Alluxio 默認只寫入數據到 Alluxio 存儲空間,而不會寫入 UFS。
    但是,我們可以告訴 Alluxio 將文件從 Alluxio 空間持久化到 UFS。shell 命令persist可以做到。
   $ ./bin/alluxio fs persist /LICENSE     persisted file /LICENSE with size 26847 
             如果我們現在再次檢查 UFS,文件就會出現。
    $ ls ./underFSStorage 
 
             如果我們在 master webUI 中瀏覽 Alluxio 文件系統,我們可以看見 LICENSE 文件以及其它有用的信息。其中,Persistence State 欄顯示文件為 PERSISTED

free命令
將文件從釋放中釋放,前提是這個文件已經持久化到UFS了,不然是沒辦法釋放的
./bin/alluxio fs free /LICENSE

七、Alluxio 中的掛載功能
Alluxio 通過統一命名空間的特性統一了對存儲系統的訪問。你可以閱讀統一命名空間的博客和統一命名空間文檔獲取更詳細的解釋。
這個特性允許用戶掛載不同的存儲系統到 Alluxio 命名空間中並且通過 Alluxio 命名空間無縫地跨存儲系統訪問文件。
首先,我們在 Alluxio 中創建一個目錄作為掛載點。
  $ ./bin/alluxio fs mkdir /mnt   Successfully created directory /mnt
  掛載hdfs 到 Alluxio
    ./bin/alluxio fs mount --shared alluxio://localhost:19998/mnt/hdfs hdfs://bigdata:9000/

 
              我們可以通過 Alluxio 命名空間列出 hdfs中的文件

新掛載的文件和目錄也可以在 Alluxio web UI 中看到

修改刪除hdfs文件
原文件
      
執行刪除命令
./bin/alluxio fs rm /mnt/hdfs/data/google.com/google.com190912.bz2

參考hdfs文件結果
      
掛載local
      ./bin/alluxio fs mount --shared alluxio://localhost:19998/mnt/local /root/data/1

 
        linux本地文件情況

alluxio掛載后

如果在底層文件系統操作掛載的目錄,alluxion無法感知,通過alluxion操作掛載的目錄對應的文件等,底層文件系統也會相應改變。
例子說明:
linux上cp wc.txt到 1/目錄下
      
alluxion是沒有wc.txt的
 
通過alluxion創建/mnt/local/new.scala文件
  
可以看到本地和alluxion都創建了new.scala文件
  
 
總結:如果使用了alluxion管理各種文件系統,那么對掛載的文件系統讀寫操作都通過alluxion操作是比較合理的。
八、在Alluxio上運行Hadoop MapReduce
1.Alluxio客戶端
為了使MapReduce應用可以與Alluxio進行通信,需要將Alluxio Client的Jar包包含在MapReduce的classpaths中
Alluxio客戶端Jar包可以在/<PATH_TO_ALLUXIO>/client/alluxio-2.7.3-client.jar中發現。
2.配置Hadoop
將以下兩個屬性添加到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> 
         該配置讓MapReduce作用在輸入和輸出文件中通過Alluxio scheme alluxio:// 來識別URIs。
其次, 在conf目錄中hadoop-env.sh文件中修改$HADOOP_CLASSPATH:
$ export HADOOP_CLASSPATH=/<PATH_TO_ALLUXIO>/client/alluxio-2.7.3-client.jar:${HADOOP_CLASSPATH} 
         該配置確保Alluxio客戶端jar包是利用的,對於通過Alluxio的URIs來創建和提交作業進行交互的MapReduce作業客戶端。
3.分發Alluxio客戶端Jar包
為了讓MapRedude應用在Alluxio上讀寫文件,Alluxio客戶端Jar包必須被分發到不同節點的應用相應的classpaths中。
如何從Cloudera上加入第三方庫這篇文檔介紹了分發Jar包的多種方式。文檔中建議通過使用命令行的-libjars選項,使用分布式緩存來分發Alluxio客戶端Jar包。另一種分發客戶端Jar包的方式就是手動將其分發到Hadoop節點上。下面就是這兩種主流方法的介紹:
1.使用-libjars命令行選項
你可以在使用hadoop jar ...的時候加入-libjars命令行選項,指定/<PATH_TO_ALLUXIO>/client/alluxio-2.7.3-client.jar為-libjars的參數。這條命令會把該Jar包放到Hadoop的DistributedCache中,使所有節點都可以訪問到。例如,下面的命令就是將Alluxio客戶端Jar包添加到-libjars選項中。
$ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount \ -libjars /<PATH_TO_ALLUXIO>/client/alluxio-2.7.3-client.jar <INPUT FILES> <OUTPUT DIRECTORY> 
         有時候,你還需要設置環境變量HADOOP_CLASSPATH,讓Alluxio客戶端在運行hadoop jar命令時創建的客戶端JVM可以使用jar包:
$ export HADOOP_CLASSPATH=/<PATH_TO_ALLUXIO>/client/alluxio-2.7.3-client.jar:${HADOOP_CLASSPATH} 
         2.手動將Client Jar包分發到所有節點
為了在每個節點安裝Alluxio,將客戶端jar包/<PATH_TO_ALLUXIO>/client/alluxio-2.7.3-client.jar置於每個MapReduce節點的$HADOOP_HOME/lib(由於版本不同也可能是$HADOOP_HOME/share/hadoop/common/lib),然后重新啟動Hadoop。 另一種選擇,在你的Hadoop部署中,把這個jar包添加到mapreduce.application.classpath系統屬性,確保jar包在classpath上。 為了在每個節點上安裝Alluxio,將客戶端Jar包mapreduce.application.classpath,該方法要注意的是所有Jar包必須再次安裝,因為每個Jar包都更新到了最新版本。另一方面,當該Jar包已經在每個節點上的時候,就沒有必要使用-libjars命令行選項了。
4.在本地模式的Alluxio上運行Hadoop wordcount
重啟hadoop集群
你可以在Alluxio中加入兩個簡單的文件來運行wordcount。在你的Alluxio目錄中運行:
$ ./bin/alluxio fs copyFromLocal LICENSE /wordcount/input.txt 
         該命令將LICENSE文件復制到Alluxio的文件命名空間中,並指定其路徑為/wordcount/input.txt。
現在我們運行一個用於wordcount的MapReduce作業。
$ ./bin/hadoop jar /root/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount \ -libjars /root/app/alluxio/client/alluxio-2.7.3-client.jar \ alluxio://localhost:19998/wordcount/input.txt \ alluxio://localhost:19998/wordcount/output 
         作業完成后,wordcount的結果將存在Alluxio的/wordcount/output目錄下。可以通過運行如下命令來查看結果文件:
$ ./bin/alluxio fs ls /wordcount/output $ ./bin/alluxio fs cat /wordcount/output/part-r-00000 
         
九、Apache Spark 使用 Alluxio
1.基礎設置
1)將 Alluxio客戶端 jar 包分發在運行 Spark driver 或 executor 的節點上。具體地說,將客戶端 jar 包放在每個節點上的同一本地路徑(例如/<PATH_TO_ALLUXIO>/client/alluxio-2.7.3-client.jar)。
2)將 Alluxio 客戶端 jar 包添加到 Spark driver 和 executor 的 classpath 中,以便 Spark 應用程序能夠使用客戶端 jar 包在 Alluxio 中讀取和寫入文件。具體來說,在運行 Spark 的每個節點上,將以下幾行添加到spark/conf/spark-defaults.conf中。
spark.driver.extraClassPath /<PATH_TO_ALLUXIO>/client/alluxio-2.7.3-client.jar spark.executor.extraClassPath /<PATH_TO_ALLUXIO>/client/alluxio-2.7.3-client.jar
 
         3)使用--jars傳遞 jar
--jars /root/app/alluxio/client/alluxio-2.7.3-client.jar 
        2.e.g:使用 Alluxio 作為輸入和輸出
代碼
import alluxio.AlluxioURI
import alluxio.client.file.FileSystem
import alluxio.conf.{AlluxioConfiguration, AlluxioProperties, InstancedConfiguration, PropertyKey}
import alluxio.grpc.DeletePOptions
import org.apache.spark.{SparkConf, SparkContext}
import javax.security.auth.Subject
object AlluxioApp02{
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
// .setAppName(this.getClass.getName).setMaster("local[2]")
val sc = new SparkContext(conf)
val inpath = args(0)
val outpath = args(1)
val alluxioProperties = new AlluxioProperties()
//
alluxioProperties.set(PropertyKey.MASTER_BIND_HOST,"bigdata")
alluxioProperties.set(PropertyKey.MASTER_HOSTNAME,"bigdata")
val alluxioConfiguration = new InstancedConfiguration(alluxioProperties)
val fs = FileSystem.Factory.get(new Subject,alluxioConfiguration)
val path = new AlluxioURI(outpath);
if(fs.exists(path)){
//參考https://docs.alluxio.io/os/javadoc/stable/index.html
val options: DeletePOptions = DeletePOptions.newBuilder().setRecursive(true).build()
fs.delete(path,options)
}
sc.textFile(inpath)
.saveAsTextFile(outpath)
sc.stop()
}
}
spark提交任務
spark-submit \ --name alluxioApp \ --class com.jojo.AlluxioApp \ --master yarn \ --deploy-mode client \ --executor-memory 1G \ --num-executors 1 \ --jars /root/app/alluxio/client/alluxio-2.7.3-client.jar \ /root/job/alluxio/alluxio-1.0.jar \ alluxio://bigdata:19998/mnt/hdfs/data/baidu.com/baidu.com0911.log \ alluxio://bigdata:19998/mnt/hdfs/data/baidu.com/baidu.com0911.log.out
結果

