YunTable 0.1版正式发布!!!

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享




 

经过两个星期的努力(如果刨去学习C语言的时间),YunTable终于走完一个从无到有的历程,今天,也就是2010年7月12日,YunTable正式对外发布其0.1版,在0.1版中YunTable虽然在特性,优化和内存管理这三方面还有很多的缺失,但是总体而言,已经实现了一个身为BigTable克隆的基本要求,也就是分布式查询和管理,以及以column为核心的存储。这是0.1版的下载链接(上次因为对Skydrive的存储机制不熟,导致部分博友没有第一时间拿到0.01版的源代码,在这里向大家表示我的歉意)。

 

架构综述

首先,请看下面是YunTable0.1版的架构图:

YunTable Arch

图1. YunTable架构(0.1版)

接下来,将按从上往下的顺序给大家介绍YunTable的架构:

  1. Console:用于让用户输入YunTable的命令,主要包括四种类型的命令(add,put,get和quit),并做一些简单的解析。
  2. Master:主要接收来自Console的请求,并将这个请求转发给相应的Region。
  3. Region:其作用主要是处理Master的请求,并存储和管理大量的数据,其主要包括多个store,而存储数据的目录名为”datastore“。Region也就是BigTable论文中所提到的Tablet的服务器。
    1. Store:每个Store对应一个相应的column family,系统在初始化的时候,会为默认的column_family(default_cf)创建一个store,store存储的形式为datastore下的一个目录,目录名为其所对应的column_family,并主要包括四类文件:Memstore,YFile,YFile_data和WAL。
      1. Memstore:其是缓存在内存的数据文件,主要存储最新更新和添加的数据,每隔一段时间,在Memstore上缓存的数据都将会flush到YFile和YFile_data这两个文件中,默认时间间隔应该为60分钟,但0.1版为了测试方便,所以把设定的时间间隔暂定为10秒钟。
      2. YFile:其是持久化的文件,主要用于存储数据的Index,系统会根据从YFile中得到的Index来访问用于存储数据的YFile_data文件中的相应部分,而且由于其体积比较小,所以会在系统运行的时候被载入至内存中。
      3. YFile_data:这就是真正存储数据的文件,由于其体积比较大,所以不大会被存入内存。YFile这个两个文件参考了HBase的HFile格式和Google的SSTable格式,并做了相应的简化。
      4. WAL:全称为“Write-Ahead Log”,用于暂存那些数据更新的请求,以避免当Memstore被意外关闭时所造成的数据丢失,当Memstore完成对数据的写入时,WAL也会清空已经写入的请求。

一些限定

为了使YunTable在合理的时间内达到其0.1版,我在一些方面做了相应的范围缩小,所以YunTable0.1版有下面一些限定:

  1. column_name和column_family_name的大小都被限制在16字节之内,如果输入column_name或者column_family_name的大小超过16字节,系统会将多余的字节自动删去。同时假设在输入的时候,如果不为这个column设定相应的column_family,系统会认定其使用系统默认的column family,也就是default_cf。
  2. 在分布式方面,为了缩小开发范围,采用了伪分布式的方式,也就是将Master和Region绑定在一起,并且只有一个初始Region可供选择。
  3. 在查询方面,暂不支持基于column的查询,但是支持基于row key的查询,具体可以看下面使用教程中的”Get“命令。
  4. 在内存管理方面和性能优化方面,由于这两方面在短期内并不关键,而且”过早的优化“也不是业界所推崇的,所以在0.1版中,没有在这两方面发力。

 

使用教程

首先,使用make来编译生成执行文件YunTable,可通过“./yuntable”来启动YunTable,并进入YunTable的Console,也可使用make clean来清空之前生成的数据库文件。

接下来,将介绍YunTable Console所支持四种命令:

  1. add:这个命令,是为了创建新的Column Family存在的,格式是“add column_family:column_family_name”,在这里”column family”是关键词,不可更改,而“column_family_name”则是等待用户输入的占位符,如果输入的Column Family已经存在的了,Console会显示相应的错误信息。例子:add column_family:address 。
  2. put:主要是用于添加数据,其格式是”put  row:row_key column_name:column_name_value column_family_name.column_name:column_name_value“,在这里”row”是关键词,在其冒号后输入相应的row_key,比如在后面例子里面提到的”me“,在row之后那些,都不是关键字,只要按照那些占位符输入相应参数就可以,具体也可以参看后面的例子,但要注意,如果这个column不属于系统默认的column family,那么请在column family和column之间加入用于分割的“.”,例子:put row:me name:ike sex:male address.homeaddress:sh 。
  3. get:可以通过这个命令来获取数据,主要有两个选择:第一个是“get all”,这主要是列出数据库中所有的数据,并安排row key大小的顺序(字典顺序)排列,但不会对输出的数据进行过滤。另一个是“get row:row_key”,通过这个命令会获得这个row的数据,并且会对其输出的数据进行过滤,也就说,同一row同一column只会显示最新的一个值,例子:get row:me。
  4. quit:这个命令最简单的,没有附加的命令,只有在console中输入“quit”就能退出YunTable Console。

