谷歌关于大数据的三篇文章之一就是Google File System,专门存储超大数据文件;同时,HDFS分布式文件系统,为整个生态圈提供最基础的文件存储服务。理论依据GFS与HDFS相同,Hadoop整个生态圈都是开源的。
2002年开始创建hadoop,最初版本遇到了瓶颈,最主要是可拓展问题,不能解决数十亿的网页存储问题。2003年谷歌分布式文件系统论文发布(GFS),Nutch项目组决定完成一个开源实现;接着2004年谷歌发布了另外一个关于大数据的重要论文,分布式计算框架Map-Reduce。由于谷歌未开源分布式文件系统和分布式计算框架源代码,Nutch项目组基于两篇论文思想,开源出来NDFS和MapReduce;至2006初成为Lucene的一个子项目,成为Hadoop。
由Hadoop来源来看,主要包含两部分内容就是(HDFS和MapReduce),一个解决大数据文件的分布式存储,另一个解决大数据文件分布式计算。重要参考设计思想是谷歌分布式文件系统论文,谷歌分布式计算框架论文。经过版本的更迭升级,Hadoop项目分割成三个独立的模块,Common、HDFS、MapReduce。
Hadoop特性:易于编程(当时确实如此,设计目标)、良好的拓展性、高容错性。
Map-Reduce计算框架,用户需要编写两个函数,map()和reduce()函数。
Map()函数:主要是以key-value作为输入,映射成另外一种key/value作为中间输出写入本地磁盘。Map-Reduce计算框架会自动将这些中间数据按照key值(映射后的key)进行聚集,且key值相同的数据被统一交给reduce函数处理。聚集策略:默认是哈希取模。
Reduce()函数:以key及对应的value列表作为输入,经过计算合并相同key的value值后,产生最终的key-value写入HDFS。
基础详细内容可参考中文网站:http://hadoop.apache.org/docs/r1.0.4/cn/
MapReduce能够解决的问题特点:任务可以被分解为多个子问题,且这些子问题相对独立,彼此之间不会有牵制,可并行计算处理这些问题。
其中比较复杂的应用问题:
(1)排行榜(Top K问题)热搜最高的几个词。
(2)K-means聚类(无监督学习算法),基于距离的聚类算法。认为两个对象的距离越近,其相似度就越大。首先随机选择 K 个对象作为初始中心点, 然后不断迭代计算, 直到满足终止条件(达到迭代次数上限或者数据点到中心点距离的平方和最小)。 在第 I 轮迭代中, map() 函数计算每个对象到中心点的距离, 选择距每个对象(object) 最近的中心点(center_point), 并输出 <center_point, object > 对。 reduce() 函数计算每个聚类中对象的距离均值, 并将这 K 个均值作为下一轮初始中心点。
(3)贝斯分类问题。该问题分两个步骤,1是训练样本,2是分类。
未能和不能解决的应用问题:
Fibonacci 数值计算。像这种不能分解成若干互不相干子问题,不能用MapReduce解决。
层次聚类法。
Map-Reduce编程模型分布式编程方法:
1)迭代。遍历输入数据并将其解析成key-value。
2)将输入Key-Value对映射成另外一种Key-value对。
3)依据key对中间数据进行分组grouping。
4)依组为单位对数据进行规约(reduce)。
5)迭代。将最终的key-value保存到输出文件。
Java基本的api主要的编程组件有,InputFormat、OutputFormat、Mapper、Reducer、Partioner。
Hadoop如何实现HDFS文件存储系统的呢?