Tachyon的安裝、配置和使用

0. 前言

在上一篇博文《Tachyon簡介》中,我們簡要地介紹了Tachyon,一個以內存爲中心的分佈式文件系統,及其一些基本工作原理。這一次,我們重點介紹如何在你自己的單機或集羣環境下去安裝、配置和使用Tachyon。具體地,會從怎樣編譯源碼開始,到各項配置、命令的說明,再加上API的使用舉例,讓大家能夠一步步地把Tachyon用起來。

版本選擇

Tachyon目前的最新發布版爲0.5.0,最新開發版爲0.6.0-SNAPSHOT。由於兩者向上層提供的API有了不小的差異,這裏以最新的0.6.0-SNAPSHOT開發版爲基礎進行介紹。它具有更多功能,更多新特性,更方便用戶使用。在介紹時,我們也會標註出那些和0.5.0版本兼容的部分,讓大家能夠同時Hold住不同的版本。

官方資料:Tachyon-0.5.0最新開發版。(本文章介紹的Tachyon基於的版本是0.6.0-SNAPSHOT,2014-12-27)

1. Tachyon的安裝

由於目前Tachyon使用了RamFS作爲內存層,因此推薦在Linux環境下安裝Tachyon。

第①步——下載&編譯

對於已經發布的版本,如Tachyon-0.5.0或更早的版本,可以直接下載已經編譯好的包,並解壓。下載地址爲https://github.com/amplab/tachyon/releases

爲了更好地契合用戶的本地環境,如java版本、hadoop版本或其他一些軟件包的版本,可以下載Tachyon源碼自行編譯。Tachyon開源在GitHub上,可以很方便地獲得其不同版本的源碼:Tachyon-0.5.0最新開發版。Tachyon項目採用Maven進行管理,因此可以採用 mvn package 命令進行編譯打包。在Tachyon-0.6.0-SNAPSHOT版本中,默認依賴的java版本爲1.6,默認依賴的hadoop版本爲1.0.4,如果要更改這些依賴的版本號可以在編譯時加入選項,如:

mvn clean package -Djava.version=1.7 -Dhadoop.version=2.3.0 -DskipTests


完成這一步後,我們就得到了能夠運行在用戶本地環境的Tachyon,下面我們分別介紹如何在單機和分佈式環境下配置和啓動Tachyon。

1.1 單機安裝Tachyon

這裏要注意一點,Tachyon在單機(local)模式下啓動時會自動掛載RamFS,所以請保證使用的賬戶具有sudo權限。

第②步——配置