还有,如果大家第一次使用YunTable的话,可以参考下面附录里面的两个Test Case,特别推荐Test Case1,也就是短的那一个。

 

今后的安排

关于YunTable的未来,首先,我将会在《剖析云计算》一书的实践篇中,对YunTable的实现和其背后的理论进行详细的讲解。其次,关于YunTable未来的发展,我还没有明确的规划,所以如果大家有兴趣在今后参与YunTable开发的话,可以直接在使用和分析YunTable之后将自己的想法发到我的邮箱ikewu83@gmail.com,等我有空了之后,大家可以一起来商量商量,同时也可以直接动手改代码,来对YunTable进行更新和添加。

 

附录:

下面是两个YunTable的Test Case,一长一短,如果大家有兴趣的话,可以试一下。

Test Case1(短)

make

make clean

./yuntable

1. add column_family:address

2. put row:me name:ike sex:male address.homeaddress:sh

3. get all

4. quit

Test Case 2(长)

1) begin part

make

make clean

./yuntable

1. get all

2) add part

1. add column_family:address

*2. add column_family:address

3.  add  column_family:address2

3) put part

1. put row:me name:ike sex:male address.homeaddress:sh

2. put row:m22 name:zhu sex:male address.homeaddress:sh address2.workaddress:bj

3. put row:m1 name:wu sex:male address.homeaddress:sh

*4. put row:m3 name:hua sex:male address3.playaddress:sh

5. put row:me name:wu sex:female address.homeaddress:bj

4) test log part

1. quit

./yuntable

5) get part

1. get all

2. get row:me

*3. get row:wrong

4. quit

*开头的命令,应该返回相应的错误信息。

(2个打分, 平均:5.00 / 5)

雁过留声

“YunTable 0.1版正式发布!!!”有13个回复

  1. sixshot 于 2010-07-25 8:17 下午

    master!

  2. ikewu83 于 2010-07-25 9:13 下午

    呵呵,才刚开始,马上就要发布0.2版了,会实现BigTable80%的核心功能。

  3. seerhut 于 2010-07-26 6:50 上午

    感觉是一个简化的HBase

  4. ikewu83 于 2010-07-26 7:11 上午

    是简化了很多很多的Hbase,而且用是C的。0.2版在功能上会增强很多!

  5. sixshot 于 2010-07-29 7:10 下午

    感觉有点像memcached

  6. yunhaid 于 2010-07-30 12:18 上午

    这东西能拿到外面卖钱不?
    slab,loadbalance,memleak,都搞过,都用在公司产品里了。

  7. ikewu83 于 2010-07-30 4:15 上午

    呵呵,现在这只是原型,但到1.0版时欢迎大家试用!

  8. 陈怀临 于 2010-08-01 4:55 下午

    我也开始接触hadoop了。今天把Cloudera下载并转起来了。一个单节点的分布式模拟多节点系统。

    我发誓:我不把hadoop搞精,我就,我就。。。

    huailin@ubuntu:~$ ps -al
    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
    0 S 1001 2288 1 0 80 0 – 297189 futex_ pts/0 00:00:01 java
    0 S 1001 2365 1 0 80 0 – 297521 futex_ pts/0 00:00:01 java
    0 S 1001 2437 1 0 80 0 – 297230 futex_ pts/0 00:00:01 java
    0 S 1001 2524 1 0 80 0 – 295812 futex_ pts/0 00:00:01 java
    0 S 1001 2593 1 0 80 0 – 296945 futex_ pts/0 00:00:01 java
    0 R 1000 2942 1972 4 80 0 – 625 – pts/0 00:00:00 ps

    huailin@ubuntu:~$ hadoop fs -ls /
    Found 2 items
    drwxr-xr-x – huailin supergroup 0 2010-08-01 17:51 /foo
    drwxr-xr-x – hadoop supergroup 0 2010-08-01 17:50 /var

  9. frogman 于 2010-08-01 5:32 下午

    it is said hadoop has 10+ M bytes of source code~~

    :-)

  10. yunhaid 于 2010-08-01 7:33 下午

    查了一下hadoop,原来是分布式文件系统。想问下首席,研究完了,打算怎么用?

  11. ikewu83 于 2010-08-01 7:57 下午
  12. 短域网 于 2010-08-30 12:58 上午

    博主厉害啊,我膜拜你,请让我跟随你!我先把你的博客收藏到短域网去备忘,保持关注!

  13. ballack 于 2010-08-31 1:50 下午

    如果只是用的话,使用Hive和Pig就可以了

    只是Hive和Pig从SQL like和脚本到Map reduce的转换机制基本也是固定解析方式的

    look into HDFS比较messy一些,但是Map Reduce的编程架构应该还是比较容易的吧