【注】該系列文章以及使用到安裝包/測試數據 可以在《傾情大奉送--Spark入門實戰系列》獲取
1、Tachyon介紹
1.1 Tachyon簡介
隨着實時計算的需求日益增多,分布式內存計算也持續升溫,怎樣將海量數據近乎實時地處理,或者說怎樣把離線批處理的速度再提升到一個新的高度是當前研究的重點。近年來,內存的吞吐量成指數倍增長,而磁盤的吞吐量增長緩慢,那么將原有計算框架中文件落地磁盤替換為文件落地內存,也是提高效率的優化點。
目前已經使用基於內存計算的分布式計算框架有:Spark、Impala及SAP的HANA等。但是其中不乏一些還是有文件落地磁盤的操作,如果能讓這些落地磁盤的操作全部落地到一個共享的內存中,那么這些基於內存的計算框架的效率會更高。
Tachyon是AmpLab的李浩源所開發的一個分布式內存文件系統,可以在集群里以訪問內存的速度來訪問存在Tachyon里的文件。Tachyon是架構在最底層的分布式文件存儲和上層的各種計算框架之間的一種中間件,其主要職責是將那些不需要落地到DFS里的文件落地到分布式內存文件系統中來達到共享內存,從而提高效率。同時可以減少內存冗余、GC時間等,Tachyon的在大數據中層次關系如下圖所示:
Tachyon允許文件以內存的速度在集群框架中進行可靠的共享,就像Spark和 MapReduce那樣。通過利用信息繼承、內存侵入,Tachyon獲得了高性能。Tachyon工作集文件緩存在內存中,並且讓不同的 Jobs/Queries以及框架都能以內存的速度來訪問緩存文件。因此,Tachyon可以減少那些需要經常使用數據集通過訪問磁盤來獲得的次數。
1.2 Tachyon系統架構
1.2.1 系統架構
Tachyon在Spark平台的部署:總的來說,Tachyon有三個主要的部件:Master, Client,與Worker。在每個Spark Worker節點上,都部署了一個Tachyon Worker,Spark Worker通過Tachyon Client訪問Tachyon進行數據讀寫。所有的Tachyon Worker都被Tachyon Master所管理,Tachyon Master通過Tachyon Worker定時發出的心跳來判斷Worker是否已經崩潰以及每個Worker剩余的內存空間量。
1.2.2 Tachyon Master結構
Tachyon Master的結構其主要功能如下:首先,Tachyon Master是個主管理器,處理從各個Client發出的請求,這一系列的工作由Service Handler來完成。這些請求包括:獲取Worker的信息,讀取File的Block信息,創建File等等;其次,Tachyon Master是個Name Node,存放着所有文件的信息,每個文件的信息都被封裝成一個Inode,每個Inode都記錄着屬於這個文件的所有Block信息。在Tachyon中,Block是文件系統存儲的最小單位,假設每個Block是256MB,如果有一個文件的大小是1GB,那么這個文件會被切為4個Block。每個Block可能存在多個副本,被存儲在多個Tachyon Worker中,因此Master里面也必須記錄每個Block被存儲的Worker地址;第三,Tachyon Master同時管理着所有的Worker,Worker會定時向Master發送心跳通知本次活躍狀態以及剩余存儲空間。Master是通過Master Worker Info去記錄每個Worker的上次心跳時間,已使用的內存空間,以及總存儲空間等信息。
1.2.3 Tachyon Worker結構
Tachyon Worker主要負責存儲管理:首先,Tachyon Worker的Service Handler處理來自Client發來的請求,這些請求包括:讀取某個Block的信息,緩存某個Block,鎖住某個Block,向本地內存存儲要求空間等等。第二,Tachyon Worker的主要部件是Worker Storage,其作用是管理Local Data(本地的內存文件系統)以及Under File System(Tachyon以下的磁盤文件系統,比如HDFS)。第三,Tachyon Worker還有個Data Server以便處理其他的Client對其發起的數據讀寫請求。當由請求達到時,Tachyon會先在本地的內存存儲找數據,如果沒有找到則會嘗試去其他的Tachyon Worker的內存存儲中進行查找。如果數據完全不在Tachyon里,則需要通過Under File System的接口去磁盤文件系統(HDFS)中讀取。
1.2.4 Tachyon Client結構
Tachyon Client主要功能是向用戶抽象一個文件系統接口以屏蔽掉底層實現細節。首先,Tachyon Client會通過Master Client部件跟Tachyon Master交互,比如可以向Tachyon Master查詢某個文件的某個Block在哪里。Tachyon Client也會通過Worker Client部件跟Tachyon Worker交互, 比如向某個Tachyon Worker請求存儲空間。在Tachyon Client實現中最主要的是Tachyon File這個部件。在Tachyon File下實現了Block Out Stream,其主要用於寫本地內存文件;實現了Block In Stream主要負責讀內存文件。在Block In Stream內包含了兩個不同的實現:Local Block In Stream主要是用來讀本地的內存文件,而Remote Block In Stream主要是讀非本地的內存文件。請注意,非本地可以是在其它的Tachyon Worker的內存文件里,也可以是在Under File System的文件里。
1.2.5 場景說明
現在我們通過一個簡單的場景把各個部件都串起來:假設一個Spark作業發起了一個讀請求,它首先會通過Tachyon Client去Tachyon Master查詢所需要的Block所在的位置。如果所在的Block不在本地的Tachyon Worker里,此Client則會通過Remote Block In Stream向別的Tachyon Worker發出讀請求,同時在Block讀入的過程中,Client也會通過Block Out Stream把Block寫入到本地的內存存儲里,這樣就可以保證下次同樣的請求可以由本機完成。
1.3 HDFS與Tachyon
HDFS(Hadoop Distributed File System)是一個分布式文件系統。HDFS具有高容錯性(fault-tolerant)特點,並且設計用來部署在低廉的硬件上。而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有着超大數據集(large data set)的應用程序。HDFS放寬了POSIX的要求,這樣可以實現以流的形式訪問(streaming access)文件系統中的數據。
HDFS采用Master/Slave架構。HDFS集群是由一個Namenode和一定數目的Datanode組成的。Namenode是一台中心服務器,負責管理文件系統的名字空間(namespace)以及客戶端對文件的訪問。集群中的Datanode一般是一個節點一個,負責管理它所在節點上的存儲。HDFS暴露了文件系統的名字空間,用戶能夠以文件的形式在上面存儲數據。從內部看,一個文件其實被分成一個或多個數據塊,這些塊存儲在一組Datanode上。Namenode執行文件系統的名字空間操作,比如打開、關閉、重命名文件或目錄,它也負責確定數據塊到具體Datanode節點的映射。Datanode負責處理文件系統客戶端的讀寫請求,在Namenode的統一調度下對數據塊進行創建、刪除和復制。
HDFS架構示意圖如下圖所示。
Namenode和Datanode被設計成可以在普通的商用機器上運行,這些機器一般運行着GNU/Linux操作系統。HDFS采用Java語言開發,因此任何支持Java的機器都可以部署Namenode或Datanode。由於采用了可移植性極強的Java語言,使得HDFS可以部署到多種類型的機器上。一個典型的部署場景是一台機器上只運行一個Namenode實例,而集群中的其他機器則分別運行一個Datanode實例。這種架構並不排斥在一台機器上運行多個Datanode,只不過這樣的情況比較少見。
集群中單一Namenode的結構大大簡化了系統的架構。Namenode是所有HDFS元數據的仲裁者和管理者,這樣用戶數據永遠不會流過Namenode。
對比HDFS和Tachyon,首先從兩者的存儲結構來看,HDFS設計為用來存儲海量文件的分布式系統,Tachyon設計為用來緩存常用數據的分布式內存文件系統。從這點來看,Tachyon可以認為是操作系統層面上的Cache,HDFS可以認為是磁盤。
在可靠性方面,HDFS采用副本技術來保證出現系統宕機等意外情況時文件訪問的一致性以及可靠性;而Tachyon是依賴於底層文件系統的可靠性來實現自身文件的可靠性的。由於相對於磁盤資源來說,內存是非常寶貴的,所以Tachyon通過在其underfs(一般使用HDFS)上寫入CheckPoint日志信息來實現對文件系統的可恢復性。
從文件的讀取以及寫入方式來看,Tachyon可以更好地利用本地模式來讀取文件信息,當文件讀取客戶端和文件所在的Worker位於一台機器上時,客戶端會直接繞過Worker直接讀取對應的物理文件,減少了本機的數據交互。而HDFS在遇到這樣的情況時,會通過本地Socket進行數據交換,這也會有一定的系統資源開銷。在寫入文件時,HDFS只能寫入磁盤,而Tachyon卻提供了5種數據寫入模式用以滿足不同需求。
2、Tachyon編譯部署
Tachyon目前的最新發布版為0.7.1,其官方網址為http://tachyon-project.org/。Tachyon文件系統有3種部署方式:單機模式、集群模式和高可用集群模式,集群模式相比於高可用集群模式區別在於多Master節點。下面將介紹單機和集群環境下去安裝、配置和使用Tachyon。
2.1 編譯Tachyon
2.1.1 下載並上傳源代碼
第一步 下載到Tachyon源代碼:
對於已經發布的版本可以直接從github下載Tachyon編譯好的安裝包並解壓,由於Tachyon與Spark版本有對應關系,另外該系列搭建環境為Spark1.1.0,對應下載Tachyon0.5.0,版本對應參考http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html描述:
下載地址為https://github.com/amplab/tachyon/releases ,為以下演示我們在這里下載的是tachyon-0.5.0.tar.gz源代碼包,文件大小為831K,如下圖所示:
第二步 在主節點上解壓縮
$cd /home/hadoop/upload/
$tar -xzf tachyon-0.5.0.tar.gz
第三步 把tachyon-0.5.0.tar.gz改名並移動到/app/complied目錄下
$mv tachyon-0.5.0 /app/complied/tachyon-0.5.0-src
$ll /app/complied
2.1.2編譯代碼
為了更好地契合用戶的本地環境,如Java版本、Hadoop版本或其他一些軟件包的版本,可以下載Tachyon源碼自行編譯。Tachyon開源在GitHub上,可以很方便地獲得其不同版本的源碼。Tachyon項目采用Maven進行管理,因此可以采用 mvn package 命令進行編譯打包。編譯Tachyon源代碼的時候,需要從網上下載依賴包,所以整個編譯過程機器必須保證在聯網狀態。編譯執行如下腳本:
$cd /app/complied/tachyon-0.5.0-src
$export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
$mvn clean package -Djava.version=1.7 -Dhadoop.version=2.2.0 -DskipTests
整個編譯過程編譯了約3個任務,整個過程耗時大約4分鍾。
使用如下命令查看編譯后該Tachyon項目大小為72M
$cd /app/complied/tachyon-0.5.0-src
$du -s /app/complied/tachyon-0.5.0-src
完成這一步后,我們就得到了能夠運行在用戶本地環境的Tachyon,下面我們分別介紹如何在單機和分布式環境下配置和啟動Tachyon,在進行部署之前先把編譯好的文件復制到/app/hadoop下並把文件夾命名為Tachyon-0.5.0:
$cd /app/complied
$cp -r tachyon-0.5.0-src /app/hadoop/tachyon-0.5.0
$ll /app/hadoop
2.2 單機部署Tachyon
這里要注意一點,Tachyon在單機(local)模式下啟動時會自動掛載RamFS,所以請保證使用的賬戶具有sudo權限。
【注】編譯好的Tachyon將本系列附屬資源/install中提供,具體名稱為10.tachyon-0.5.0-hadoop2.2.0-complied.zip
2.2.1 配置Tachyon
Tachyon相關配置文件在$TACHYON_HOME/conf目錄下,在workers文件中配置需要啟動TachyonWorker的節點,默認是localhost,所以在單機模式下不用更改(在Tachyon-0.5.0版本中,該文件為slaves)。在這里需要修改tachyon-env.sh配置文件,具體操作是將tachyon-env.sh.template復制為tachyon-env.sh:
$cd /app/hadoop/tachyon-0.5.0/conf
$cp tachyon-env.sh.template tachyon-env.sh
$ll
$vi tachyon-env.sh
並在tachyon-env.sh中修改具體配置,下面列舉了一些重要的配置項:
lJAVA_HOME:系統中java的安裝路徑
lTACHYON_MASTER_ADDRESS:啟動TachyonMaster的地址,默認為localhost,所以在單機模式下不用更改
lTACHYON_UNDERFS_ADDRESS:Tachyon使用的底層文件系統的路徑,在單機模式下可以直接使用本地文件系統,如"/tmp/tachyon",也可以使用HDFS,如"hdfs://ip:port"
lTACHYON_WORKER_MEMORY_SIZE:每個TachyonWorker使用的RamFS大小
2.2.2 格式化Tachyon
完成配置后即可以單機模式啟動Tachyon,啟動前需要格式化存儲文件,格式化和啟動Tachyon的命令分別為:
$cd /app/hadoop/tachyon-0.5.0/bin
$./tachyon format
存儲文件為$TACHYON_HOME/underfs/tmp/tachyon目錄下
2.2.3 啟動Tachyon
使用如下命令啟動Tachyon,可以看到在/nmt/ramdisk目錄下格式化RamFS
$cd /app/hadoop/tachyon-0.5.0/bin
$./tachyon-start.sh local
2.2.4 驗證啟動
使用JPS命令查看Tachyon進程,分別為:TachyonWorker和TachyonMaster
查看Tachyon監控頁面,訪問地址為http://hadoop1:19999
2.2.5 停止Tachyon
停止Tachyon的命令為:
$cd /app/hadoop/tachyon-0.5.0/bin
$./tachyon-stop.sh
2.3 集群模式部署Tachyon
2.3.1 集群環境
集群包含三個節點(該集群環境可以參考第二課《2.Spark編譯與部署(上)--基礎環境搭建》進行搭建),運行進程分布如下:
序號 |
機器名 |
運行進程 |
核數/內存 |
用戶名 |
目錄 |
|
1 |
192.168.0.61 |
hadoop1 |
TachyonMaster TachyonWorker |
1核/3G |
hadoop |
/app /app/hadoop /app/hadoop/Tach... |
2 |
192.168.0.62 |
hadoop2 |
TachyonWorker |
1核/2G |
hadoop |
|
3 |
192.168.0.63 |
hadoop3 |
TachyonWorker |
1核/2G |
hadoop |
2.3.2 配置conf/worker
Tachyon相關配置文件在$TACHYON_HOME/conf目錄下,對slaves文件中配置需要啟動TachyonWorker的節點,在這里需要設置hadoop1、hadoop2和hadoop3三個節點:
$cd /app/hadoop/tachyon-0.5.0/conf
$vi slaves
2.3.3 配置conf/tachyon-env.sh
在$TACHYON_HOME/conf目錄下,將tachyon-env.sh.template復制為tachyon-env.sh,並在achyon-env.sh中修改具體配置。不同於單機模式,這里需要修改TachyonMaster地址以及底層文件系統路徑:
$cd /app/hadoop/tachyon-0.5.0/conf
$cp tachyon-env.sh.template tachyon-env.sh
$vi tachyon-env.sh
在該文件中修改一下兩個參數,這里使用底層文件系統為HDFS:
export TACHYON_MASTER_ADDRESS=hadoop1
export TACHYON_UNDERFS_ADDRESS=hdfs://hadoop1:9000
2.3.4 向各個節點分發Tachyon
使用如下命令把hadoop文件夾復制到hadoop2和hadoop3機器
$cd /app/hadoop/
$scp -r tachyon-0.5.0 hadoop@hadoop2:/app/hadoop/
$scp -r tachyon-0.5.0 hadoop@hadoop3:/app/hadoop/
2.3.5 啟動HDFS
$cd /app/hadoop/hadoop-2.2.0/sbin
$./start-dfs.sh
2.3.6 格式化Tachyon
啟動前需要格式化存儲文件,格式化命令為:
$cd /app/hadoop/tachyon-0.5.0/bin
$./tachyon format
可以看到在HDFS的/tmp創建了tachyon文件夾
2.3.7 啟動Tachyon
在這里使用SudoMout參數,需要在啟動過程中輸入hadoop的密碼,具體過程如下:
$cd /app/hadoop/tachyon-0.5.0/bin
$./tachyon-start.sh all SudoMount
啟動Tachyon有了更多的選項:
l./tachyon-start.sh all Mount在啟動前自動掛載TachyonWorker所使用的RamFS,然后啟動TachyonMaster和所有TachyonWorker。由於直接使用mount命令,所以需要用戶為root;
l./tachyon-start.sh all SudoMount在啟動前自動掛載TachyonWorker所使用的RamFS,然后啟動TachyonMaster和所有TachyonWorker。由於使用sudo mount命令,所以需要用戶有sudo權限;
l./tachyon-start.sh all NoMount認為RamFS已經掛載好,不執行掛載操作,只啟動TachyonMaster和所有TachyonWorker
因此,如果不想每次啟動Tachyon都掛載一次RamFS,可以先使用命令./tachyon-mount.sh Mount workers 或./tachyon-mount.sh SudoMount workers掛載好所有RamFS,然后使用./tachyon-start.sh all NoMount 命令啟動Tachyon。
單機和集群式模式的區別就在於節點配置和啟動步驟,事實上,也可以在集群模式下只設置一個TachyonWorker,此時就成為偽分布模式。
2.3.8 驗證啟動
使用JPS命令查看Tachyon進程,分別為:TachyonWorker和TachyonMaster
可以在瀏覽器內打開Tachyon的WebUI,如 http://hadoop1:19999,查看整個Tachyon的狀態,各個TachyonWorker的運行情況、各項配置信息和瀏覽文件系統等。
$cd /app/hadoop/tachyon-0.5.0/bin
$./tachyon runTests
2.4 Tachyon的配置
這里以0.5.0版本為例,介紹Tachyon中可配置參數的具體含義。Tachyon中的可配置項分為兩類,一種是系統環境變量,用於在不同腳本間共享配置信息;另一種是程序運行參數,通過-D選項傳入運行Tachyon的JVM中。程序運行參數又分為:
l 通用配置(Common Configuration)
l TachyonMaster配置(Master Configuration)
l TachyonWorker配置(Worker Configuration)
l 用戶配置(User Configuration)
要修改或添加這些可配置項,可修改conf/tachyon-env.sh文件。
2.4.1 Tachyon環境變量
配置項 |
配置項說明 |
JAVA_HOME |
系統中JDK的安裝路徑 |
TACHYON_RAM_FOLDER |
配置ramfs掛載的文件目錄,默認為/mnt/ramdisk |
TACHYON_MASTER_ADDRESS |
啟動TachyonMaster的地址,默認為localhost,所以在單機模式下不用更改 |
TACHYON_UNDERFS_ADDRESS |
Tachyon使用的底層文件系統的路徑,本地文件系統(單機模式下),如"/tmp/tachyon",或HDFS,如"hdfs://ip:port" |
TACHYON_WORKER_MEMORY_SIZE |
每個TachyonWorker使用的RamFS大小,默認為1GB |
2.4.2 Tachyon通用配置
配置項 |
配置項說明 |
tachyon.underfs.address |
Tachyon在底層文件系統的的路徑,默認為$TACHYON_UNDERFS_ADDRESS |
tachyon.home |
Tachyon的安裝路徑,啟動Tachyon時為當前 tachyon 文件夾的路徑 |
tachyon.data.folder |
Tachyon數據在底層文件系統的存放路徑,默認為$TACHYON_UNDERFS_ADDRESS/tmp/tachyon/data |
tachyon.workers.folder |
TachyonWorkers在底層文件系統的工作路徑,默認為$TACHYON_UNDERFS_ADDRESS/tmp/tachyon/workers |
tachyon.usezookeeper |
TachyonMaster是否使用ZooKeeper容錯,默認為false |
tachyon.zookeeper.adress |
如果啟用,ZooKeeper的地址 |
tachyon.zookeeper.election.path |
如果啟用,Zookeeper的election文件夾路徑,默認為/election |
tachyon.zookeeper.leader.path |
如果啟用,Zookeeper的leader文件夾路徑,默認為/leader |
tachyon.underfs.hdfs.impl |
實現HDFS的類,默認org.apache.hadoop.hdfs,DistributedFileSystem |
tachyon.max.columns |
Tachyon中RawTable允許的最大列數,默認為1000 |
tachyon.table.metadata.byte |
Tachyon中RawTable元數據允許存儲的最大字節數,默認為5242880,即5MB |
tachyon.underfs.glusterfs.impl |
如果使用GlusterFS為底層文件系統,實現GlusterFS的類,默認為org.apache.hadoop.fs.glusterfs.GlusterFileSystem |
tachyon.underfs.glusterfs.mounts |
如果使用GlusterFS為底層文件系統,GlusterFS卷的掛載目錄 |
tachyon.underfs.glusterfs.volumes |
如果使用GlusterFS為底層文件系統,GlusterFS的卷名 |
tachyon.underfs.glusterfs.mapred.system.dir |
如果使用GlusterFS為底層文件系統,GlusterFS用於存放MapReduce中間數據的可選子目錄,默認為glusterfs:///mapred/system |
tachyon.web.resources |
Tachyon WebUI可用的資源,默認為$tachyon.home/core/src/main/webapp |
tachyon.async.enabled |
是否啟用異步模式,默認為false |
tachyon.underfs.hadoop.prefixes |
底層使用hadoop文件系統的前綴列表,默認為"hdfs://","s3://","s3n://","glusterfs:///" |
tachyon.test.mode |
是否啟用測試模式,默認為false |
tachyon.master.retry |
連接重試次數,默認為29 |
2.4.3 TachyonMaster配置
配置項 |
配置項說明 |
tachyon.master.worker.timeout.ms |
TachyonMaster和TachyonWorker心跳包失效時長,默認為60000ms |
tachyon.master.journal.folder |
TachyonMaster的journal日志存放路徑,默認為$TACHYON_HOME/journal/ |
tachyon.master.hostname |
TachyonMaster的主機名 |
tachyon.master.port |
TachyonMaster的遠程調用通訊端口,默認為19998 |
tachyon.master.web.port |
TachyonMaster的WebUI端口,默認為19999 |
tachyon.master.web.threads |
TachyonMaster的WebUI線程數,默認為9 |
tachyon.master.whitelist |
可緩存的路徑前綴列表,列表以逗號隔開,表示該路徑下的文件能夠被緩存至內存,默認為/,即根目錄 |
tachyon.master.temporary.folder |
TachyonMaster的臨時文件夾,默認為/tmp |
tachyon.master.heartbeat.interval.ms |
TachyonMaster心跳包間隔時間,默認為1000ms |
tachyon.master.selector.threads |
TachyonMaster的thrift監聽線程數,默認為3 |
tachyon.master.queue.size.per.selector |
TachyonMaster的thrift消息隊列長度,默認為3000 |
tachyon.master.server.threads |
TachyonMaster節點的thrift服務線程數,默認為CPU核數的2倍 |
tachyon.master.pinlist |
常駐內存的文件列表,以逗號隔開,表示該路徑下的文件不會從內存中剔除,默認為null |
2.4.4 TachyonWorker配置
配置項 |
配置項說明 |
tachyon.worker.data.folder |
TachyonWorker在RamFS中的工作路徑,默認為$TACHYON_RAM_FOLDER/tachyonworker/ |
tachyon.work.port |
TachyonWorker的遠程調用通訊端口,默認為29998 |
tachyon.worker.data.port |
TachyonWorker的數據傳輸服務的端口,默認為29999 |
tachyon.worker.memory.size |
TachyonWorker所使用的RamFS大小,默認為$TACHYON_WORKER_MEMORY_SIZE |
tachyon.worker.heartbeat.timeout.ms |
TachyonWorker心跳包失效的時長,默認為10000ms |
tachyon.worker.to.master.heartbeat.interval.ms |
TachyonWorker向TachyonMaster發送心跳包的時間間隔,默認為1000ms |
tachyon.worker.selector.threads |
TachyonWorker的thrift監聽線程數,默認為3 |
tachyon.worker.queue.size.per.selector |
TachyonWorker的thrift消息隊列長度,默認為3000 |
tachyon.worker.server.threads |
TachyonWorker的thrift服務線程數,默認為CPU核數 |
tachyon.worker.user.timeout.ms |
TachyonWorker和用戶之間心跳包失效時長,默認為10000ms |
tachyon.worker.checkpoint.threads |
TachyonWorker的checkpoint線程數,默認為1 |
tachyon.worker.per.thread.checkpoint.cap.mb.sec |
TachyonWorker的checkpoint的速度,默認為1000MB/s |
tachyon.worker.network.type |
TachyonWorker在傳輸文件數據時使用的傳輸方式,默認為NETTY,可選為NIO或NETTY |
2.4.5 用戶配置
配置項 |
配置項說明 |
tachyon.user.failed.space.request.limits |
用戶向文件系統請求空間失敗時的最大重試次數,默認為3 |
tachyon.user.quota.unit.bytes |
客用戶一次向TachyonWorker請求的最少字節數,默認為8388608,即8MB |
tachyon.user.file.buffer.byte |
用戶讀寫文件時的緩存區大小,默認為1048576,即1MB |
tachyon.user.default.block.size.byte |
用戶創建文件時的默認塊大小,默認為1073741824,即1GB |
tachyon.user.remote.read.buffer.size.byte |
用戶讀遠程文件時的緩沖區大小,默認為1048576,即1MB |
tachyon.user.heartbeat.interval.ms |
用戶心跳包時間間隔,默認為1000ms |
tachyon.user.file.writetype.default |
用戶在使用tachyon.hadoop.TFS時的默認寫類型,默認為CACHE_THROUGH |
3、Tachyon命令行使用
Tachyon的命令行界面讓用戶可以對文件系統進行基本的操作。調用命令行工具使用以下腳本:
$./tachyon tfs
文件系統訪問的路徑格式如下:
tachyon://<master node address>:<master node port>/<path>
在Tachyon命令行使用中tachyon://<master node address>:<master node port>前綴可以省略,該信息從配置文件中讀取。
3.1 接口說明
可以通過如下命令查看Tachyon所有接口命令
$cd /app/hadoop/tachyon-0.5.0/bin
$./tachyon tfs -help
其中大部分的命令含義可以參考Linux下同名命令,命令含義:
命令 |
含義 |
cat |
將文件內容輸出到控制台 |
count |
顯示匹配指定的前綴“路徑”的文件夾和文件的數量。 |
ls |
列出指定路徑下所有的文件和目錄信息,如大小等。 |
lsr |
遞歸地列出指定路徑下所有的文件和目錄信息,如大小等。 |
mkdir |
在給定的路徑創建一個目錄,以及任何必要的父目錄。如果路徑已經存在將會失敗。 |
rm |
刪除一個文件。如果是一個目錄的路徑將會失敗。 |
rmr(0.5.0版本不包含) |
刪除一個文件或目錄,以及該目錄下的所有文件夾和文件 |
tail |
輸出指定文件的最后1 kb到控制台。 |
touch |
在指定的路徑創建一個0字節的文件。 |
mv |
移動指定的源文件或源目錄到一個目的路徑。如果目的路徑已經存在將會失敗。 |
copyFromLocal |
將本地指定的路徑復制到Tachyon中指定的路徑。如果Tachyon中指定的路徑已經存在將會失敗。 |
copyToLocal |
從Tachyon中指定的路徑復制本地指定的路徑。 |
fileinfo |
輸出指定文件的塊信息。 |
location |
輸出存放指定文件的所在節點列表信息。 |
report |
向master報告文件丟失 |
request |
根據指定的dependency ID,請求文件。 |
pin |
將指定的路徑常駐在內存中。如果指定的是一個文件夾,會遞歸地包含所有文件以及任何在這個文件夾中新創建的文件。 |
unpin |
撤銷指定路徑的常駐內存狀態。如果指定的是一個文件夾,會遞歸地包含所有文件以及任何在這個文件夾中新創建的文件。 |
Free(0.5.0版本不包含) |
釋放一個文件或一個文件夾下的所有文件的內存。文件/文件夾在underfs仍然是可用的。 |
3.2 接口操作示例
在操作之前需要把$TACHYON_HOME/bin配置到/etc/profile 配置文件的PATH中,並通過source /etc/profile生效
3.2.1 copyFromLocal
將本地$TACHYON_HOME/conf目錄拷貝到Tachyon文件系統的根目錄下的conf子目錄
$cd /app/hadoop/tachyon-0.5.0/bin
$./tachyon tfs copyFromLocal ../conf /conf
$./tachyon tfs ls /conf
3.2.2 copyToLocal
把Tachyon文件系統文件復制到本地,需要注意的是命令中的src必須是Tachyon文件系統中的文件不支持目錄拷貝,否則報錯無法復制
$mkdir -p /home/hadoop/upload/class10/conflocal
$./tachyon tfs copyToLocal /conf /home/hadoop/upload/class10/conflocal
$./tachyon tfs copyToLocal /conf/tachyon-env.sh /home/hadoop/upload/class10/conflocal/tachyon-env.sh
$ll /home/hadoop/upload/class10/conflocal
3.2.3 ls和lsr
使用ls和lsr命令查看Tachyon文件系統下的文件信息,其中lsr命令可以遞歸地查看子目錄。
$./tachyon tfs ls /conf
$./tachyon tfs ls tachyon://hadoop1:19998/conf
$./tachyon tfs lsr /
3.2.4 count
統計當前路徑下的目錄、文件信息,包括文件數、目錄樹以及總的大小
$./tachyon tfs count /
3.2.5 cat
查看指定文件的內容
$./tachyon tfs cat /conf/slaves
$./tachyon tfs cat tachyon://hadoop1:19998/conf/slaves
3.2.6 mkdir、rm、rmr和touch
(1)mkdir:創建目錄,支持自動創建不存在的父目錄;
(2)rm:刪除文件,不能刪除目錄,注意,遞歸刪除根目錄是無效的
(3)rmr:刪除目錄,支持遞歸,包含子目錄和文件,其中0.5.0版本不提供該命令
(4)touch:創建文件,不能創建已經存在的文件。
$./tachyon tfs mkdir /mydir
$./tachyon tfs ls /
$./tachyon tfs rm /mydir
$./tachyon tfs touch /mydir/my.txt
$./tachyon tfs lsr /mydir
$./tachyon tfs rm /mydir/my.txt
$./tachyon tfs touch /mydir2/2/2/my.txt
$./tachyon tfs lsr /mydir2
$./tachyon tfs rm /mydir2
$./tachyon tfs rm /
$./tachyon tfs ls /
3.2.7 pin和unpin
pin命令將指定的路徑常駐在內存中,如果指定的是一個文件夾會遞歸地包含所有文件以及任何在這個文件夾中新創建的文件。unpin命令撤銷指定路徑的常駐內存狀態。
pin執行前或unpin執行后的Web Interface界面
$./tachyon tfs pin /conf/log4j.properties
$./tachyon tfs unpin /conf/log4j.properties
4、Tachyon實戰應用
4.1 配置及啟動環境
4.1.1 修改spark-env.sh
修改$SPARK_HOME/conf目錄下spark-env.sh文件:
$cd /app/hadoop/spark-1.1.0/conf
$vi spark-env.sh
在該配置文件中添加如下內容:
export SPARK_CLASSPATH=/app/hadoop/tachyon-0.5.0/client/target/tachyon-client-0.5.0-jar-with-dependencies.jar:$SPARK_CLASSPATH
4.1.2 啟動HDFS
$cd /app/hadoop/hadoop-2.2.0/sbin
$./start-dfs.sh
4.1.3 啟動Tachyon
在這里使用SudoMout參數,需要在啟動過程中輸入hadoop的密碼,具體過程如下:
$cd /app/hadoop/tachyon-0.5.0/bin
$./tachyon-start.sh all SudoMount
4.2 Tachyon上運行Spark
4.2.1 添加core-site.xml
在Tachyon的官方文檔說Hadoop1.X集群需要添加該配置文件(參見http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html),實際在Hadoop2.2.0集群測試的過程中發現也需要添加如下配置文件,否則無法識別以tachyon://開頭的文件系統,具體操作是在$SPARK_HOME/conf目錄下創建core-site.xml文件
$cd /app/hadoop/spark-1.1.0/conf
$touch core-site.xml
$vi core-site.xml
在該配置文件中添加如下內容:
<configuration>
<property>
<name>fs.tachyon.impl</name>
<value>tachyon.hadoop.TFS</value>
</property>
</configuration>
4.2.2 啟動Spark集群
$cd /app/hadoop/spark-1.1.0/sbin
$./start-all.sh
4.2.3 讀取文件並保存
第一步 准備測試數據文件
使用Tachyon命令行准備測試數據文件
$cd /app/hadoop/tachyon-0.5.0/bin
$./tachyon tfs copyFromLocal ../conf/tachyon-env.sh /tachyon-env.sh
$./tachyon tfs ls /
第二步 啟動Spark-Shell
$cd /app/hadoop/spark-1.1.0/bin
$./spark-shell
第三步 對測試數據文件進行計數並另存
對前面放入到Tachyon文件系統的文件進行計數
scala>val s = sc.textFile("tachyon://hadoop1:19998/tachyon-env.sh")
scala>s.count()
把前面的測試文件另存為tachyon-env-bak.sh文件
scala>s.saveAsTextFile("tachyon://hadoop1:19998/tachyon-env-bak.sh")
第四步 在Tachyon的UI界面查看
可以查看到該文件在Tachyon文件系統中保存成tahyon-env-bak.sh文件夾
該文件夾中包含兩個文件,分別為part-00000和part-00001:
其中tahyon-env-bak.sh/part-0001文件中內容如下:
另外通過內存存在文件的監控頁面可以觀測到,這幾個操作文件在內存中:
4.3 Tachyon運行MapReduce
4.3.1 修改core-site.xml
該配置文件為$Hadoop_HOME/conf目錄下的core-site.xml文件
$cd /app/hadoop/hadoop-2.2.0/etc/hadoop
$vi core-site.xml
修改core-site.xml文件配置,添加如下配置項:
<property>
<name>fs.tachyon.impl</name>
<value>tachyon.hadoop.TFS</value>
</property>
<property>
<name>fs.tachyon-ft.impl</name>
<value>tachyon.hadoop.TFSFT</value>
</property>
4.3.2 啟動YARN
$cd /app/hadoop/hadoop-2.2.0/sbin
$./start-yarn.sh
4.3.3 運行MapReduce例子
第一步 創建結果保存目錄
$cd /app/hadoop/hadoop-2.2.0/bin
$./hadoop fs -mkdir /class10
第二步 運行MapReduce例子
$cd /app/hadoop/hadoop-2.2.0/bin
$./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount -libjars $TACHYON_HOME/client/target/tachyon-client-0.5.0-jar-with-dependencies.jar tachyon://hadoop1:19998/tachyon-env.sh hdfs://hadoop1:9000/class10/output
第三步 查看結果
查看HDFS,可以看到在/class10中創建了output目錄
查看part-r-0000文件內容,為tachyon-env.sh單詞計數
5 、參考資料
(1)《Tachyon:Spark生態系統中的分布式內存文件系統》 http://www.csdn.net/article/2015-06-25/2825056
(2)《Tachyon的安裝、配置和使用》 http://blog.csdn.net/u014252240/article/details/42238081
(3)Tachyon官方網站http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html