这是以前我刚学习使用时,写的一篇翻译
对大数据快速处理来说,内存是关键的环节。这已经被很多框架实现了,比如Spark已经利用了内存性能。随着数据集的继续增大,在许多大工作量中,存储正处于逐渐一个瓶颈的状态。
为了解决这个需求,我们有了成熟的Tachyon,一个中央内存的容错分布式文件系统,通过内存速度把可靠文件遍布共享在分布式的框架工作上,比如Spark和MapReduce。经历2年的研究结果,Tachyon通过强势的内存使用和系列的信息,实现内存速度和容错性。Tachyon把文件缓存到内存中工作,并通过内存速度把不同的任务/需求和框架工作来获取缓存文件。如此这样,Tachyon避免频繁的读硬盘加载数据集。
Tachyon是与Hadoop类似的。现在Spark和分布式项目不需要任何代码修改就可以运行在Tachyon上。Tachyon在Spark上是默认的off-heap配置,意味着RDDs能自动被存储在Tachyon中让Spark更具有弹性和避免垃圾回收消耗。这个工程是开源的,并已经部署在多个企业。另外,Tachyon有超过50个贡献者是来自20多个机构。包括雅虎,因特尔公司,红帽子,和Pivotal。这个工程是伯克利的存储层数据分析堆栈(DBAS)和Fedora发行版的一部分。
在这个章节,我们首先过一遍Tachyon的基本操作,然后在它上面运行一个Spark程序。Tachyon的website或Github项目,我们还定期举办聚会在海湾地区。
1.前提条件
1.1假定设想
你有一个笔记本电脑
你的笔记本电脑有java 6 或 7 已经安装了
Mac OS 或 Linux( window是不支持的)
1.2启动Tachyon
1.2.1.配置
所有系统的配置都在tachyon/conf文件夹下。找到它们,并且在每一个工作点可以看到有多少内存被配置。
$ grep "TACHYON_WORKER_MEMORY_SIZE=" conf/tachyon-env.sh
export TACHYON_WORKER_MEMORY_SIZE=1GB
你也可以读这个文件并试着去理解这些参数。关于配置的更多信息,你可以看Tachyon的页面设置的配置。
1.2.2.格式化这个存储
如果你是运行Linux请注意,Tachyon将需要root权限来创建和使用一个RAM的磁盘,运行sudo su并输入你的密码。
在第一次启动Tachyon之前,我们需要格式化这个系统。在tachhyon/bin文件夹下用tachyon 脚本。请输入下列命令:
$ ./bin/tachyon format
Connection to localhost... Formatting Tachyon Worker @ HYMac-2.local
Removing local data under folder: /Users/haoyuan/Downloads/test/tachyon/libexec/../ramdisk/tachyonworker/
Formatting Tachyon Master @ localhost
Formatting JOURNAL_FOLDER: /Users/haoyuan/Downloads/test/tachyon/libexec/../journal/
Formatting UNDERFS_DATA_FOLDER: /Users/haoyuan/Downloads/test/tachyon/libexec/../../data/tmp/tachyon/data
Formatting UNDERFS_WORKERS_FOLDER: /Users/haoyuan/Downloads/test/tachyon/libexec/../../data/tmp/tachyon/workers
1.2.3.开始这个系统管理
在格式化这个存储仓库后,我们可以尝试启动系统。这能通过 tachyon/bin/tachyon-start.sh 脚本来完成。
$ ./bin/tachyon-start.sh local
Killed 0 processes
Killed 0 processes
Connection to localhost... Killed 0 processes
Starting master @ localhost
Starting worker @ HYMac-2.local
1.3用Tachyon交互
在这个部分,我们将使用3中方法来接触Tachyon:
1.命令行的交互
2.实际的应用程序交互
3.网页用户界面
1.3.1.命令行的接口
你能使用下列命令来交互Tachyon:
$ ./bin/tachyon tfs
之后,它将返回一个列表选项:
Usage: java TFsShell
[cat <path>]
[count <path>]
[ls <path>]
[lsr <path>]
[mkdir <path>]
[rm <path>]
[tail <path>]
[touch <path>]
[mv <src> <dst>]
[copyFromLocal <src> <remoteDst>]
[copyToLocal <src> <localDst>]
[fileinfo <path>]
[location <path>]
[report <path>]
[request <tachyonaddress> <dependencyId>]
[pin <path>]
[unpin <path>]
请试着用命令把本地文件tachyon/LICENSE放进Tachyon文件系统如 /LICENSE
$ ./bin/tachyon tfs copyFromLocal LICENSE /LICENSE
Copied LICENSE to /LICENSE
你也能用命令行界面来验证上面的结果:
$ ./bin/tachyon tfs ls /
11.40 KB 02-07-2014 23:23:44:008 In Memory /LICENSE
现在,你想要检出这个文件的内容就做下面操作:
$ ./bin/tachyon tfs cat /LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
....
1.3.2.应用程序界面
在使用命令行与Tachyon交互之后,你也能使用它的API。我们有几个样例的应用程序。例如,BasicOperations.java展示了用户文件创建,写入和读取操作。
你把这些放进我们的脚本,你能很简单的使用下列命令来运行这个样例程序。下列命令能运行[BasicOperations.java],,并且也验证Tachyon的安装。
$ ./bin/tachyon runTests
$ /root/tachyon/bin/tachyon runTest Basic MUST_CACHE
$ /BasicFile_MUST_CACHE has been removed
$ 2014-02-07 23:46:57,529 INFO (TachyonFS.java:connect) - Trying to connect master @ ec2-23-20-202-253.compute-1.amazonaws.com/10.91.151.150:19998
$ 2014-02-07 23:46:57,599 INFO (MasterClient.java:getUserId) - User registered at the master ec2-23-20-202-253.compute-1.amazonaws.com/10.91.151.150:19998 got UserId 6
$ 2014-02-07 23:46:57,600 INFO (TachyonFS.java:connect) - Trying to get local worker host : ip-10-91-151-150.ec2.internal
$ 2014-02-07 23:46:57,618 INFO (TachyonFS.java:connect) - Connecting local worker @ ip-10-91-151-150.ec2.internal/10.91.151.150:29998
$ 2014-02-07 23:46:57,661 INFO (CommonUtils.java:printTimeTakenMs) - createFile with fileId 3 took 133 ms.
$ 2014-02-07 23:46:57,707 INFO (TachyonFS.java:createAndGetUserTempFolder) - Folder /mnt/ramdisk/tachyonworker/users/6 was created!
$ 2014-02-07 23:46:57,714 INFO (BlockOutStream.java:<init>) - /mnt/ramdisk/tachyonworker/users/6/3221225472 was created!
$ Passed the test!
$ /root/tachyon/bin/tachyon runTest BasicRawTable MUST_CACHE
$ /BasicRawTable_MUST_CACHE has been removed
$ 2014-02-07 23:46:58,633 INFO (TachyonFS.java:connect) - Trying to connect master @ ec2-23-20-202-253.compute-1.amazonaws.com/10.91.151.150:19998
$ 2014-02-07 23:46:58,705 INFO (MasterClient.java:getUserId) - User registered at the master ec2-23-20-202-253.compute-1.amazonaws.com/10.91.151.150:19998 got UserId 8
$ 2014-02-07 23:46:58,706 INFO (TachyonFS.java:connect) - Trying to get local worker host : ip-10-91-151-150.ec2.internal
$ 2014-02-07 23:46:58,725 INFO (TachyonFS.java:connect) - Connecting local worker @ ip-10-91-151-150.ec2.internal/10.91.151.150:29998
$ 2014-02-07 23:46:58,859 INFO (TachyonFS.java:createAndGetUserTempFolder) - Folder /mnt/ramdisk/tachyonworker/users/8 was created!
$ 2014-02-07 23:46:58,866 INFO (BlockOutStream.java:<init>) - /mnt/ramdisk/tachyonworker/users/8/8589934592 was created!
$ 2014-02-07 23:46:58,904 INFO (BlockOutStream.java:<init>) - /mnt/ramdisk/tachyonworker/users/8/9663676416 was created!
$ 2014-02-07 23:46:58,914 INFO (BlockOutStream.java:<init>) - /mnt/ramdisk/tachyonworker/users/8/10737418240 was created!
$ Passed the test!
$ ...
1.3.3.网页用户界面
在使用命令和API与Tachyon交互之后,让我们看看它的网页的用户界面。URI是http://localhost:19999
第一页是概述了系统的运行。第二页是系统的配置。
如果你在Browse File System点击,它会展示出你刚刚创建和赋值的所有文件。
你也能点击一个私人项目文件或文件夹。例如 /LICENSE file,之后你可以看到关于这个 LINCENSE 文件的详细信息
1.4.在Tachyon上运行Spark
1.4.1.用Tachyon输入输出
在这部分,我们运行一个Spark项目来与Tachyon交互。第一个是在 /LICENSE 文件上做一个单词计数。在/root/spark 文件夹里,执行下面命令来开始Spark shell。
$ ./bin/spark-shell
sc.hadoopConfiguration.set("fs.tachyon.impl", "tachyon.hadoop.TFS")
var file = sc.textFile("tachyon://localhost:19998/LICENSE")
val counts = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
counts.saveAsTextFile("tachyon://localhost:19998/result")
这个结果被保存在 /result 文件夹里,你能通过网页界面或命令行来验证这个结果。因为 /LICENSE 是在内存里面,当一个新的Spark程序运行时,它将直接从Tachyon中加载到内存里。同时,我们也致力于其他特点来使Tachyon更能提高Spark的性能。
1.4.2.在Tachyon里存储RDD OFF_HEAP
在Tachyon里存储 RDD 作为 OFF_HEAP 存储器有几个优点(更多信息):
它允许多个执行者(worker)在Tachyon里共享同一个内存容器。
它对垃圾回收机制是有意义的。
如果个人的执行者(worker)崩溃掉,缓存数据不会丢失。
请试试下列例子:
sc.hadoopConfiguration.set("fs.tachyon.impl", "tachyon.hadoop.TFS")
var file = sc.textFile("tachyon://localhost:19998/LICENSE")
val counts = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
counts.persist(org.apache.spark.storage.StorageLevel.OFF_HEAP)
counts.take(10)
counts.take(10)
你能注意到第二次 take(10) 比第一次更快,是因为在 Tachyon 里 RDD 的计数已经被存储为 OFF_HEAP 。
这接近Tachyon章节教程的结尾。我们鼓励你们继续用代码来娱乐并检出 project website,Github 项目,和 meetup group
欢迎提交 Bug 和 来询问了解Tachyon特点。