conf/workers文件中配置需要啓動TachyonWorker的節點,默認是localhost,所以在單機模式下不用更改。(在Tachyon-0.5.0版本中,該文件爲conf/slaves

conf/tachyon-env.sh.template複製爲conf/tachyon-env.sh,並在conf/tachyon-env.sh中修改具體配置,下面列舉了一些重要的配置項,稍後會詳細地介紹更多的配置項。

  • JAVA_HOME —— 系統中java的安裝路徑

  • TACHYON_MASTER_ADDRESS —— 啓動TachyonMaster的地址,默認爲localhost,所以在單機模式下不用更改

  • TACHYON_UNDERFS_ADDRESS —— Tachyon使用的底層文件系統的路徑,在單機模式下可以直接使用本地文件系統,如"/tmp/tachyon",也可以使用HDFS,如"hdfs://ip:port"

  • TACHYON_WORKER_MEMORY_SIZE —— 每個TachyonWorker使用的RamFS大小

第③步——啓動

完成配置後,即可以單機模式啓動Tachyon,格式化、啓動和停止Tachyon的命令分別爲:

bin/tachyon format  

bin/tachyon-start.sh local  

bin/tachyon-stop.sh  

1.2 分佈式安裝Tachyon

這裏我們以一個三個節點的集羣爲例,分別爲slave201,slave202和slave203。三個節點都運行TachyonWorker,slave201運行TachyonMaster。

第②步——配置(該過程在TachyonMaster節點,即slave201上完成)

conf/workers文件中配置需要啓動TachyonWorker的節點,即


slave201  

slave202  

slave203  

conf/tachyon-env.sh.template複製爲conf/tachyon-env.sh,並在conf/tachyon-env.sh中修改具體配置。不同於單機模式,這裏需要修改TachyonMaster地址以及底層文件系統路徑


export TACHYON_MASTER_ADDRESS=slave201  

export TACHYON_UNDERFS_ADDRESS=hdfs://slave201:9000  

完成配置文件的修改後,將整個tachyon文件夾複製到每個節點的相同路徑下


scp –r tachyon-master slave202:/home/.../  

scp –r tachyon-master slave203:/home/.../  


第③步——啓動

在分佈式模式下,格式化和停止Tachyon的命令仍然爲:


bin/tachyon format  

bin/tachyon-stop.sh  

但啓動Tachyon有了更多的選項:


  • bin/tachyon-start.sh all Mount #在啓動前自動掛載TachyonWorker所使用的RamFS,然後啓動TachyonMaster和所有TachyonWorker。由於直接使用mount命令,所以需要用戶爲root

  • bin/tachyon-start.sh all SudoMount #在啓動前自動掛載TachyonWorker所使用的RamFS,然後啓動TachyonMaster和所有TachyonWorker。由於使用sudo mount命令,所以需要用戶有sudo權限

  • bin/tachyon-start.sh all NoMount #認爲RamFS已經掛載好,不執行掛載操作,只啓動TachyonMaster和所有TachyonWorker


因此,如果不想每次啓動Tachyon都掛載一次RamFS,可以先使用命令 bin/tachyon-mount.sh Mount workers 或 bin/tachyon-mount.sh SudoMount workers 掛載好所有RamFS,然後使用 bin/tachyon-start.sh all NoMount 命令啓動Tachyon。

單機和分佈式模式的區別就在於配置和啓動步驟,事實上,也可以在分佈式模式下只設置一個TachyonWorker(僞分佈式),在這種情況下兩者就基本一樣了。

第④步——查看&測試

啓動Tachyon後,可以用 jps 命令查看TachyonMaster和TachyonWorker進程是否存在


也可以在瀏覽器內打開Tachyon的WebUI,如 http://slave201:19999 ,查看整個Tachyon的狀態,各個TachyonWorker的運行情況,各項配置信息,瀏覽文件系統等。


此外,還能在任一啓動了TachyonWorker的節點上執行 bin/tachyon runTests 命令來測試Tachyon是否運行正常。

步驟①-④即完成了Tachyon的安裝和啓動,之後我們也會給出具體地如何使用Tachyon。

2. Tachyon的配置

Tachyon的可配置項遠不止上面步驟②的配置文件中的那些,用戶可以根據自己的需求更改Tachyon的各項配置。這裏以0.6.0-SNAPSHOT版本爲例,介紹Tachyon中可配置參數的具體含義。(Tachyon-0.5.0的可配置項基本上是Tachyon-0.6.0-SNAPSHOT的一個子集)

Tachyon中的可配置項分爲兩類,一種是系統環境變量,用於在不同腳本間共享配置信息;另一種是程序運行參數,通過-D選項傳入運行Tachyon的JVM中。程序運行參數又分爲通用配置(Common Configuration)、TachyonMaster配置(Master Configuration)、TachyonWorker配置(Worker Configuration)和用戶配置(User Configuration)。要修改或添加這些可配置項,請修改conf/tachyon-env.sh文件。

2.1 Tachyon環境變量

  • JAVA_HOME:系統中java的安裝路徑

  • 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.2 通用配置

  • 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.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 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.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良好的設計和兼用性,用戶可以很方便地將現有的利用HDFS進行存儲的程序移植至Tachyon。同時,Tachyon也提供了自己的命令行工具和一套完整的文件系統API,用戶可以靈活地使用Tachyon。

3.1 從HDFS到Tachyon

對於現有的運行在Hadoop MapReduce或者Spark上,使用 "hdfs://ip:port/" 爲存儲路徑的程序,能夠很方便地移植至Tachyon。

3.1.1 Hadoop MapReduce

  • 將tachyon-client jar包添加至$HADOOP_CLASSPATH,jar包位於 tachyon/client/target/tachyon-client-0.6.0-SNAPSHOT-jar-with-dependencies.jar(如果是Tachyon-0.5.0,則文件名爲tachyon-client-0.5.0-jar-with-dependencies.jar

  • 添加配置項<”fs.tachyon.impl”, ” tachyon.hadoop.TFS”>,可以在core-site.xml文件中添加,也可以在程序中使用Configuration.set()方法添加

  • 將原有的”hdfs://ip:port/path”路徑更改爲”tachyon://ip:port/path”

3.1.2 Spark

同樣地,添加依賴包,添加配置項,然後更改文件系統路徑。

額外地,添加配置項<”spark.tachyonStore.url”, “tachyon://ip:port/”>後,能夠使用”rdd.persist(StorageLevel.OFF_HEAP)”語句將Spark RDD緩存至Tachyon中以減少Java GC的開銷。

3.2 命令行工具

Tachyon提供了命令行工具爲用戶提供了簡單的交互功能,使用方式爲


bin/tachyon tfs [COMMAND]  

具體的命令有:

  • cat:將文件內容輸出到控制檯

  • count:輸出符合路徑前綴的文件總數

  • ls:輸出目錄中的文件信息

  • lsr:遞歸輸出目錄中的文件信息

  • mkdir:創建指定目錄包括路徑中的父目錄,如果目錄已經存在則創建失敗

  • rm:刪除文件或者目錄

  • tail:將文件的最末1KB輸出到控制檯

  • touch:在指定的位置創建空的文件

  • mv:將文件移動到指定位置

  • copyFromLocal:將文件從本地文件系統拷貝到Tachyon文件系統指定位置

  • copyToLocal:將文件從Tachyon文件系統拷貝到本地文件系統指定位置

  • fileinfo:打印指定文件的塊信息

  • pin:將指定文件常駐內存

  • unpin:將常駐內存的文件撤銷常駐狀態

3.3 Java API

Tachyon是用Java開發實現的,因此提供的API也是Java函數。要使用這些API需要依賴tachyon-client jar包,位於 tachyon/client/target/tachyon-client-0.6.0-SNAPSHOT-jar-with-dependencies.jar (如果是Tachyon-0.5.0,則文件名爲tachyon-client-0.5.0-jar-with-dependencies.jar)此外,如果是已發佈的Tachyon-0.5.0並且目標項目由Maven管理,可以在 pom.xml 文件中添加如下內容以獲取依賴包:


<dependency>  

          <groupId>org.tachyonproject</groupId>  

          <artifactId>tachyon-client</artifactId>  

          <version>0.5.0</version>  

 </dependency>  

(Tachyon-0.5.0和Tachyon-0.6.0-SNAPSHOT提供的Java API一大不同之處在於Tachyon-0.6.0-SNAPSHOT中新增了tachyon.TachyonURI類,用來表示Tachyon文件系統中的路徑,類似於Hadoop中的org.apache.hadoop.fs.Path。Tachyon-0.5.0中的大部分API在Tachyon-0.6.0-SNAPSHOT中仍然存在,但被標記爲@Deprecated

Tachyon的Java API功能大部分集中於tachyon.client.TachyonFStachyon.client.TachyonFile兩個類中

3.3.1 TachyonFS

 

//獲取TachyonFS對象
public static TachyonFS get(String tachyonPath) throws IOException
public static TachyonFS get(final TachyonURI tachyonURI) throws IOException
public static TachyonFS get(String masterHost, int masterPor boolean zookeeperMode) throws IOException

//創建Tachyon文件
public int createFile(String path) throws IOException
public int createFile(TachyonURI path, TachyonURI ufsPath, long blockSizeByte,boolean recursive) throws IOException

//刪除Tachyon文件	
public boolean delete(String path,boolean recursive) throws IOException
public boolean delete(int fileId, TachyonURI path, boolean recursive) throws IOException

//判斷文件是否存在
public boolean exist(TachyonURI path) throws IOException

//獲取TachyonFile對象
public TachyonFile getFile(int fid) throws IOException
public TachyonFile getFile(int fid,boolean useCachedMetadata) throws IOException
public TachyonFile getFile(String path) throws IOException
public TachyonFile getFile(TachyonURI path) throws IOException
public TachyonFile getFile(String path,boolean useCachedMetadata) throws IOException
public TachyonFile getFile(TachyonURI path, boolean useCachedMetadata) throws IOException

//判斷文件是否爲目錄
boolean isDirectory(int fid)

//獲取文件狀態信息
public ClientFileInfo getFileStatus(int fileId, TachyonURI path) throws IOException
public ClientFileInfo getFileStatus(int fileId, boolean useCachedMetadata) throws IOException
public ClientFileInfo getFileStatus(int fileId, TachyonURI path,boolean useCachedMetadata) throws IOException

//列出指定目錄下的文件信息,如果是文件則列出該文件的文件信息
public List<ClientFileInfo> listStatus(TachyonURI path) throws IOException			

//創建指定的目錄
public boolean mkdirs(TachyonURI path, boolean recursive) throws IOException         

//重命名文件
public boolean rename(int fileId, TachyonURI srcPath, TachyonURI dstPath) throws IOException

//設置文件是否常駐內存
public void setPinned(int fid,boolean pinned) throws IOException

//設置文件常駐內存
public void pinFile(int fid) throws IOException

//取消文件常駐內存狀態
public void unpinFile(int fid) throws IOException

//判斷文件是否常駐內存
public boolean isPinned(int fid,boolean useCachedMetadata) throws IOException

3.3.2 TachyonFile

//獲取TachyonFile的輸入流,ReadType的類型爲CACHE或NO_CACHE
public InStream getInStream(ReadType readType) throws IOException

//獲取TachyonFile的輸出流,WriteType的類型爲MUST_CACHE,TRY_CACHE,CACHE_THROUGH,THROUGH或ASYNC_THROUGH
public OutStream getOutStream(WriteType writeType) throws IOException

//獲取文件的路徑
public String getPath()

//獲取底層文件系統的配置
public Object getUFSConf()

//判斷文件是否完整
public boolean isComplete() throws IOException

//判斷是否爲目錄
public boolean isDirectory()

//判斷是否爲文件
public boolean isFile()

//判斷文件是否全在內存
public boolean isInMemory() throws IOException

//獲取文件的長度
public long length() throws IOException

//判斷文件是否常駐內存
public boolean needPin()

//重命名文件
public boolean rename(TachyonURI path) throws IOException

//設置底層文件系統的配置
public void setUFSConf(Object conf)

//獲取文件的創建時間
public long getCreationTimeMs()

//獲取對應塊所屬的文件名
public String getLocalFilename(int blockIndex) throws IOException

//獲取文件所在的主機集合
public List<String> getLocationHosts() throws IOException

//獲取文件的塊數
public int getNumberOfBlocks() throws IOException

3.3.3 Tachyon Java API使用Demo

這個Demo使用了上面介紹的Java API實現簡單的Tachyon文件讀寫操作。

<pre name="code" class="java">import java.io.IOException;

import tachyon.TachyonURI;
import tachyon.client.FileOutStream;
import tachyon.client.InStream;
import tachyon.client.OutStream;
import tachyon.client.ReadType;
import tachyon.client.TachyonFS;
import tachyon.client.TachyonFile;
import tachyon.client.WriteType;
import tachyon.util.CommonUtils;

/*
*
*	將0~9的數字寫到tachyon文件/tmp/test,然後將寫入的文件內容讀出到控制檯。
*
*/
public class test {
	public final TachyonURI masteruri = new TachyonURI("tachyon://slave201:19998");
	public final TachyonURI filepath = new TachyonURI("/tmp/test");
	public WriteType writeType = WriteType.CACHE_THROUGH;
	public ReadType readType = ReadType.CACHE;

	public static void writeFile() throws IOException
	{
		TachyonFS tachyonClient = TachyonFS.get(masteruri);
		if(tachyonClient.exist(filepath)) {
			tachyonClient.delete(filepath, true);
		}
		tachyonClient.createFile(filepath);
		TachyonFile file = tachyonClient.getFile(filepath);
		FileOutStream os = (FileOutStream) file.getOutStream(writeType);
		for(int i = 0; i < 10; i ++)
		{
			os.write(Integer.toString(i).getBytes());
		}
		os.close();
		tachyonClient.close();
	}

	public static void readFile() throws IOException
	{
		TachyonFS tachyonClient = TachyonFS.get(masteruri);
		TachyonFile file = tachyonClient.getFile(filepath);
		InStream in = file.getInStream(readType);
		byte[] bytes = new byte[20];
		in.read(bytes);
		System.out.println(new String(bytes));
		in.close();
		tachyonClient.close();
	}
	
	public static void main(String[] args) throws IOException
	{
		writeFile();
		readFile();
	}
}

執行後在Tachyon的WebUI上可以查看測試文件的信息,文件內容爲預期的字符串"0123456789"


原文地址:http://blog.csdn.net/u014252240/article/details/42238081#t14


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章