Iveely Computing

产生背景

  08年的时候,我开始接触搜索引擎,当时遇到的第一个难题就是大数据实时并发处理,当时实验室的机器我们可以随便用,至少二三十台机器,可以,却没有程序可以将这些机器的计算性能整合起来,后来听说了Hadoop,但是当时的hadoop还很脆弱(记得没错是0.2.0),源码量也很少,用了很久,发现它不适合我们的搜索引擎。
  后来没办法,我在程序中将爬虫和数据处理写成分布式网络通信的。但是导致代码非常臃肿,而且每一个应用程序的运行,都需要写一套网络通信和任务分布。09年下半年,中某地区断网半年,只能访问该地区本地的网络,然后想到我们搜索引擎的商业运营的机会来了,当时用了大约10台机器(实验室超低配置机器,内存512M,单核),可是访问量大了之后,系统直接崩溃,调试和运营都遇到巨大的挑战。后来我不断的重构搜索引擎,发现怎么做都很困难。
  于是,我一直在思考,我们需要一个平台或者叫计算引擎,让程序员写的程序,这些程序浑然天成的支持分布式计算,这还不够,还希望能够实时返回计算结果,而程序员却不知道有多少台机器在为运行它的程序。
  这就是我构思的分布式计算引擎,而今天,它已经实现,尽管不完美。它是我承诺的Iveely Search Engine 0.5.0 的分布式搜索引擎的基础,它的名字叫Iveely Computing,一款开源分布式计算引擎,为大数据实时处理而生(Iveely是“I void everything,except love you!”的首字母简写)。开源主页、源码下载:https://github.com/Fanping/iveely/releases。最初我们命名的开发代号叫:Dream,Dream平台曾经在新华网出现过,早期版本的数据分析。

 基本结构

  整个Iveely Computing的基础库是Iveely Framework,Iveely Framework基础结构如下图所示:

  主要是在进程,文本处理、日志、网络、算法和数据结构上,进行了二次封装,整个底层框架依然是.NET Framework。Iveely Framework与Iveely Computing是两个project,但是Computing对Framework会有依赖。Iveely Computing基础结构如下图所示:

整个过程涉及6个主要exe文件,每个exe都是Iveely Computing中非常重要的一环。
     Iveely.CloudComputing.Cacher.exe:分布式缓存。用于分布式存放小数据。采用一致性hash算法。
     Iveely.CloudComputing.Merger.exe:全局运算器。在分布式计算中,常常会涉及到全局运算,每一个节点都在计算,那么当遇到全局求和、求平均等等之类的时候,就需要Merger来操作。
     Iveely.CloudComputing.StateCenter.exe:状态控制中心。用于当前所有worker、Merger的控制运算中心。
     Iveely.CloudComputing.Worker.exe:用户任务的真正执行者。
     Iveely.CloudComputing.Supervisor.exe:用于监控Worker的执行情况,倘若Worker异常中断,则自动重启worker。
     Iveely.CloudComputing.Client.exe:用户的控制台操作程序,用户提交程序,查看自己应用程序的运行状态。

