Hadoop生态系统

一、概述
Hadoop是一套为处理大数据而生的生态系统,采用分布式架构,组件众多,每个组件之间耦合度很低,都可以独立的使用或是基于非hadoop生态系统组件使用,但组合使用可以达到更好的效果,其核心组件为HDFS,Yarn,Mapreduce,HBase。
1. HDFS:
H即Hadoop,DFS即分布式文件系统,分布式文件系统是大数据处理的核心。与传统意义上驱动级别文件系统(如FAT32,NTFS)不同,HDFS整套文件系统由Java编写,规定并实现了文件的读写,即文件依然存储于传统文件系统之上,但交由HDFS管理。
HDFS是冗余存储的,具有高容错性,高可靠,适合存储超大文件,并适合在价格低廉的服务器上部署。
HDFS采用块式存储,并在内存中记录块的索引,通常情况下每个文件最少为一个块。2.0+版本后默认每个块为128M(可在配置文件中修改),并将块冗余复制多份(默认为3份,可在配置文件或使用命令修改),例如:存储一个150M的文件,将分为两个块,在实际存储不足128M的块不会占用多余的本地硬盘空间,其中一个为128M,另一个为22M,并复制3份,一共6个块,在集群环境下,会分别存储到不同服务器中。这样带来的好处是:1.可以同时从多台服务器进行读写,极大的提高读取速度,即使使用廉价硬盘,也可以很容易的达到上百MB/S,但是在单网口千兆交换机情况下,最大提供只有1000/8=125MB/s的速度,所以通常情况下,HDFS的瓶颈在带宽上。2.高可用,在实际生产环境下,服务器宕机可以说是常态,HDFS可以保证在一台甚至多台服务器宕机的情况下,数据依然是有效的。块式存储带来的缺点是,不适用于存储大量小文件,由于每个块映射到的内存大小是固定的,不足128M的块也会在内存中映射一个块,存储大量的小文件,虽然不会占用多余的硬盘空间,但是很容易造成内存的大量使用,甚至溢出。
HDFS核心组件主要包括NameNode ,DataNode。
NameNode中不存储数据,负责管理数据索引,随着文件数量增多消耗的内存逐渐增大,是所有文件操作接口的提供者。在2.0+提供了高可用(HA),通过部署两台NameNode,在其中一台工作(Action状态)时,另外一台(SecondaryNamenode)始终等待(Standby状态),两台NameNode上都会创建DFSZKFailoverController进程,通过Zookeeper同步数据索引状态等,可以认为两台NameNode上的内容是完全一直的,当Action状态的NaneNode发生异常或宕机时,可以自动的切换到 SecondaryNamenode工作。
DateNode用于数据存储,不会消耗很多内存,被NameNode管理。

2. Mapreduce:
Mapreduce是一种分布式并行计算模型,通常使用于HDFS之上:简单的来说,就是对于一个计算量巨大的任务,分割到多台服务器上并行的计算,再将结果统计合并。
使用Mapreduce分布式计算可以极大的利用多台服务器进行并行计算,但是相对的来说,维护数据一致性,以及网络传输中的异常处理,会有相当大的计算开销和网络开销,很容易达到网络带宽的瓶颈,因此Mapreduce本身的机制造成了实时性很差,不适用于在线处理,但是十分适合离线处理超大数据,并可以在很大程度上保证计算结果的可靠性。
 在一个Mapreduce过程中,首先,将海量数据大文件进行分割,对于每一个分割块,将进入Map阶段,以 “Key-Value对” 的形式传入Map 函数,然后Map函数对这些键值对进行处理,并写入到中间结果,在所有的Map函数完成后,Mapreduce会将相同 Key合并并排序,并根据Partitioner组件(可自定义),转发到相应的Reduce函数中,再由Reduce函数完成合并任务,输出结果。

3. Yarn:资源管理器,详细内容待补充。

4.HBase:HBase是一个非关系型列式数据库,
HBase结构:

在HBase提供的Shell命令行中,使用scan命令获得表数据如下:
    rowkey                      column
20160504000193                        column=dvb:lid, timestamp=1462377516000, value=1         
20160504000193               column=dvb:pn, timestamp=1462377516000, value=2                 
20160504000193                        column=dvb:ucioid, timestamp=1462377516000, value=0                                                            
20160504000193                        column=dvb:wl, timestamp=1462377516000, value=277                                                              
20160505000193                        column=dvb:lid, timestamp=1462438343000, value=3                
20160505000193                        column=dvb:pn, timestamp=1462438343000, value=4                 
20160505000193                        column=dvb:ucioid, timestamp=1462438343000, value=0                                                            
20160505000193                        column=dvb:wl, timestamp=1462438343000, value=31

