最近在看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和分布式系统>>算是入门的学习了一下Paxos。视频是知行学社提供的,我还加了知行学社的群:107166353。视频地址:
http://www.tudou.com/programs/view/e8zM8dAL6hM/
3. 在知行学社的群里,有前辈告诉我Zookeeper使用的不是Paxos而是ZAB,并给我推荐了一篇博客:http://blog.youkuaiyun.com/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