Fourinone创始人彭渊:打造多合一的分布式并行计算框架

Fourinone是一个分布式并行计算框架,以轻量的方式提供了一个四合一的分布式框架功能以及简单易用的API,通过实现对多台计算机资源的统一利用,来获得强大的计算能力。本期我们采访了项目创始人彭渊。

Fourinone(即Four-in-one,中文名字“四不像”)是一个分布式计算框架,提供了一个4合1的分布式框架功能(即整合了Hadoop、Zookeeper、MQ、分布式缓存的主要功能)和简单易用的编程API,实现对多台计算机CPU、内存、硬盘的统一利用,从而获取到强大计算能力去解决复杂问题。

项目地址: http://code.google.com/p/fourinone/

CSDN记者采访了Fourinone创始人彭渊,请他来详细介绍Fourinone项目的由来、技术细节等方面的情况。

 
Fourinone创始人彭渊

CSDN:请先做个自我介绍吧!

彭渊:我是彭渊,目前担任华为企业中间件首席架构师,主要负责中间件和大数据。我之前曾是淘宝高级专家(花名:千峰),先后在淘宝交易、淘宝中间件、集团核心系统、阿里金融等部门工作。在淘宝之前,还曾担任金蝶软件总体架构部SOA架构师。

CSDN:Fourinone是一个什么样的项目?提供了哪些功能?

彭渊:Fourinone(四不像)是对分布式核心技术的归纳和经验总结,一般互联网企业的分布式存储计算系统都是个大平台,系统复杂代码庞大,而且只适合自己的业务,但很难被其他企业下载安装,Fourinone从中抽取出了一个简化的框架和编程API,能方便工程师了解分布式系统的主要技术实现,并推动开源的技术创新。所以总结起来:

Fourinone是一个精心设计的框架和API,实现对多台计算机CPU、内存、硬盘的统一利用,从而获取到强大计算能力去解决复杂问题。

  1. 提供了一系列并行计算模式(农民工/包工头/职介绍/手工仓库)用于利用多机多核CPU的计算能力;
  2. 提供完整的分布式文件操作功能,像操作本地文件一样操作远程文件(访问、并行读写、拆分、排它、复制、解析、事务等)用于利用多机硬盘存储能力;
  3. 提供提供完整的分布式协调功能,实现了zookeeper主要功能。
  4. 提供分布式缓存和小型缓存用于利用多机内存能力。
  5. 提供简化MQ功能用于方便多机通讯。

CSDN:开发Fourinone项目的初衷是什么?

彭渊:Fourinone项目起源于淘宝技术委员会发起的加大对并行计算技术研究的提议,当时邮件讨论得很热烈,但是没什么人真动手去做,那时中间件部门想搞一个轻量级计算框架,我当时在淘宝接触了很多Hadoop/HBase等技术,刚好也有一些自己想法,于是就开始做了,应该说我在做的过程中超出了计算框架的范围,把对其他分布式技术的感悟和实践都加了进去,做技术不要为了完成任务,而是要抓住一次灵感的创作,这是我的初衷,但不一定是项目的初衷。

CSDN:Fourinone主要针对哪些场景设计?设计理念是什么?

彭渊:Fourinone的目标是做小,不做大平台大系统,而是通过高度灵活的框架和API,然后尽可能的用于大部分的分布式场景。但是有很多人会反对,曾经也有淘宝内部的技术权威当大家面说我们不要一个All In One的系统,我怕KPI被影响,也不敢公开反驳,但是这个问题要看你从哪个层面去设计,比如搞Java的人这么多,所用的JDK就是一个All In One的API,从Swing界面,到数据结构,到网络多线程,再到文件操作等等全部包含一个几十M的JDK里面,并且支撑了世界上千千万万的应用,包括Hadoop。除外,我们用的手机也是All In One的,上帝把人也设计成All In One的,人又会跑,又会说,又会想,还会勾心斗角,功能太多了。这个世界喜欢All In One,所以架构师也要将产品设计得更酷。

