Winse Blog

走走停停都是风景, 熙熙攘攘都向最好, 忙忙碌碌都为明朝, 何畏之.

Tachyon剖析

要了解一个框架,一般都是从框架提供/开放的接口入手。先从最直接的方式下手,可以通过tachyon tfs和浏览器19999端口获取集群以及文件的相关信息。

  • 要了解tachyon首先就是其文件系统,可以从两个功能开始:命令行tachyon.command.TFsShell和web-servlet。
  • 然后会深入tachyon.client包,了解TachyonFS和TachyonFile处理io的方式。以及tachyon.hadoop的包。
  • io处理:
    • 写:BlockOutStream(#getLocalBlockTemporaryPath; MappedByteBuffer)、FileOutStream
    • 读:RemoteBlockInStream、LocalBlockInStream
  • 了解thrift:MasterClient、MasterServiceHandler、WorkerClient、WorkerServiceHandler、ClientBlockInfo、ClientFileInfo。
  • 看tachyon.example,巩固

注:MappedByteBuffer在windows存在资源占用的bug!参见http://www.th7.cn/Program/java/2012/01/31/57401.shtml

把整个io流理清之后,然后需要了解tachyon是怎么维护这些信息的:

  • 配置:WorkerConf、MasterConf、UserConf
  • 了解thrift:MasterClient、MasterServiceHandler、ClientWorkerInfo、MasterInfo
  • TachyonMaster和TachyonWorker的启动
  • Checkpoint、Image、Journal
  • 内存淘汰策略
  • DataServer在哪里用到(nio/netty):TachyonFile#readRemoteByteBuffer、RemoteBlockInStream#read(byte[], int, int)
  • HA
  • Dependency(不知道怎么用)

远程调试Worker以及tfs:

1
2
3
4
5
[hadoop@hadoop-master2 tachyon-0.6.1]$ cat conf/tachyon-env.sh 
export TACHYON_WORKER_JAVA_OPTS="$TACHYON_JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8070"

[hadoop@hadoop-master2 tachyon-0.6.1]$ export TACHYON_JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8070"
[hadoop@hadoop-master2 tachyon-0.6.1]$ bin/tachyon tfs lsr /

IO/client

  • TachyonFS是client与Master/Worker的纽带,请求文件系统和文件的元数据CRUD操作。其中的WorkerClient仅用于写(保存)文件。
  • TachyonFile是文件的抽象处理集合,可以获取文件的基本属性(元数据),同时提供了IO的接口用于文件内容的读写。
  • InStream读、获取文件内容
    • EmptyBlockInStream(文件包括的块为0)
    • BlockInStream(文件包括的块为1)
      • LocalBlockInStream 仅当是localworker且该块在本机时,通过MappedByteBuffer获取数据(数据在ramdisk也就是内存盘上哦)。
      • RemoteBlockInStream (通过nio从远程的worker#DataServer机器获取数据#retrieveByteBufferFromRemoteMachine,如果readtype设置为cache同时把数据缓冲到本地worker)
    • FileInStream(文件包括的块为1+,可以理解为BlocksInStream。通过mCurrentPosition / mBlockCapacity来获取当前的blockindex最终还是调用BlockInStream)
  • FileOutStream写,写数据入口就是只有FileOutStream
    • BlockOutStream(WriteType设置了需要缓冲,会写到本地localworker。由于需要进行分块,会复杂些#appendCurrentBuffer
    • UnderFileSystem(如果WriteType设置了Through,则把数据写一份到underfs文件系统)

Master

TachyonMaster是master的启动类,所有的服务都是在这个类里面初始化启动的。

  • HA:LeaderSelectorClient
  • EditLog:EditLogProcessor、Journal。
    • 如果是HA模式,leader调用setup方法把EditLogProcessor停掉。也就是说在HA模式下,standby才会运行EditLogProcessor实时处理editlog。
    • leader和非HA master则仅在启动时通过调用MasterInfo#init处理editlog一次。
  • Thrift: TServer、MasterServiceHandler;与MasterClient对应的服务端。
  • Web: UIWebServer,使用jetty的内嵌服务器。
  • MasterInfo

Worker

Thrift

HA

当配置tachyon.usezookeeper设置为true时,启动master时会初始化LeaderSelectorClient对象。使用curator连接到zookeeper服务器进行leader的选举。

LeaderSelectorClient实现了LeaderSelectorListener接口,创建LeaderSelector并传入当前实例作为监听实例,当选举完成后,被选leader触发takeLeadership事件。

public void takeLeadership(CuratorFramework client) throws Exception Called when your instance has been granted leadership. This method should not return until you wish to release leadership

takeLeadership方法中把mIsLeader设置为true(master自己判断)、创建mLeaderFolder + mName路径(客户端获取master leader);然后隔5s的死循环(运行在LeaderSelector单独的线程池)。

Checkpoint

Journal


问题

  • 程序没有返回内容,没有响应(v1.1.0已经没有这个问题了)

tfs 默认是CACHE_THROUGH,会缓冲同时写ufs。如果改成must则只写cache,然后清理内存,再获取数据,一直没有内容返回,不知道为什么?

1
2
3
4
5
6
[esw@bigdata1 tachyon-0.6.1]$ export TACHYON_JAVA_OPTS="-Dtachyon.user.file.writetype.default=MUST_CACHE "
[esw@bigdata1 tachyon-0.6.1]$ bin/tachyon tfs copyFromLocal LICENSE /LICENSE2
Copied LICENSE to /LICENSE2
[esw@bigdata1 tachyon-0.6.1]$ bin/tachyon tfs free /LICENSE2
/LICENSE2 was successfully freed from memory.
[esw@bigdata1 tachyon-0.6.1]$ bin/tachyon tfs cat /LICENSE2

v1.1

1
2
3
4
5
6
[hadoop@hadoop-master2 alluxio-1.1.0-SNAPSHOT]$ bin/alluxio fs ls /README.txt                                            
1366.00B  04-16-2016 07:56:24:499  In Memory      /README.txt
[hadoop@hadoop-master2 alluxio-1.1.0-SNAPSHOT]$ bin/alluxio fs free /README.txt
/README.txt was successfully freed from memory.
[hadoop@hadoop-master2 alluxio-1.1.0-SNAPSHOT]$ bin/alluxio fs cat /README.txt 
Block 402653184 is not available in Alluxio

–END

Comments