RowKey:表中每条记录的“主键”,由于HBase在文件系统的存储方式,决定使用RowKey查找是极为高效率的,因此,HBase的查找效率很大程度上取决于RowKey的设计
Column Family:列族,拥有一个名称,包含一个或者多个相关列,对于列族的划分,可将不经常修改与经常修改的数据划分到不同的列族
Column:属于某一个Column Family,familyName:columnName,可理解为列名,在HBase存储中, Column Family : Column这样的格式存在于所有字段当中,所以,在实际情况下,这两个字段名尽量简短,以节省存储空间
Timestamp:类型为Long,默认值是系统时间戳,可由用户自定义
Value:该列对应的值
除了以上结构,还有Version,如果设置了最大Version不为N,N不为0,那么Hbase将根据时间戳保留修改之前的近N次数据,对于不同Version, Column Family, Column都可以是不相同的

HBase提供了和HDFS类似的保证高可用方式,使用Zookeeper同步HMaster状态,当正在工作的HMaster异常后,另一个HMaster会自动的开始工作。

二、常用配置文件
1.hadoop:
hadoop配置文件位于hadoop路径下的etc/hadoop/路径当中
(1)core-site.xml



fs.defaultFS
hdfs://masters

<!--指定hadoop数据临时存放目录-->
            <property>
                <name>hadoop.tmp.dir</name>
                <value>/home/tvbz/hadoop/hdfs/temp</value>
            </property> 
            <!--指定hadoop IO 缓存大小,一般为4096,可适量增大-->
            <property>    
                <name>io.file.buffer.size</name>
                <value>4096</value>
            </property>
            <!--指定zookeeper集群地址-->
            <property>
                <name>ha.zookeeper.quorum</name>
                <value>master10:2182,master14:2182,master15:2182</value>
            </property>
    </configuration>
(2)hadoop-env.sh
    在该配置文件需要配置java环境,及运行时JVM参数
(3)hdfs-stie.xml
    <configuration>
            <!--指定hdfs的nameservice为masters,需要和core-site.xml中的保持一致 -->    
            <property>
                <name>dfs.nameservices</name>
                <value>masters</value>
            </property>  
        <!-- 指定nameservice下面有两个NameNode,分别是master1,master2 -->
         <property>
                <name>dfs.ha.namenodes.masters</name>
                <value>master1,master2</value>
            </property>
            <!-- namenode1的RPC通信地址,端口号通常为9000 -->
            <property>
            <name>dfs.namenode.rpc-address.masters.master5</name>
            <value>master1:9000</value>
            </property>
            <!-- namenode1的http通信地址,Hdfs启动后,可在web中查看 -->
            <property>
                <name>dfs.namenode.http-address.masters.master5</name>
                <value>master1:50070</value>
            </property>
            <!-- nn2的RPC通信地址 -->
            <property>
                <name>dfs.namenode.rpc-address.masters.master6</name>
                <value>master6:9000</value>
         </property>
            <!-- nn2的http通信地址 -->
            <property>
                <name>dfs.namenode.http-address.masters.master6</name>
                <value>master6:50070</value>
            </property>
            <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
            <property>
                <name>dfs.namenode.shared.edits.dir</name>

qjournal://master5:8485;master6:8485;master7:8485/masters



dfs.journalnode.edits.dir
/home/tvbz/hadoop/journal



dfs.ha.automatic-failover.enabled
true



dfs.client.failover.proxy.provider.masters
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider



dfs.ha.fencing.methods
sshfence



dfs.ha.fencing.ssh.private-key-files
/root/.ssh/id_rsa

<!-- NameNode 数据路径 -->
            <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:///home/tvbz/hadoop/hdfs/name</value>
            </property>
        <!-- DataNode 数据路径 -->
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>file:///home/tvbz/hadoop/hdfs/data</value>
        </property>
        <!--  对每个文件冗余存储的数量 -->
        <property>
            <name>dfs.replication</name>
            <value>2</value>
        </property>
        <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->
        <property>
            <name>dfs.webhdfs.enabled</name>
            <value>true</value>
            </property>
    </configuration>

(4)slaves
        在该配置文件中,加入所有的datanode节点名称
        master3
        master4
        master5
        master6
        master7

(5)yarn-env.sh:
        在该配置文件需要配置java环境,及运行时JVM参数