从一个框架的设计理念来说,不仅要做到功能强大,而且要非常简单,要让开发者产生驾驭感,而不是产生畏惧感,因此源码要控制的非常少(Fourinone整体不到一万行代码),demo要很傻瓜,最好看一眼demo就能上手,最好看到源码很少就恨不得马上把它调通吃透。反之,源码太庞大,安装部署开发太复杂,开发者就会知难而退,人都是喜欢自己能拥有的东西,而不会因为一个东西复杂而称赞作者水平高。

CSDN:Fourinone的架构是什么样的?

彭渊:Fourinone的架构根据功能涉及方方面面,限于篇幅,无法一一道来,技术博客有个完整的架构PPT可以去下载: http://fourinone.iteye.com/blog/1501126

下面只介绍一个最简单的分布式计算架构,希望能达到一目了然的效果,最好不懂技术的人也能大致看明白:

 

  • 包工头:负责任务的分配,工头的giveTask方法可以由开发者实现,工头先获取线上工人数量,然后调用各个工人的doTask方法,让工人们并行完成任务。
  • 工人:负责执行任务,工人doTask方法也可以由开发者实现。
  • 职介所:负责登记工人并介绍给工头。

部署时,工头和多个工人可以部署到一台计算机,也可以部署到多台。

CSDN:Fourinone是怎么整合前面提到的4个功能(Hadoop、Zookeeper、MQ、分布式缓存)的?是如何具体实现的?采用的技术有哪些?

彭渊:Fourinone(四不像)只是个代号,实际上从2.0开始,又包括了完整的分布式文件操作API(Fttp),因此功能上已经不止4种,它不是Hadoop的复制品,也不是将几个开源产品拼凑起来的东西,它的目的是帮助你去利用多台计算机的资源实现各种分布式应用。

因此,框架和编程API是Fourinone的核心,它不实现具体的分布式应用,但是你可以用它帮助你去实现具体的分布式应用,无论是分布式计算还是存储还是协同等。Fourinone实际上将多种分布式问题的理解融入到了一个框架中,考虑到底层实现技术的相似性,对复杂的分布式计算应用进行了大量简化和归纳,所以最后它看上去综合了好几种分布式产品的主要功能。

技术实现上采用纯Java,没有任何依赖,整体只有一个150k的JAR包,导入环境即可使用。从设计上来说,无论是并行计算也好,分布式缓存也好,MQ也好,背后的并发设计、服务端设计、容器设计等技术都是不变的主题,只是老外将这些技术封装起来,包装成不同的技术产品给我们用,时间长了,我们会认为它们彼此没有关系,合在一起反而感到奇怪。前面说的,Fourinone是对这些分布式技术的归纳和总结,可以好好体会一下。

CSDN:除了这些特性外,Fourinone还有哪些创新点?

彭渊:Fourinone在算法上和设计模式上都是原创的,既不模仿国外论文,也不抄袭其他产品实现,如分布式负载和扩容算法、分布式领导者选举算法等,当然也有人攻击我没有用复杂数学公式和论文证明这些算法,只有公认的那些算法理论才是可信任的。

算法都是人创造的,都是灵活的,千万不要教条化,为了实现算法本身而实现,在某种算法上花费了学习成本,以后就抱着这种算法的步骤僵化套用是不好的。应该多观察我们需要解决的问题,然后思考合适的算法,如果思考过程中碰到问题,再回头参考前人已经总结出来的算法寻求借鉴,这样的才能有更深刻的体会。

其实很多算法动手做做发现没有那么难,跟数据挖掘和概率统计算法不一样,不需要太多数学知识也可以完成的。比如淘宝小二想出来的按机器取模+成倍扩容的简单土办法虽然美中不足,但是也解决了大部分的需求,并不是都需要先用数学论文证明了一番才能上线。

Fourinone在分布式缓存负载均衡实现中,没有采用一致性Hash算法,考虑到不可能每分每秒扩容机器,而采用了一种基于日期key取模的方式,基于日期分组策略实现扩容后数据分布均匀,也能达到目的和解决问题。

