- Spark大數據商業實戰三部曲:內核解密|商業案例|性能調優
- 王家林
- 2009字
- 2019-12-12 17:30:05
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?,F有的數據分析應用程序,如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/)進行學習。