(6)yarn-site.xml:
    <configuration>
        <!-- 开启resourcemanager 高可靠 -->
            <property>  
                    <name>yarn.resourcemanager.ha.enabled</name>  
                    <value>true</value>
            </property>
            <!-- 指定resourcemanager 的集群 id ,该id可自主命名-->
            <property>
                    <name>yarn.resourcemanager.cluster-id</name>  
                    <value>RM_HA_ID</value>  
            </property>
            <!-- 指定resourcemanager 高可用下的两个结点名称-->  
            <property>  
                    <name>yarn.resourcemanager.ha.rm-ids</name>  
                    <value>rm1,rm2</value>
            </property>  
            <!-- 分别指定RM的地址 -->  
            <property>  
                    <name>yarn.resourcemanager.hostname.rm1</name>  
                    <value>master3</value>
            </property>
            <property>
                    <name>yarn.resourcemanager.hostname.rm2</name>  
                    <value>master4</value>
            </property>
            <property>
                    <name>yarn.resourcemanager.recovery.enabled</name>
                    <value>true</value>
            </property>
            <property>
                    <name>yarn.resourcemanager.store.class</name>
            <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
            </property>
            <!-- 指定zk集群地址 -->
            <property>
                    <name>yarn.resourcemanager.zk-address</name>
                    <value>master10:2182,master14:2182,master15:2182</value>
            </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
            </property>
    </configuration>


2.hbase:
    hbase配置文件位于hbase路径下的conf/路径当中

  (1)core-site.xml:
        <configuration>
            <!-- 指定hdfs的nameservice为masters ,对于hbase来说,需要使用hdfs的客户端,该配置需要和hdfs中配置的nameservice保持一致-->
            <property>    
                <name>fs.defaultFS</name>    
                <value>hdfs://masters</value>    
            </property>
            <!--指定hadoop数据临时存放目录-->
            <property>
                <name>hadoop.tmp.dir</name>
                <value>/home/tvbz/hadoop/hdfs/temp</value>
            </property> 
            <property>    
                <name>io.file.buffer.size</name>
                <value>4096</value>
            </property>
            <!--指定zookeeper集群地址-->
            <property>
                <name>ha.zookeeper.quorum</name>
                <value>master10:2182,master14:2182,master15:2182</value>
            </property>
        </configuration>
(2)hbase-env.sh:
        在该配置文件需要配置java环境,及运行时JVM参数
(3)slaves
        在该配置文件中,加入所有的regionservers节点名称
        master3
        master4
        master5
        master6
        master7

如果使用HA部署方式,需要将hdfs配置文件的core-site.xml和hdfs-site.xml拷贝到hbase配置文件路径中,否则,hbase无法识别hdfs nameservice

三、部署方式
首先要分配好Hadoop服务器集群任务,例如:
master1 : Namenode(hdfs) HMaster(hbase)
master2 : Namenode(hdfs) HMaster(hbase)
master3 : Datanode(hdfs) HRegionServer(hbase) resourceManager(hdfs)
master4 : Datanode(hdfs) HRegionServer(hbase) resourceManager(hdfs)
master5 : Datanode(hdfs) HRegionServer(hbase) zookeeper JournalNode(hdfs)
master6 : Datanode(hdfs) HRegionServer(hbase) zookeeper JournalNode(hdfs)
master7 : Datanode(hdfs) HRegionServer(hbase) zookeeper JournalNode(hdfs)
1.准备工作:
(1).安装zookeeper并启动
(2).关闭所有服务器上系统自带的防火墙
(3).配置所有服务器之间ssh免密登陆
4.在其中一台服务器解压缩hadoop & hbase
5.替换配置文件,hadoop_conf 替换hadoop中的etc/conf, hbase_conf 替换 hbase中的conf
6.将替换后的hadoop和hbase复制到其他服务器的相同目录上
2.Hadoop部署:
1.start zookeeper
2.start journalnode at master5 6 7
sbin/hadoop-daemon.sh start journalnode
3.format hdfs namenode
master1 : bin/hadoop namenode -format
4.start namenode1
master1 : sbin/hadoop-daemon.sh start namenode
5.sync namenode2
master2: bin/hdfs namenode -bootstrapStandby
6.format zk:
bin/hdfs zkfc -formatZK
7.start dfs
sbin/start-dfs.sh
8.start yarn namenode1 namenode2:
sbin/start-yarn.sh
9.resourcemanager 1 2:
sbin/yarn-daemon.sh start resourcemanager
2.HBase部署:
在Hbase部署前,确保Hadoop以及Zookeeper已经部署完毕,且可用
分别在master1和master2上执行:
bin/start-hbase.sh