Fourinone在领导者选举上也没有采用Paxos,简言之,Paxos对每个节点的并发修改采取编号记录的方式保持一致性,对多个节点的并发修改采取少数服从多数的方式保持一致性。Paxos有点类似分布式二阶段提交方式,但是又不同,二阶段提交不能多数节点同意,必须是全部同意。为了遵守过半节点同意的约束,Paxos算法往往要求节点总数为奇数。Fourinone选取领导者采取的是一种谦让方式,集群中节点会先询问其他节点是否愿意当领导者,没人愿意它才担任;如果已经有了领导了,那它就谦让;正因为大家都谦让,不互相争抢,领导者之间能避免冲突保持一致性。一旦确定了领导者,就只跟该领导者打交道,所有对变量的操作都是通过领导者进行,不会再去操作其他候选节点,操作结果由领导者统一同步到候选节点,跟上面Paxos算法保证一致性的方式是不一样的,Paxos算法会去访问和操作所有节点征求同意,最后以多数节点的结果生效。所以基于Paxos方式的实现难度和工作量会更大,Fourinone在领导者选举和一致性上要更加简化和直接。

还有,在大部分的主备切换场景中,一台主机最多也就2~3台备机,不可能出现几百台备机,需要一个更复杂的算法去支撑,所以这时的领导者选举算法可以做得更简单。

CSDN:讲讲Fourinone的开发故事,在开发过程中,你遇到过哪些问题?是如何解决的?

彭渊:我当时在淘宝是个人专家,下面没有一个人,有一个实习生挂在我下面但是被安排在其他项目,因此Fourinone是一个人设计开发的,实习生帮忙写了些demo,并提交给淘宝测试团队做压测。一个人设计开发有好处也有坏处,好处是做一个东西不需要进行漫长的评审、讨论、选型,最后拖了半年一年还不一定统一各方意见,坏处是做出来后会认为是我个人的东西而被冷落,推广应用上面临很大的困难,但实际上我只是个农夫,离开淘宝当时的环境土壤,我也不会去考虑做一个分布式技术的东西,从华黎(曾宪杰,淘宝高级技术专家、Java中间件团队负责人)立项做这件事到测试团队认真压测都有大家的投入在里面,淘宝当时对分布式技术有大量的需求和氛围,Fourinone是这种背景下积极探索的成果,因此应该值的大家去珍惜。

当时开发完成后,先是在淘宝内部发布邮件通告技术委员会,引起了激烈争论,有人公开反对,但是暗地支持,比如褚霸(余锋,淘宝核心系统数据库组高级技术专家)开始说我重复造轮子,但后来私下对我说只要用心做技术,最终还是会得到认可的(我相信这句话是真心的),也有人公开支持,但是暗地反对,各种声音都有,后面大家提议先做一些基准测试看看优势在哪里。

开始压测时还是很多人持有怀疑态度的,怀疑不能用,比如数据量大了不能用,计算节点多了不能用,出了故障不能用,性能会比Hadoop计算慢很多,但是最后开发和测试团队各自搭建了好几个Hadoop集群反复的对比测试,结果出乎意料,在wordcount和排序等基准测试上胜出了很多。现在华为工程师又进行了测试,结果还是在效率上超出同类计算框架10倍以上。一个东西测来测去测了很多遍,到最后已经不是技术问题了,而是需要思考对它的接纳态度了。

虽然现在已经离开了阿里,但是我仍然心怀感恩,感谢当初的创新环境和给予支持帮助的各位同事。

CSDN:Fourinone目前主要应用在哪些地方?

彭渊:最开始在淘宝内部的主要应用在语义分析、哈勃监控、关联推荐等方面,前面说了,Fourinone的目标是做小,因此不需要整个系统围绕Fourinone来建立,只需要在局部功能实现上用到Fourinone的API提供帮助即可,完全是嵌入式的,是被用户的系统包含,而不是去包含用户的系统,因此Fourinone很适合各种小场景的应用。

但是对于淘宝内部大的平台应用,由于牵扯的关系复杂,不是太容易推广,曾经尝试在MPI集群做调度使用,以及七公(汪海,淘宝数据平台负责人)当时引荐给ODPS(云梯2)团队,希望做其中的M/R计算框架,但是最后没有能合作成功,后来七公无奈对我说在公司推广个人搞的东西比较难,当时我想Fourinone的特点比较适合开源贡献给外界社区。