编译部署

  我在微软一年多,离开的时候才发现,学到最多的不是程序、不是架构,而是用户体验,总结一句话:你的程序,不要消极用户心情。所以我在部署的时候,依然采用了“一键式本地部署”。在开源社区,这是很多开源人需要学习微软的一点,很多开源程序,搭建编译部署步骤非常繁琐,很容易消极使用者心情。
  编译
  编译之前,请先在开源主页上下载0.5.0源码。无须下载其它任何第三方软件,你所下载的源码,将会是Iveely Computing中任何dll的源码。下载后解压,直接用Visual Studio 2012以上版本打开整个解决方案(Iveely.sln),打开之后,你平时怎么编译,现在就怎么编译。为了更好的在开发中尽可能测试到Iveely Computing,Debug Build和Release Build有一定区别:
  Debug Build:解决方案中,所有代码均会被编译,包括测试代码,编译后生成的文件在..\ Iveely\Iveely.CloudComputing\Debug。
  Release Build:解决方案中,只有被使用到的代码会被编译,编译后生成的文件在..\Iveely\Iveely.CloudComputing\Release。
  本地部署

  在本地,一键式部署,只需要在你编译生成的文件加下找到“Deploy-Local-Environment.bat”双击,整个本地环境将会全部搭建完毕。“Deploy-Local-Environment.bat”文件中的批处理内容如下:

              start "StateCenter" Iveely.CloudComputing.StateCenter.exe
              start "Supervisor" Iveely.CloudComputing.Supervisor.exe
              start "Worker:8001" Iveely.CloudComputing.Worker.exe 8001
              start "Worker:8002" Iveely.CloudComputing.Worker.exe 8002
              start "Merger" Iveely.CloudComputing.Merger.exe
              start "Cacher" Iveely.CloudComputing.Cacher.exe

  其实就是启动应用程序的命令,Worker的数量可根据自己机器的性能进行调整。当然也有相应的关闭的批处理文件,也是在编程生成的文件夹下“Stop-Local-Environment.bat”,文件中的批处理内容如下:

              @taskkill /fi "WINDOWTITLE eq StateCenter"
              @taskkill /fi "WINDOWTITLE eq Supervisor"
              @taskkill /fi "WINDOWTITLE eq Worker:8001"
              @taskkill /fi "WINDOWTITLE eq Worker:8002"
              @taskkill /fi "WINDOWTITLE eq Merger"
              @taskkill /fi "WINDOWTITLE eq Cacher"

  当在启动的时候,如果Worker的数量自己有调整,请记得在“Stop-Local-Environment.bat”文件中也做相应调整。

  集群部署
  在实际应用当中,更多的是集群部署整个Iveely Computing。不管如何部署,请把编译后的文件夹“..\Iveely\Iveely.CloudComputing\Release”拷贝到你的目标机器上。Merger和StateCenter请拷贝到性能较好的机器中去,并首先双击运行。Worker根据任务的多少去部署,一般100G的数据,部署在4台内存4G、CPUi5双核的机器上就很容易处理,每台机器启动两个worker。Cache根据项目缓存是否经常用到,如果经常用到,建议多放在几台之中,如果整个过程你认为你不会用到缓存,至少请部署一台,但是缓存适合非常高效的小数据交换。建议整个过程中,多用缓存,少用Merge。

编写自己分布式程序

  编写您的应用程序之前,您必须了解,Iveely Computing有哪些指令Client.exe支持直接Main函数传递方式和普通命令行方式,二者效果一致。命令行指令格式如下:

  1) submit[file path][namespace.classname][app name]
  提交应用程序指令。[file path]是指应用程序的脚本路径;[namespace.classname]是指代码脚本中,执行的命名空间和类名;[app name]是这个应用程序的名称。例如:
Submit C:\\Example.cs MyNameSpace.ClassName ExampleApp
  2) split[file path][remote path][split string] [partition keys]
切分本地大数据文件到各个节点指令。[file path]是本地大文件的路径;[remote path]是结点里面的路径。例如:
Split C:\\BigData.txt /Data/big.txt
[split string]与[partition keys]属于可选项,当没有此参数时,partition按照大小平均分配,如果有这两个参数,则按照partition key进行分配,有可能数据不均匀。例如:
Split C:\\BigData.txt /Data/big.txt , 2 3
含义是切分本地文件C:\\BigData.txt到远程服务器结点,命名为/Data/big.txt 切分符号为“,”,按照第二列和第三列进行partition。
  3) download[remote path][file path]
下载各个节点的数据到本地指令。[remote path]是节点中的数据路径;[file path]是本地存储的路径。例如:
Download /Data/big.txt C:\\BigData.txt
  4) delete[remote path]
删除某个数据指令。删除操作将会在整个系统的每一个节点中删除,[remote path]是节点中数据的路径。例如:
Delete /Data/big.txt
  5) rename[file path][new file Name]
  重命名操作指令。[file path]是在远程节点中的文件路径名称。[new file Name]重新命名的名字。例如:
Rename /Data/big.txt newbig.txt
更改后的实际文件名:/Data/newbig.txt。
  6) list[/folder]
