由于我的对这块的知识也不熟悉,因此大多内容来源于网络.node
1. Hadoop项目框架程序员
2. Hadoopweb
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。算法
用户能够在不了解分布式底层细节的状况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。数据库
Hadoop实现了一个分布式文件系统(Hadoop DistributedFile System),简称HDFS。HDFS有高容错性的特色,而且设计用来部署在低廉的(low-cost)硬件上;并且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。编程
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。小程序
3. HDFS后端
HDFS(Hadoop Distributed File System,Hadoop分布式文件系统),它是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,适合那些有着超大数据集(large data set)的应用程序。缓存
HDFS的设计特色是:服务器
一、大数据文件,很是适合上T级别的大文件或者一堆大数据文件的存储,若是文件只有几个G甚至更小就没啥意思了。
二、文件分块存储,HDFS会将一个完整的大文件平均分块存储到不一样计算器上,它的意义在于读取文件时能够同时从多个主机取不一样区块的文件,多主机读取比单主机读取效率要高得多得都。
三、流式数据访问,一次写入屡次读写,这种模式跟传统文件不一样,它不支持动态改变文件内容,而是要求让文件一次写入就不作变化,要变化也只能在文件末添加内容。
四、廉价硬件,HDFS能够应用在普通PC机上,这种机制可以让给一些公司用几十台廉价的计算机就能够撑起一个大数据集群。
五、硬件故障,HDFS认为全部计算机均可能会出问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,若是其中一台主机失效,能够迅速找另外一块副本取文件。
HDFS的关键元素:
Block:将一个文件进行分块,一般是64M。
NameNode:保存整个文件系统的目录信息、文件信息及分块信息,这是由惟一一台主机专门保存,固然这台主机若是出错,NameNode就失效了。在Hadoop2.*开始支持activity-standy模式----若是主NameNode失效,启动备用主机运行NameNode。
DataNode:分布在廉价的计算机上,用于存储Block块文件。
4. MapReduce
GFS和BigTable已经为咱们提供了高性能、高并发的服务,可是并行编程可不是全部程序员都玩得转的活儿,若是咱们的应用自己不能并发,那GFS、BigTable也都是没有意义的。MapReduce的伟大之处就在于让不熟悉并行编程的程序员也能充分发挥分布式系统的威力。
简单归纳的说,MapReduce是将一个大做业拆分为多个小做业的框架(大做业和小做业应该本质是同样的,只是规模不一样),用户须要作的就是决定拆成多少份,以及定义做业自己。
例子:统计词频
若是我想统计下过去10年计算机论文出现最多的几个单词,看看你们都在研究些什么,那我收集好论文后,该怎么办呢?
方法一:我能够写一个小程序,把全部论文按顺序遍历一遍,统计每个遇到的单词的出现次数,最后就能够知道哪几个单词最热门了。
这种方法在数据集比较小时,是很是有效的,并且实现最简单,用来解决这个问题很合适。
方法二:写一个多线程程序,并发遍历论文。
这个问题理论上是能够高度并发的,由于统计一个文件时不会影响统计另外一个文件。当咱们的机器是多核或者多处理器,方法二确定比方法一高效。可是写一个多线程程序要比方法一困难多了,咱们必须本身同步共享数据,好比要防止两个线程重复统计文件。
方法三:把做业交给多个计算机去完成。
咱们可使用方法一的程序,部署到N台机器上去,而后把论文集分红N份,一台机器跑一个做业。这个方法跑得足够快,可是部署起来很麻烦,咱们要人工把程序copy到别的机器,要人工把论文集分开,最痛苦的是还要把N个运行结果进行整合(固然咱们也能够再写一个程序)。
方法四:让MapReduce来帮帮咱们吧!
MapReduce本质上就是方法三,可是如何拆分文件集,如何copy程序,如何整合结果这些都是框架定义好的。咱们只要定义好这个任务(用户程序),其它都交给MapReduce。
在介绍MapReduce如何工做以前,先讲讲两个核心函数map和reduce以及MapReduce的伪代码。
3. map函数和reduce函数
map函数和reduce函数是交给用户实现的,这两个函数定义了任务自己。
map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。
reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(一般只有一个或零个值)。
在统计词频的例子里,map函数接受的键是文件名,值是文件的内容,map逐个遍历单词,每遇到一个单词w,就产生一个中间键值对<w, "1">,这表示单词w咱又找到了一个;MapReduce将键相同(都是单词w)的键值对传给reduce函数,这样reduce函数接受的键就是单词w,值是一串"1"(最基本的实现是这样,但能够优化),个数等于键为w的键值对的个数,而后将这些“1”累加就获得单词w的出现次数。最后这些单词的出现次数会被写到用户定义的位置,存储在底层的分布式存储系统(GFS或HDFS)。
4. MapReduce是如何工做的
上图是论文里给出的流程图。一切都是从最上方的user program开始的,user program连接了MapReduce库,实现了最基本的Map函数和Reduce函数。图中执行的顺序都用数字标记了。
MapReduce库先把user program的输入文件划分为M份(M为用户定义),每一份一般有16MB到64MB,如图左方所示分红了split0~4;而后使用fork将用户进程拷贝到集群内其它机器上。
user program的副本中有一个称为master,其他称为worker,master是负责调度的,为空闲worker分配做业(Map做业或者Reduce做业),worker的数量也是能够由用户指定的。
被分配了Map做业的worker,开始读取对应分片的输入数据,Map做业数量是由M决定的,和split一一对应;Map做业从输入数据中抽取出键值对,每个键值对都做为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。
缓存的中间键值对会被按期写入本地磁盘,并且被分为R个区,R的大小是由用户定义的,未来每一个区会对应一个Reduce做业;这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker。
master通知分配了Reduce做业的worker它负责的分区在什么位置(确定不止一个地方,每一个Map做业产生的中间键值对均可能映射到全部R个不一样分区),当Reduce worker把全部它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对汇集在一块儿。由于不一样的键可能会映射到同一个分区也就是同一个Reduce做业(谁让分区少呢),因此排序是必须的。
reduce worker遍历排序后的中间键值对,对于每一个惟一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。
当全部的Map和Reduce做业都完成了,master唤醒正版的user program,MapReduce函数调用返回user program的代码。
全部执行完毕后,MapReduce输出放在了R个分区的输出文件中(分别对应一个Reduce做业)。用户一般并不须要合并这R个文件,而是将其做为输入交给另外一个MapReduce程序处理。整个过程当中,输入数据是来自底层分布式文件系统(GFS)的,中间数据是放在本地文件系统的,最终输出数据是写入底层分布式文件系统(GFS)的。并且咱们要注意Map/Reduce做业和map/reduce函数的区别:Map做业处理一个输入数据的分片,可能须要调用屡次map函数来处理每一个输入键值对;Reduce做业处理一个分区的中间键值对,期间要对每一个不一样的键调用一次reduce函数,Reduce做业最终也对应一个输出文件。
我更喜欢把流程分为三个阶段。第一阶段是准备阶段,包括一、2,主角是MapReduce库,完成拆分做业和拷贝用户程序等任务;第二阶段是运行阶段,包括三、四、五、6,主角是用户定义的map和reduce函数,每一个小做业都独立运行着;第三阶段是扫尾阶段,这时做业已经完成,做业结果被放在输出文件里,就看用户想怎么处理这些输出了。
5. 词频是怎么统计出来的
结合第四节,咱们就能够知道第三节的代码是如何工做的了。假设我们定义M=5,R=3,而且有6台机器,一台master。
这幅图描述了MapReduce如何处理词频统计。因为map worker数量不够,首先处理了分片一、三、4,并产生中间键值对;当全部中间值都准备好了,Reduce做业就开始读取对应分区,并输出统计结果。
5. HIVE
什么是Hive?
•Hive是基于Hadoop的一个数据仓库工具,能够将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
•本质是将SQL转换为MapReduce程序
为何使用Hive?
人员学习成本过高 项目周期要求过短 我只是须要一个简单的环境
MapReduce如何搞定 复杂查询好难 Join如何实现
•操做接口采用类SQL语法,提供快速开发的能力
•避免了去写MapReduce,减小开发人员的学习成本
•扩展功能很方便
Hive与传统数据库对比
6. HBase
HBase是什么?
HBase是一个构建在HDFS上的分布式列存储系统;
HBase是基于Google BigTable模型开发的,典型的key/value系统;
HBase是Apache Hadoop生态系统中的重要一员,主要用于海量结构化数据存储;
从逻辑上讲,HBase将数据按照表、行和列进行存储。
与hadoop同样,Hbase目标主要依靠横向扩展,经过不断增长廉价的商用服务器,来增长计算和存储能力。
HBase表的特色
大:一个表能够有数十亿行,上百万列;
无模式:每行都有一个可排序的主键和任意多的列,列能够根据须要动态的增长,同一张表中不一样的行能够有大相径庭的列;
面向列:面向列(族)的存储和权限控制,列(族)独立检索;
稀疏:空(null)列并不占用存储空间,表能够设计的很是稀疏;
数据多版本:每一个单元中的数据能够有多个版本,默认状况下版本号自动分配,是单元格插入时的时间戳;
数据类型单一:Hbase中的数据都是字符串,没有类型。
HBase的数据模型
RowKey:是Byte array,是表中每条记录的“主键”,方便快速查找,Rowkey的设计很是重要。
Column Family:列族,拥有一个名称(string),包含一个或者多个相关列
Column:属于某一个columnfamily,familyName:columnName,每条记录可动态添加
Version Number:类型为Long,默认值是系统时间戳,可由用户自定义
Value(Cell):Byte array
每一个column family存储在HDFS上的一个单独文件中,空值不会被保存。
Key 和 Versionnumber在每一个 column family中均有一份;
HBase 为每一个值维护了多级索引,即:<key, column family, column name, timestamp>
HBase的存储方式
物理存储:
一、 Table中全部行都按照row key的字典序排列;
二、 Table在行的方向上分割为多个Region;
三、 Region按大小分割的,每一个表开始只有一个region,随着数据增多,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region,以后会有愈来愈多的region;
四、 Region是Hbase中分布式存储和负载均衡的最小单元,不一样Region分布到不一样RegionServer上。
五、 Region虽然是分布式存储的最小单元,但并非存储的最小单元。Region由一个或者多个Store组成,每一个store保存一个columns family;每一个Strore又由一个memStore和0至多个StoreFile组成,StoreFile包含HFile;memStore存储在内存中,StoreFile存储在HDFS上。
StoreFile以HFile格式保存在HDFS上
HBase的架构及其组件
Hbase基本组件说明:
Client
包含访问HBase的接口,并维护cache来加快对HBase的访问,好比region的位置信息
Master
1. 为Region server分配region(Table在行的方向上分割为多个Region)
2. 负责Region server的负载均衡
3. 发现失效的Region server并从新分配其上的region(zookeeper)
4. 管理用户对table的增删改查操做
Region Server
1. Regionserver维护region,处理对这些region的IO请求 `
2. Regionserver负责切分在运行过程当中变得过大的region(当表中的行数增多时,region达到阀值的时候会进行分割)
Zookeeper做用(我的理解至关于一个容灾机制)
1. 经过选举,保证任什么时候候,集群中只有一个master,Master与RegionServers 启动时会向ZooKeeper注册
2. 存贮全部Region的寻址入口
3. 实时监控Region server的上线和下线信息。并实时通知给Master
4. 存储HBase的schema和table元数据(这个schema应该怎么理解?)
5. Zookeeper的引入使得Master再也不是单点故障(除非全部服务器挂了,不然zookeeper能够保证其正常运行)
7. pig
什么是pig?
Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin该语言的编译器会把类SQL的数据分析请求转换为一系列通过优化处理的MapReduce运算。Pig为复杂的海量数据并行计算提供了一个简单的操做和编程接口。
pig的特色
一、专一于于大量数据集分析(ad-hocanalysis , ad-hoc 表明:a solution that has been custom designed for a specific problem );
二、运行在集群的计算架构上,YahooPig 提供了多层抽象,简化并行计算让普通用户使用;这些抽象完成自动把用户请求queries翻译成有效的并行评估计划,而后在物理集群上执行这些计划;
三、提供相似 SQL 的操做语法;
四、开放源代码;
pig的主要用户 yahoo twitter
8. Zookeeper
ZooKeeper 顾名思义 动物园管理员,他是拿来管大象(Hadoop)、 蜜蜂(Hive) 、 小猪(Pig) 的管理员, Apache Hbase和 Apache Solr以及LinkedIn sensei 等项目中都采用到了Zookeeper。ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,ZooKeeper是以Fast Paxos算法为基础,实现同步服务,配置维护和命名服务等分布式应用。
Zookeeper 从程序员的角度来说能够理解为Hadoop的总体监控系统。若是namenode,HMaster宕机后,这时候Zookeeper 的从新选出leader。
9. Hive/pig与HBase的区别
Hive的底层能够是HBase或者HDFS上存储的文件。
Hive的做用是把HQL翻译成MapReduce程序,从而减小分析人员每次都要写冗长Java程序的工做量。单次Hive查询都须要耗费分钟级以上的时间(哪怕一个再小的表),所以没法做为web后端的数据库使用。
HBase能够替代MySQL使用,至少淘宝就是这么作了。HBase是建造在HDFS基础上的分布式数据库,能够支持海量数据(比MySQL高一到两个量级)的存储和查询。还不容易丢失数据。HBase为查询而生的,它经过组织起节点內全部机器的內存,提供一個超大的內存Hash表,它须要组织本身的数据结构,包括磁盘和內存中的,而Hive是不作这个的,表在HBase中是物理表,而不是逻辑表,搜索引擎使用它來存储索引,以知足查询的实时性需求。
pig和hive对于开发人员,直接使用JavaAPIs多是乏味或容易出错的,同时也限制了Java程序员在Hadoop上编程的运用灵活性。因而Hadoop提供了两个解决方案,使得Hadoop编程变得更加容易。
•Pig是一种编程语言,它简化了Hadoop常见的工做任务。Pig可加载数据、表达转换数据以及存储最终结果。Pig内置的操做使得半结构化数据变得有意义(如日志文件)。同时Pig可扩展使用Java中添加的自定义数据类型并支持数据转换。
•Hive在Hadoop中扮演数据仓库的角色。Hive添加数据的结构在HDFS(hivesuperimposes structure on data in HDFS),并容许使用相似于SQL语法进行数据查询。与Pig同样,Hive的核心功能是可扩展的。
Pig和Hive老是使人困惑的。Hive更适合于数据仓库的任务,Hive主要用于静态的结构以及须要常常分析的工做。Hive与SQL类似促使其成为Hadoop与其余BI工具结合的理想交集。Pig赋予开发人员在大数据集领域更多的灵活性,并容许开发简洁的脚本用于转换数据流以便嵌入到较大的应用程序。Pig相比Hive相对轻量,它主要的优点是相比于直接使用Hadoop Java APIs可大幅削减代码量。正由于如此,Pig仍然是吸引大量的软件开发人员。