做成了灵活的API并开源后,在淘宝外部的应用要更多,结合之前的下载地址总共下载次数超过一万次,技术群有三四百人的活跃群体,根据用户的反馈和咨询统计,大大小小的并行计算应用、流计算应用、远程文件系统应用等等有很多。

开源软件跟商业软件有个本质区别,比较少去刻意搜集应用场景,比如Tomcat官网上不会专门有一页列举TOP500企业的案例,但是商业软件就会有,而且越著名企业的案例越好,比如华为大数据就很看重几个大银行的案例。开源软件都是放在那里给有需要的人去下载,是否采用取决于能否给你带来帮助,不会去强迫别人来使用,但是商业软件不一样,我们售前人员会天天上门想各种办法说服客户使用。

CSDN:Fourinone项目今后的目标和开发计划是什么?

彭渊:Fourinone对我个人来说已经是过去的东西了,但是这个开源项目仍然会支持下去,因为分布式技术核心部分永远不会过时,掌握它我们就能驾驭新的技术理念和创造新的技术产品,分布式技术也是中间件的支撑,很多经验的积累都可以用到相关的产品设计中去。

目前Fourinone的最近版本为3.0版,后续还会增加一些新特性:

  • 比如多进程多线程的无缝融合,同一套接口,改改参数,从多进程变为多线程,开发者无需改写程序逻辑;
  • 比如提供高容错任务分配算法API,将n个任务分给m个工人并行完成,根据任务大小设置工人数量,工人间能者多劳,性能好的工人机器争抢干更多的任务,同时跟现实工作一样,如果有工人生病请假(故障),那么他的任务活由其余工人代干,除非所有工人出故障,否则就算只剩一个工人也应该加班把其他所有工人的活干完,对整体计算来说,部分工人故障对计算结果来说不受影响,只是计算时间会延长。

有兴趣的朋友可以留意后续版本。