显示文件目录指令。[/folder]是指目录路径,默认是根目录。例如:
  7) kill [task name]
  用于停止正在运行的程序。
  8) task
  显示所有正在运行的程序。
  9) exit
  退出指令。
  现在开始你的编程之旅,方法及其简单,新建你的C#应用程序,并且添加Iveely.CloudComputing.Client引用如下图


  Iveely.Framework和NDatabase也是允许添加的,其它非.NET引用添加将会导致错误。在你的C#工程中,添加一个类,继承类Application,并实现该类的方法Run。this.Init(args)方法需要显示添加。
  在这之下,你可以按照您以前的思维编写任意的程序了,写完之后,按照下面的方法提交:


  1. 双击Iveely.CloudComputing.Client.exe。
  2. 按照submit命令提交您的程序。

实践示例

  词频统计(Word Count)应该是所有分布式计算中的“Hello World”程序,不管是Hadoop,还是Storm都是采用“Word Count”为大家打开初步认识。Iveely Computing依然采用“Word Count”作为初级入门应用。
  按照常用的逻辑思维,我们会考虑用一个哈希表来存放,如果插入的单词存在,则+1,如果不存在则放入哈希表,次数为1。在Iveely Computing中也是采用这样的方法进行计算。

 public override void Run(object[] args)
{
//0.先初始化
this.Init(args); //1.虚拟数据构建
string[] contents =
{
"This is Iveely Computing",
"Weclome here",
"Iveely is I void every thing,except love",
"Thanks,Iveely Team."
};
StringBuilder dataBuilder = new StringBuilder();
for (int i = ; i < ; i++)
{
Random random = new Random(i);
int index = random.Next(, );
dataBuilder.AppendLine(contents[index]);
} string[] words = dataBuilder.ToString().Split(new[] { ' ', ',', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
WriteToConsole("local words count:" + words.Length);
int globalWordCount = Mathematics.Sum<int>(words.Length);
WriteToConsole("global words count:" + globalWordCount); //2.子节点处理数据
Hashtable table = new Hashtable();
foreach (string word in words)
{
if (table.ContainsKey(word))
{
table[word] = int.Parse(table[word].ToString()) + ;
}
else
{
table.Add(word, );
}
} //3.归并所有结点处理结果
WriteToConsole("local word frequency count:" + table.Keys.Count);
table = Mathematics.CombineTable(table);
WriteToConsole("global word frequency count:" + table.Keys.Count); //4.写入文件
StringBuilder builder = new StringBuilder();
foreach (DictionaryEntry dictionaryEntry in table)
{
builder.AppendLine(dictionaryEntry.Key + " " + dictionaryEntry.Value);
}
WriteText(builder.ToString(), "WordCount.result", true);
}

  这就是Iveely Computing中实际用到的代码,唯一不同的地方在于最后一行代码Mathematics.CombineTable(table),其实也就是开发需要清楚的知道,某些代码是本地运行代码,某些代码是全局运行代码。如果不执行Mathematic.CombineTable(table),则table将是本地运行的结果,而非全局运行的结果,结果理所当然是错误的。在此,再次说明,如果本地代码运行完毕,需要生成全局数据,则需要调用Mathematic里面的方法,生成全局数据,调用完后的数据如果需要写到文件,则记得global=true。反之,global=false。示例源码请参见源码包中的Example_WordCount.cs文件。演示视频下载[8M]。

Iveely Search Engine 0.5.0

如果您觉得WordCount的示例,不足以为您证明Iveely Computing强大的能力,那么下面一个希望您能够喜欢-迟来的Iveely Search Engine 0.5.0。Iveely SE沉寂了大半年,很多社区朋友,问我是否停止了Iveely SE前进的步伐,我说没有,沉寂是为了更大一步的跨越。在0.4.0的时候,我说IveelySE的0.5.0版本要实现分布式。今天它结合Iveely Computing一起诞生了。源码在这里下载。
IveelySE 0.5.0的代码量不足800行,也许你觉得吃惊,但这正是Iveely Computing的魅力。先看下运行截图。

Iveely SE 0.5.0在0.4.0上的至少有下列三大突破:
     1. 强大的分布式计算引擎的支持,即Iveely Computing的支持。将0.4.0的独立应用程序变成了分布式应用。将Iveely Computing中的分布式缓存、存储、计算引入,使得0.5.0的计算性能获得超越。基于Iveely Computing也使得容灾处理变得自动化,而无须人工干涉。
     2. 插件式功能扩展,模块更加独立。在0.4.0中,若为搜索引擎添加了新的功能,则需要停止0.4.0然后重新启动。在0.5.0中,添加的新功能将不会影响以前的功能正常运行,只需将新的功能写成基于Iveely Computing的应用程序,随时监控该功能的运行情况,也可随时中止。
     3. 支持问题式搜索、关联性搜索。问题式搜索是指,例如搜索“金正恩的姑父是谁?”的时候,答案直接能够给出“张成泽”,下列截图中的第一条记录及时问题式搜索结构[更多这样的示例,参见我的微博]。关联性搜索,是指给出一个事或物,能够直接给出与它相关联的事物。下图中的右边关系图即是。

Iveely SE 0.5.0是基于Iveely Computing上运行起来的,因此在Iveely Computing环境搭建完毕之后,需要通过Iveely.CloudComputing.Client.exe提交搜索程序:submit Backstage.cs Iveely.SearchEngine.Backstage Searcher。如下图所示:

然后通过task指令,查看运行状态,可以看到当前有两个结点正在运行,这就表示搜索引擎已经在两个结点运行起来。搜索页面需要自己定制,在Iveely.SearchEngine中有一个Library类,可以直接调用。若您采用其它编程语言,可以调用Query.asmx这个Web Service。这样很简单的就把搜索引擎搭建好了。搜索效果如前面两图所示。

捐助我们

也许您会很奇怪,为何需要捐助,我们需要服务器。数据量越来越大,我们自身的服务器已经不能继续支撑我们的服务器,我们渴望将Iveely.com运行起来,可是硬件限制了我们。因此,我们恳请若您想在硬件上捐助我们,可以捐助服务器[这里捐助]或者支付宝资助[这里资助],我们将心存感激。我们正如wiki一样,让每个人平等自由的获得知识,我们将继续致力于开源事业,倘若达到一定条件,我们将会让Iveely.com正式运行起来。

结    语

  世界变化很快,在我们这个浮躁的世界,我们希望自己能坚持理想,总有一天,我们都会逝去,不管是在过去,还是当前,甚至未来,我们需要的不仅仅的是生活的物质基础,我们还需要生活的快乐,而最快乐的,莫过于为理想而奋斗。

开源分布式计算引擎 & 开源搜索引擎 Iveely 0.5.0 为大数据而生的更多相关文章

  1. 联童科技基于incubator-dolphinscheduler从0到1构建大数据调度平台之路

    联童科技是一家智能化母婴童产业平台,从事母婴童行业以及互联网技术多年,拥有丰富的母婴门店运营和系统开发经验,在会员经营和商品经营方面,能够围绕会员需求,深入场景,更贴近合作伙伴和消费者,提供最优服务产 ...

  2. Slickflow.NET 开源工作流引擎基础介绍(九) -- .NET Core2.0 版本实现介绍

    前言:.NET Core 是.NET Framework的新一代版本,是微软开发的第一个跨平台 (Windows.Mac OSX.Linux) 的应用程序开发框架(Application Framew ...

  3. 实践:由0到1-无线大数据UX团队的成长

    背景 大数据产品的在项目成立之初,采用的是模仿原有网优工具的方式做UI设计,由BA主导画草图.手绘线框图.excel制作,更有直接打开参考产品做原型的方式,没有统一的设计和规范可言.随着团队逐渐增多. ...

  4. 开源搜索引擎Iveely 0.8.0发布,终见天日

    这是一篇博客,不是,这是一篇开源人的心酸和喜悦,没有人可以理解我们的心情,一路的辛酸一路的艰辛,不过还好,在大家的支持下,总算是终见天日,谢谢那些给予我们无私帮助的朋友.您的支持,依然是我们无限的动力 ...

  5. 开源搜索引擎Iveely 0.8.0

    开源搜索引擎Iveely 0.8.0 这是一篇博客,不是,这是一篇开源人的心酸和喜悦,没有人可以理解我们的心情,一路的辛酸一路的艰辛,不过还好,在大家的支持下,总算是终见天日,谢谢那些给予我们无私帮助 ...

  6. 《深度访谈:华为开源数据格式 CarbonData 项目,实现大数据即席查询秒级响应》

    深度访谈:华为开源数据格式 CarbonData 项目,实现大数据即席查询秒级响应   Tina 阅读数:146012016 年 7 月 13 日 19:00   华为宣布开源了 CarbonData ...

  7. 开源大数据技术专场(上午):Spark、HBase、JStorm应用与实践

    16日上午9点,2016云栖大会“开源大数据技术专场” (全天)在阿里云技术专家封神的主持下开启.通过封神了解到,在上午的专场中,阿里云高级技术专家无谓.阿里云技术专家封神.阿里巴巴中间件技术部高级技 ...

  8. Elastic Stack 开源的大数据解决方案

    目的 本文主要介绍的内容有以下三点: 一. Elastic Stack是什么以及组成部分 二. Elastic Stack前景以及业务应用 三. Elasticsearch原理(索引方向) 四. El ...

  9. 开发一个不需要重写成Hive QL的大数据SQL引擎

    摘要:开发一款能支持标准数据库SQL的大数据仓库引擎,让那些在Oracle上运行良好的SQL可以直接运行在Hadoop上,而不需要重写成Hive QL. 本文分享自华为云社区<​​​​​​​​​ ...

随机推荐

  1. 我的Windows核心编程——完成端口+套接字 图解

    ========================声明============================ 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本声明). 本文不定期修改完善,为 ...

  2. C语言杂谈(二)自增运算符++与间接访问运算符*的结合关系和应用模式

    自增运算符++有前缀和后缀两种,在搭配间接访问运算符*时,因为顺序.括号和结合关系的影响,很容易让人产生误解,产生错误的结果,这篇文章来详细分析一下这几种运算符的不同搭配情况. ++.--和*的优先级 ...

  3. MAVEN整理(乘国庆还有时间,停下来整理一下)

    昨天写下了这篇博客(http://www.cnblogs.com/hzmark/p/131003Release.html),今天有时间,就这里一下第一篇内容. 换工作公司开发平台: WINDOWS+V ...

  4. Spring @Transactional ——事务回滚

    工作原理运行配置@Transactional注解的测试类的时候,具体会发生如下步骤1)事务开始时,通过AOP机制,生成一个代理connection对象,并将其放入DataSource实例的某个与Dat ...

  5. 学完STM32开发板,就选4412开发板让你有目标的学习嵌入式开发

    600余页用户使用手册 linux实验手册(资料不断更新)100期配套零基础高清视频教程 轻松入门 (资料不断更新)2000人售后认证群 在线支持 售后无忧 源码全开源  原厂技术资料经典学习书籍推荐 ...

  6. check the element in the array occurs more than half of the array length

    Learn this from stackflow. public class test { public static void main(String[] args) throws IOExcep ...

  7. [转]Highcharts仪表盘制作

    http://www.runoob.com/highcharts/highcharts-guage-solid.html 本文转自:http://blog.csdn.net/javaliuzhiyue ...

  8. MIT jos 6.828 Fall 2014 训练记录(lab 4)

    源代码参见我的github: https://github.com/YaoZengzeng/jos Part A: Multiprocessor Support and Cooperative Mul ...

  9. Zookeeper C API 指南一(转)

    Zookeeper 监视(Watches) 简介 Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量 ...

  10. 给定一个整数N,找出一个比N大且最接近N,但二进制权值与该整数相同 的数

    1,问题描述 给定一个整数N,该整数的二进制权值定义如下:将该整数N转化成二进制表示法,其中 1 的个数即为它的二进制权值. 比如:十进制数1717 的二进制表示为:0000 0110 1011 01 ...