zookeeper学习(一)

    最近在看Zookeeper的源码,发现有很多包名中有“jute”的字符,查了一下,原来是这样的:

 1.

     在看ZooKeepr的实现是,发现了有几个包缺失了(e.g. data, proto)。以为是code下载错了,后来发现,其实这些包的code都是由Jute自动生成的。

     Jute主要用到了JavaCC。以前还总是想着使用Bison和JNI来做一个编译器,最近看了ZooKeeper,才发现,原来java早就有个类似的解析器生成工具了JavaCC, 决定使用它来继续之前的项目。

    简单梳理一下ZooKeeper是如何使用JavaCC的吧。ZooKeeper 其实是在Apache Jute (Hadoop Record Compiler)中使用的。Jute已经被Hadoop弃用了,目前只有ZooKeeper在使用(据说)。Jute相关的文档也非常少,有些零零散散的code和jira。所以这里就凭感觉加上些许ZooKeeper的code来猜猜其是如何被使用的了。

    ZooKeeper使用Jute来生成RPC和Serialization相关的code。定义生成哪些文件是在“ZooKeeper.jute”里面进行的。为了解析该文件,ZooKeeper需要使用一个解析器。而该解析器则正是由JavaCC编译而成。解析器的编译文件在rcc.jj文件中。然后再阅读一下ZooKeeper的build.xml即可知道ZooKeeper是如何一步一步的使用Jute来生成所需要的code了。具体的细节只要慢慢阅读那些枯燥的语法和接口定义就好了。

 

   2.看了百度百科,以为Zookeeper使用的是Paxos算法,网上搜到了李海磊老师的视频<>算是入门的学习了一下Paxos。视频是知行学社提供的,我还加了知行学社的群:107166353。视频地址:

http://www.tudou.com/programs/view/e8zM8dAL6hM/

 

  3. 在知行学社的群里,有前辈告诉我Zookeeper使用的不是Paxos而是ZAB,并给我推荐了一篇博客:http://blog.csdn.net/m_vptr/article/details/9325405

 

     4. 顺便说一句,最近在熟悉hadoop和hbase;发现有一个社区叫“炼数成金”,感觉不错。还出了教学视频。

 

     5. 看到ClientCnxnSocketleit类的readConnectResult()方法中的逻辑,自己测试了一下:

       

public static void main(String args[]){
		ByteBuffer incomingBuffer=ByteBuffer.allocate(12);
		incomingBuffer.putInt(10);
		incomingBuffer.putLong(20L);
		StringBuilder buf = new StringBuilder("0x[");
        for (byte b : incomingBuffer.array()) {
            buf.append(Integer.toHexString(b) + ",");
        }
        buf.append("]");
        
        System.out.println(buf);
	}
//运行结果;
0x[0,0,0,a,0,0,0,0,0,0,0,14,]
//解释,int占4个字节,所以前四个位置留给了10,10对应16进制的a,所以为a。long占8个字节,所以十六进制14代表了十进制的20L。

 

 

  6.推荐一篇许式伟先生写的《存储系统的那些事》,是在infq上看到的:

http://www.infoq.com/cn/articles/storage-system-stuff

你可能感兴趣的:(zookeeper学习(一))