【开源专访】系列文章致力于对国内外优秀开源项目作者、团队的专访,挖掘项目背后的故事和更多技术细节,以及对项目的宣传、推广。同时,我们也希望广大开源开发者和爱好者自荐或推荐更多优秀的开源项目。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  Fourinone(中文名字“四不像”)是一个四合一分布式计算框架,在写这个框架之前,我对分布式计算进行了长时间的思考,也看了老外写的其他开源框架,当我们把复杂的hadoop当作一门学科学习时,似乎忘记了我们想解决问题的初衷:我们仅仅是想写个程序把几台甚至更多的机器一起用起来计算,把更多的cpu和内存利用上,来解决我们数量大和计算复杂的问题,当然这个过程中要考虑到分布式的协同和故障处理。如果仅仅是为了实现这个简单的初衷,为什么一切会那么复杂,我觉的自己可以写一个更简单的东西,它不需要过度设计,只需要看上去更酷一点,更小巧一点,功能更强一点。于是我将自己对分布式的理解融入到这个框架中,考虑到底层实现技术的相似性,我将Hadoop,Zookeeper,MQ,分布式缓存四大主要的分布式计算功能合为一个框架内,对复杂的分布式计算应用进行了大量简化和归纳。   首先,对分布式协同方面,它实现了Zookeeper所有的功能,并且做了很多改进,包括简化Zookeeper的树型结构,用domain/node两层结构取代,简化Watch回调多线程等待编程模型,用更直观的容易保证业务逻辑完整性的内容变化事件以及状态轮循取代,Zookeeper只能存储信息不大于1M的内容,Fourinone超过1M的内容会以内存隐射文件存储,增强了它的存储功能,简化了Zookeeper的ACL权限功能,用更为程序员熟悉rw风格取代,简化了Zookeeper的临时节点和序列节点等类型,取代为在创建节点时是否指定保持心跳,心跳断掉时节点会自动删除。Fourinone是高可用的,没有单点问题,可以有任意多个复本,它的复制不是定时而是基于内容变更复制,有更高的性能,Fourinone实现了领导者选举算法(但不是Paxos),在领导者服务器宕机情况下,会自动不延时的将请求切换到备份服务器上,选举出新的领导者进行服务,这个过程中,心跳节点仍然能保持健壮的稳定性,迅速跟新的领导者保持心跳连接。基于Fourinone可以轻松实现分布式配置信息,集群管理,故障节点检测,分布式锁,以及淘宝configserver等等协同功能。   其次, Fourinone可以提供完整的分布式缓存功能。如果对一个中小型的互联网或者企业应用,仅仅利用domain/node进行k/v的存储即可,因为domain/node都是内存操作而且读写锁分离,同时拥有复制备份,完全满足缓存的高性能与可靠性。对于大型互联网应用,高峰访问量上百万的并发读写吞吐量,会超出单台服务器的承受力,Fourinone提供了fa?ade的解决方案去解决大集群的分布式缓存,利用硬件负载均衡路由到一组fa?ade服务器上,fa?ade可以自动为缓存内容生成key,并根据key准确找到散落在背后的缓存集群的具体哪台服务器,当缓存服务器的容量到达限制时,可以自由扩容,不需要成倍扩容,因为fa?ade的算法会登记服务器扩容时间版本,并将key智能的跟这个时间匹配,这样在扩容后还能准确找到之前分配到的服务器。另外,基于Fourinone可以轻松实现web应用的session功能,只需要将生成的key写入客户端cookie即可。   Fourinone对于分布式大数据量并行计算的解决方案不同于复杂的hadoop,它不像hadoop的中间计算结果依赖于hdfs,它使用不同于map/reduce的全新设计模式解决问题。Fourinone有“包工头”,“农民工”,“手工仓库”的几个核心概念。“农民工”为一个计算节点,可以部署在多个机器,它由开发者自由实现,计算时,“农民工”到“手工仓库”获取输入资源,再将计算结果放回“手工仓库”返回给“包工头”。“包工头”负责承包一个复杂项目的一部分,可以理解为一个分配任务和调度程序,它由开发者自己实现,开发者可以自由控制调度过程,比如按照“农民工”的数量将源数据切分成多少份,然后远程分配给“农民工”节点进行计算处理,它处理完的中间结果数据不限制保存在hdfs里,而可以自由控制保存在分布式缓存、数据库、分布式文件里。如果需要结果数据的合并,可以新建立一个“包工头”的任务分配进行完成。多个“包工头”之间进行责任链式处理。总的来说,是将大数据的复杂分布式计算,设计为一个链式的多“包工头”环节去处理,每个环节包括利用多台“农民工”机器进行并行计算,无论是拆分计算任务还是合并结果,都可以设计为一个单独的“包工头”环节。这样做的好处是,开发者有更大能力去深入控制并行计算的过程,去保持使用并行计算实现业务逻辑的完整性,而且对各种不同类型的并行计算场景也能灵活处理,不会因为某些特殊场景被map/reduce的框架限制住思维,并且链式的每个环节也方便进行监控过程。   Fourinone也可以当成简单的mq来使用,将domain视为mq队列,每个node为一个队列消息,监控domain的变化事件来获取队列消息。也可以将domain视为订阅主题,将每个订阅者注册到domain的node上,发布者将消息逐一更新每个node,订阅者监控每个属于自己的node的变化事件获取订阅消息,收到后删除内容等待下一个消息。但是Fourinone不实现JMS的规范,不提供JMS的消息确认和消息过滤等特殊功能,不过开发者可以基于Fourinone自己去扩充这些功能,包括mq集群,利用一个独立的domain/node建立队列或者主题的key隐射,再仿照上面分布式缓存的智能根据key定位服务器的做法实现集群管理。   Fourinone整体代码短小精悍,跟Hadoop, Zookeeper, Memcache, ActiveMq等开源产品代码上没有任何相似性,不需要任何依赖,引用一个jar包就可以嵌入式使用,良好支持window环境,可以在一台机器上模拟分布式环境,更方便开发。   开发包里自带了一系列傻瓜上手demo,包括分布式计算、统一配置管理、集群管理、分布式锁、分布式缓存、MQ等方面, 每个demo均控制在少许行代码内,但是涵盖了Fourinone主要的功能,方便大家快速理解并掌握。   Fourinone 2.0新增功能:   Fourinone2.0提供了一个4合1分布式框架和简单易用的编程api,实现对多台计算机cpu,内存,硬盘的统一利用,从而获取到强大计算能力去解决复杂问题。Fourinone框架提供了一系列并行计算模式(农民工/包工头/职介绍/手工仓库)用于利用多机多核cpu的计算能力;提供完整的分布式缓存和小型缓存用于利用多机内存能力;提供像操作本地文件一样操作远程文件(访问,并行读写,拆分,排它,复制,解析,事务等)用于利用多机硬盘存储能力;由于多计算机物理上独立,Fourinone框架也提供完整的分布式协同和锁以及简化MQ功能,用于实现多机的协作和通讯。   一、提供了对分布式文件的便利操作, 将集群中所有机器的硬盘资源利用起来,通过统一的fttp文件路径访问,如:   windows:fttp://v020138.sqa.cm4/d:/data/a.log   linux:fttp://v020138.sqa.cm4/home/user/a.log   比如以这样的方式读取远程文件:   FttpAdapter fa = FttpAdapter("fttp://v020138.sqa.cm4/home/log/a.log");   fa.getFttpReader().readAll();   提供对集群文件的操作支持,包括:   1、元数据访问,添加删除,按块拆分, 高性能并行读写,排他读写(按文件部分内容锁定),随机读写,集群复制等   2、对集群文件的解析支持(包括按行,按分割符,按最后标识读取)   3、对整形数据的高性能读写支持(ArrayInt比ArrayList存的更多更快)   4、两阶段提交和事务补偿处理   5、自带一个集群文件浏览器,可以查看集群所有硬盘上的文件(不同于hadoop的namenode,没有单点问题和容量限制)   总的来说, 将集群看做一个操作系统,像操作本地文件一样操作远程文件。   但是fourinone并不提供一个分布式存储系统,比如文件数据的导入导出、拆分存储、负载均衡,备份容灾等存储功能,不过开发人员可以利用这些api去设计和实现这些功能,用来满足自己的特定需求。   二、自动化class和jar包部署   class和jar包只需放在工头机器上, 各工人机器会自动获取并执行,兼容操作系统,不需要进行安全密钥复杂配置   三、网络波动状况下的策略处理,设置抢救期,抢救期内网络稳定下来不判定结点死亡   本软件由www.gg265.net www.fmrpg.com站长提供
淘宝Fourinone2.0提供了一个4合1分布式框架和简单易用的编程API,实现对多台计算机CPU,内存,硬盘的统一利用,从而获取到强大计算能力去解决复杂问题。Fourinone框架提供了一系列并行计算模式(农民工/包工头/职介绍/手工仓库)用于利用多机多核CPU的计算能力;提供完整的分布式缓存和小型缓存用于利用多机内存能力;提供像操作本地文件一样操作远程文件(访问,并行读写,拆分,排它,复制,解析,事务等)用于利用多机硬盘存储能力;由于多计算机物理上独立,Fourinone框架也提供完整的分布式协同和锁以及简化MQ功能,用于实现多机的协作和通讯。 fourinone-2.05.28\fourinone2.0 .................\............\config.xml .................\............\fourinone-2.05.28-src.jar .................\............\fourinone-2.05.28.jar .................\............\指南和demo .................\............\..........\MQ demo .................\............\..........\.......\MQ demo.txt .................\............\..........\.......\ParkServerDemo.java .................\............\..........\.......\Publisher.java .................\............\..........\.......\Receiver.java .................\............\..........\.......\Sender.java .................\............\..........\.......\Subscriber.java .................\............\..........\WordCount .................\............\..........\.........\inputdata.txt .................\............\..........\.........\ParkServerDemo.java .................\............\..........\.........\WordCount.txt .................\............\..........\.........\WordcountCT.java .................\............\..........\.........\WordcountWK.java .................\............\..........\分布式文件访问和操作demo .................\............\..........\........................\FttpBatchWriteReadDemo.java .................\............\..........\........................\FttpCopyDemo.java .................\............\..........\........................\FttpMulCopyDemo.java .................\............\..........\........................\FttpMulWriteReadDemo.java .................\............\..........\........................\FttpOperateDemo.java .................\............\..........\........................\FttpParseDemo.java .................\............\..........\........................\FttpRo

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值