Writing Future Rotating Header Image

Posts Tagged ‘dfs’

过去和近况(二)

我和同事两人干了一件有趣的事情,我们把自己的Map-Reduce/DFS系统与Hadoop,以及另外一套某搜索引擎使用的Map-Reduc/DFS做了较为深入的分析和性能/功能测试。测试的结果非常符合我们的期望,NEMR/DFS的组合从文件的存取效率,Map-Reduce的任务分发/容错/易用性等都要明显好于Hadoop与另一套系统。当然,这三个系统的定位并不一致。
四月份,我接到的任务是重新整理DFS的Java接口,除了整理了一下包结构与异常机制,我基本没有做什么有价值的事情。原有的Java代码有较深的C/C++风格,另外,代码结构虽然凌乱但能完美的工作,我有些无从下手。当把整理完的结果commit,并关掉任务的时候,我有一种深深的负罪感。
我们组与其他部门开始合作一个应用于廉价存储设备的支持大文件的分布式文件系统(大文件意味着整个系统的元数据基本很小)。支持大文件的分布式系统开发其实比较简单,这是一个C++的项目,作为一个不是很称职的Java程序员,刚开始做C++项目的时候充满了惊奇的体验。我只负责一些边缘的开发工作,比如为这个文件系统做一个shell, 并参与了部分系统对外接口的开发,做为一个C++初学者都算不上的家伙,我在这个项目里每写一行代码都十分的小心,倒也没有出什么问题。
我一直期望把分布式文件系统的接口做的不让人惊奇。处理DFS里的文件像本地文件那样open/write/read/close/unlink,支持流式写入等。(最近开始全面接手上面的项目,可以对其好好改造啦!嘿嘿)
6月份开始了一个较大的项目,我们组开始做一个全新的支持廉价设备的(且低碳省电的)大量小文件存储的分布式文件系统。我负责开发文件的对外Java接口,以及文件系统的存储节点(C++)。其他同事开发管理工具和master。由于考虑到自己只是一个C++新人,我有意识的只使用C++的一个子集来开发系统以避免额外的复杂性。虽然在一开始就约束自己不要重做轮子,可是到了最后,还是造了很多基础设施(线程安全的集合, BlockingQueue, ThreadPool, Runnable, DailyRollingLog等等),  Hacker了一个库的部分代码。可能是因为没有找到简单,可靠的C++实用库吧。这次开发感觉很顺利,我想很大程度上要归功于我们使用了一个非常酷的通信/rpc框架,它引起的麻烦远远要小于它所克服的麻烦。
之后的精力花在了大量线上数据的迁移/线上系统的维护上面,大概有10000亿个线上文件需要迁移到新开发的文件系统。

过去和近况(一)

从2009年7月份从天津大学毕业到现在,在网易杭州研究院工作已经快1年半了,这一年半发生了很多事情,跟老婆登记了/买房了/买车了/买了Mac,还做了一次甲状腺囊肿的手术,住了一个星期院,低调的涨了一回工资,生活压力巨大,基本入不敷出。
刚入职的时候那一个月里,基本都在熟悉组里的东西。分布式开发,都我而言,是个非常新鲜的领域。记得那段日子里,我大把大把的时间都在读Map-Reduce/DFS相关的论文,阅读/部署/安装/测试组里的MPR/DFS系统,阅读Hadoop/HDFS的代码。那个时候不知道自己有没有在进步,只是一直在尝试着往前努力。
慢慢的我开始负责完善我们的Map-Reduce系统,一点功能一点功能的加,到12月底,基本上重新调整了系统的架构,我们把他叫2.0。1.0->2.0从版本上看可是个巨大的进步,统计组的同事也开始使用新版本来进行日志分析/数据统计,由于系统压力的不断增大(说明我们公司在往前发展:) ),以及我欠缺的经验,2.0版本运行的非常不稳定,基本上隔几天就会有许多计算任务失败的情况发生,给统计组的同事填了许多麻烦,我也非常的懊恼。同事(大牛)建议我重写通信模块,先写一个基于事件的NIO框架,然后基于该框架重写所有通信模块,而不是像现在那样把一堆异步通信代码参杂在业务逻辑里。
我大概花了3天时间,写出了一个包含Server/Client,基于NIO,基于事件的异步通信框架,在处理Java NIO 的一些问题(包括JDK BUG,  READ/WRITE事件的注册策略等 )上参考了Mina等其他流行系统的实现。用该框架重写Map-Reduce系统的通信模块后,果然少了很多之前觉得怪异的BUG。
之后的开发算是锦上添花之作,自定义调度策略/API支持/流程优化/动态改变作业参数 等,另一位同事实现了将我们的Map-Reduce与Hadoop在接口上的兼容,为此我们也改动了我们的DFS系统,做完这些工作后,我们实现了与HIVE的兼容!到2月底,这些工作基本完成了,而我,抽空去医院做了一个甲状腺囊肿的手术。
<待续>

4.29继续开发Shell

文件系统的管理工具(Admin Tool)打算做一个Shell来交互。利用 GUN 的readline库,以及getopt_long()等方法,来制作Shell,尽量遵守POSIX的约定。
昨天下午开始写的,晚上吃饭,睡觉的时候中断了一下,今天早上又要开始写了。
开始写之前,先上来拜拜:今天的代码少点BUG吧。