一、大纲形式

##一、Linux
	1. 操作系统
	2. 开源
	3. 免费
	4. 多用户
	5. 多进程
	6. 多线程
	7. 性能稳定
	8. 安全(权限的管理)
##二、Hadoop的核心模块之一HDFS
	解决了大数据集如何存储的问题
##三、Hadoop的核心模块之一Mapreduce
	解决了分布式系统上的大数据集如何快速,高效的分析与计算的问题,是一个运行在hdfs上的并发的计算与分析框架
##四、Hadoop的核心模块之一yarn
	是一个资源(内存,cpu,磁盘)管理框架
##五、Zookeeper
	是一个为分布式应用程序提供协调服务的分布式框架。
##六、hive
	 是一款数据仓库的工具,可以将HDFS上的具有结构化的文件映射(描述信息,也叫元数据,存储在MYSQL)成一张表。可以使用类sql语言进行管理。其实底层就是MR、SPARK、TEZ.

1、Linux

1. 概述
2. 常用指令
3. VI/VIM编辑工具
4. 网络配置(静态IP的设置)(重点)
5. 用户和权限管理(重点)
6. 软件包的安装
7. 虚拟机的克隆(学习期间 一定要会)
8. scp命令
9. 免密登录认证(原理,重点)
10. 时间同步(重点)
11. shell脚本(重点)

2、HDFS

1. 概述
	--4V(重点)
	--google的三篇论文:《GFS》《MapReduce》《Bigtable》
2. 安装:
	-- 单节点:
		--1)本地模式
		--2) 伪分布式:使用分布式文件系统,守护进程都是独立的(每一个进程都有自己的jvm)
	-- 多节点(重点)
		-- 完全分布式:使用分布式文件系统,守护进程是分布到各个节点的。也都是独立的进程。
3. 块的概念(重点)
	-- 合理的块的设计,都是为了解决稀缺的网络带宽和负载均衡问题
	-- 块是hdfs的存储单元
	-- 块的大小是相同的(除了最后一个块)
	-- 块的大小选择(参考的是寻址时间与传输时间的比例,认为在1:100的这个比例是最优)
4. hdfs的体系结构(重点)
5. hdfs的工作机制
	-- 开机启动过程
	-- 安全模式
	-- 检查点机制 (重点)
	-- 心跳反馈(10分30秒)(重点)
	-- 网络拓扑
	-- 机架感知(2.8.2是一个分水岭,  版本之前是 前两个副本一个机架, 版本之后是后两个副本在同一个机架)(重点)
	-- 动态的上下线
6. 读写流程(重中之重)
7. API
	-- 关心1: 此方法是静态的还是非静态的
	-- 关心2: 此方法的形参类型
	-- 关心3: 此方法的返回值类型

3、Mapreduce

1. 概述
	-- 框架的思想(重点)
	   移动计算而非移动数据,分而治之,然后进行汇总处理。
	   数据的扭转:                           fetch
	   	 原始数据--><K1,V1>-->map函数--<K2,V2>---><K2,List<V2>>--->reduce函数---><K3,V3>
2. 入门案例
	-- 分片机制(重点)
		inputSplit--->FileSplit(path,start,length,hosts)
	-- 分片的特点
3. 序列化机制
4. MapTask的流程(重点)
5. ReduceTask的流程(重点)
6. shuffle流程(重中之重)
7. yarn的job提交流程(重中之重)
8. 经典案例:
	--topN案例
	--共同好友案例
	--自定义输入格式案例
	--Map-join
	--Reduce-join

4、Zookeeper

1. 简介与特点
	--本身是一个分布式集群框架,一个leader,多个follower
	--适合安装在奇数台机器上,能正常服务的条件是,(n+1)/2台机器正常运行
						  允许(n-1)/2台机器宕机
	-- 每个服务节点的数据一致(重点理解)
2. 安装:
	集群模式(重点)
3. 数据模型:(重点)
	 类似Linux/Unix的文件系统的多层次的数据结构。每个节点称之为znode. znode可以记录子节点的名字和个数(相当于文件系统的目录),还可以存储1M以内的数据(相当于文件系统的文件).znode通过路径进行唯一标识。
	 每一个服务节点上都有这个数据模型,因此客户端连接上任务一个服务节点,数据都是一致的。
4. 选举制度
	权重:   epoch > zxid >serverid 
5. 监听和通知机制(重点理解)
6. 应用场景(重点):
	-- 集群的管理,比如HA
	-- 配置文件的管理
	-- 服务器的动态上下线感知
	-- 分布式锁
	-- 分布式队列

5、HIVE

1. 概念和体系结构,工作流程
	-- 体系结构(重点)
	-- 工作流程(重点)
2. hive的安装
	-- 内嵌模式: derby,只支持单session
	-- 本地模式: hive客户端指令会内置开启metastore服务项,自己连接自己,与mysql在哪一台机器上无关。
	-- 远程模式: hive的服务项(hiveserver2或metastore)是单独开启的,然后供客户端指令去连接。
	   重点理解本地模式和远程模式, 实际生产环境中本地和远程用的一样多。
3. hive的库和表操作
	-- 本地上,库和表都是hdfs上的一个目录
4. hive的表类型
    -- 内部表
    -- 外部表
5. hive的基本查询子句
	-- left semi join(与exists的原理相同)
	-- map-side-join
6. 函数
	-- 日期函数
	-- 字符串函数
	-- 数学函数
	-- 开窗函数(重点)
		--1) 排名函数
		--2) 聚合函数
		--3) 序列函数
	-- 自定义函数
7. serde
8. 分区与分桶(重点)

二、Hbase的讲解

1、Hbase的简介

1. hadoop base 缩写成Hbase
   -- 开源的,基于hdfs的分布式的,可扩展的,面向列式存储,非关系型(nosql->not only sql)的数据库
   -- 数据可以有多个版本(历史版本)
   -- 提供了高可靠性
   -- 本身是基于内存的(高性能,近似实时的访问)
   -- 起源于google的《bigtable》论文
2. 与hive的区别
	-- hive是用于OLAP,提供类sql语言的分析与计算的框架,底层就是MR。
	-- hbase是用于存储的,设计目录是想存储数十亿行X数百万列的大数据集

2、Hbase的表模型

2.1 关系型数据库的表模型(扩展)

关系型数据库的表模型:面向行式存储。在定义表结构时,需要提前定义好列名,列类型,列数目

hive的架构组成 hive主要由哪三个模块组成_hive的架构组成

缺点:

1. 一旦数据表中存储数据后,修改表结构变得特别困难。
2. 如果我们想扩展字段时,会对表结构产生影响。
3. 即使某一行中的某个字段没有赋值,也要使用null填充
4. 一旦涉及到多张表,因为数据表存在着复杂的关系,管理非常不方便。	
5. 一旦面对海量数据的处理时,读写性能特别差,尤其在高并发这一块。

2.2 Hbase的表模型

1)Cell

hbase是面向列式存储的表模型,列指的是KV对,这个key就是column,v就是column对应的值。KV对被称之单元格,也就是cell。单元格有属于自己的版本号,其实就是一个时间戳。

2)rowkey

为了表示某些单元格是同一个事物的,所以引入了rowkey的概念。因此rowkey是不可以重复的,否则会出现覆盖情况。

3)column family(列族)

为了更好的方便管理单元格,以及有相同意义的单元格尽可能的汇聚到一起,所以引入了列族的概念。

4)region

region是hbase的物理存储模型,是整张表(数据量比较小的时候),或者是表的一部分(数据量比较大时,有多个region)

5)排序机制

由于hbase是优先基于内存存储的,因此内存中的数据进行排序,排序规则是字典排序(ascii升序)
排序方式:
-- 先按照rowkey进行排序
-- 然后按照列族进行排序
-- 再按照key进行排序
-- 如果是多个版本,会按照时间戳进行降序排序

6)数据类型

hbase是不支持其他类型的维护的,底层就是byte[]类型

3、Hbase的体系结构

hive的架构组成 hive主要由哪三个模块组成_zookeeper_02


注意:应该是每一个 RegionServer 就只有一个 HLog,而不是一个 Region 有一个 HLog。

从HBase的架构图上可以看出,HBase中的组件包括Client、Zookeeper、HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等,接下来介绍他们的作用。

1、Client
1、HBase 有两张特殊表:

.META.:记录了用户所有表拆分出来的的 Region 映射信息,.META.可以有多个 Regoin

-ROOT-:记录了.META.表的 Region 信息,-ROOT-只有一个 Region,无论如何不会分裂

2、Client 访问用户数据前需要首先访问 ZooKeeper,找到-ROOT-表的 Region 所在的位置,然 后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过 client 端会做 cache 缓存。

2、ZooKeeper
1、ZooKeeper 为 HBase 提供 Failover 机制,选举 Master,避免单点 Master 单点故障问题

2、存储所有 Region 的寻址入口:-ROOT-表在哪台服务器上。-ROOT-这张表的位置信息

3、实时监控 RegionServer 的状态,将 RegionServer 的上线和下线信息实时通知给 Master

4、存储 HBase 的 Schema,包括有哪些 Table,每个 Table 有哪些 Column Family

3、Master
1、为 RegionServer 分配 Region

2、负责 RegionServer 的负载均衡

3、发现失效的 RegionServer 并重新分配其上的 Region

4、HDFS 上的垃圾文件(HBase)回收

5、处理 Schema 更新请求(表的创建,删除,修改,列簇的增加等等)

4、RegionServer
1、RegionServer 维护 Master 分配给它的 Region,处理对这些 Region 的 IO 请求

2、RegionServer 负责 Split 在运行过程中变得过大的 Region,负责 Compact 操作

可以看到,client 访问 HBase 上数据的过程并不需要 master 参与(寻址访问 zookeeper 和 RegioneServer,数据读写访问 RegioneServer),Master 仅仅维护者 Table 和 Region 的元数据信息,负载很低。

.META. 存的是所有的 Region 的位置信息,那么 RegioneServer 当中 Region 在进行分裂之后 的新产生的 Region,是由 Master 来决定发到哪个 RegioneServer,这就意味着,只有 Master 知道 new Region 的位置信息,所以,由 Master 来管理.META.这个表当中的数据的 CRUD

所以结合以上两点表明,在没有 Region 分裂的情况,Master 宕机一段时间是可以忍受的。

5、HRegion
table在行的方向上分隔为多个Region。Region是HBase中分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。
Region按大小分隔,每个表一般是只有一个region。随着数据不断插入表,region不断增大,当region的某个列族达到一个阈值时就会分成两个新的region。
每个region由以下信息标识:< 表名,startRowkey,创建时间>
由目录表(-ROOT-和.META.)记录该region的endRowkey
6、Store
每一个region由一个或多个store组成,至少是一个store,hbase会把一起访问的数据放在一个store里面,即为每个 ColumnFamily建一个store,如果有几个ColumnFamily,也就有几个Store。一个Store由一个memStore和0或者 多个StoreFile组成。 HBase以store的大小来判断是否需要切分region
7、MemStore
memStore 是放在内存里的。保存修改的数据即keyValues。当memStore的大小达到一个阀值(默认128MB)时,memStore会被flush到文 件,即生成一个快照。目前hbase 会有一个线程来负责memStore的flush操作。

8、StoreFile
memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile。

9、HFile
HBase中KeyValue数据的存储格式,HFile是Hadoop的 二进制格式文件,实际上StoreFile就是对Hfile做了轻量级包装,即StoreFile底层就是HFile。

10、HLog
HLog(WAL log):WAL意为write ahead log,用来做灾难恢复使用,HLog记录数据的所有变更,一旦region server 宕机,就可以从log中进行恢复。
HLog文件就是一个普通的Hadoop Sequence File, Sequence File的value是key时HLogKey对象,其中记录了写入数据的归属信息,除了table和region名字外,还同时包括sequence number和timestamp,timestamp是写入时间,sequence number的起始值为0,或者是最近一次存入文件系统中的sequence number。 Sequence File的value是HBase的KeyValue对象,即对应HFile中的KeyValue。

4、Hbase的安装

4.1 单机模式

步骤1)上传并解压,更名

[root@qianfeng01 ~]# tar -zxvf hbase-1.2.1-bin.tar.gz -C /usr/local/
[root@qianfeng01 ~]# cd /usr/local/
[root@qianfeng01 local]# mv hbase-1.2.1/ hbase

步骤2)配置环境变量并重新引导

[root@qianfeng01 local]# vim /etc/profile
.........省略........
# hbase environment
export HBASE_HOME=/usr/local/hbase
export PATH=$HBASE_HOME/bin:$PATH

[root@qianfeng01 local]# source /etc/profile

步骤3)修改hbase的环境脚本(hbase-env.sh)

[hadoop@qianfeng01 local]$ vim $HBASE_HOME/conf/hbase-env.sh
#找到下面内容,解开注释,添加具体路径
# The java implementation to use.  Java 1.7+ required.
export JAVA_HOME=/usr/local/jdk

# Tell HBase whether it should manage it's own instance of Zookeeper or not.
# hbase内置zookeeper开启
export HBASE_MANAGES_ZK=true

步骤4)修改hbase的site.xml(自定义配置文件)

<configuration>
    <!-- 属性hbase.rootdir用于指定hbase产生的数据的存储位置 -->
    <property>
        <name>hbase.rootdir</name>
        <value>file:///usr/local/hbase/data</value>
    </property>
    <!-- hbase依赖于zookeeper,需要指定内置zookeeper的数据存储位置 -->
    <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/usr/local/hbase/zkdata</value>
    </property>
</configuration>

步骤5)可以开心的玩了

start-hbase.sh
hbase shell
stop-hbase.sh

4.2 伪分布式模式

4.2.1 情况说明

hbase的伪分布式,其实就是指相关的守护进程都有,并且运行在同一个机器上,是独立的进程(每一个守护进程都有自己的JVM)

-- hbase的伪分布式的数据的存储位置,可以是hdfs,也可以是本地文件系统。
-- hbase的伪分布式如果选择hdfs,针对于zookeeper来说,可以选择内置的,也可以我们自行安装的。

 下面的演示是自行安装的zookeeper

步骤1)上传并解压,更名

[root@qianfeng01 ~]# tar -zxvf hbase-1.2.1-bin.tar.gz -C /usr/local/
[root@qianfeng01 ~]# cd /usr/local/
[root@qianfeng01 local]# mv hbase-1.2.1/ hbase

步骤2)配置环境变量并重新引导

[root@qianfeng01 local]# vim /etc/profile
.........省略........
# hbase environment
export HBASE_HOME=/usr/local/hbase
export PATH=$HBASE_HOME/bin:$PATH

[root@qianfeng01 local]# source /etc/profile

步骤3)修改hbase的环境脚本(hbase-env.sh)

[hadoop@qianfeng01 local]$ vim $HBASE_HOME/conf/hbase-env.sh
#找到下面内容,解开注释,添加具体路径
# The java implementation to use.  Java 1.7+ required.
export JAVA_HOME=/usr/local/jdk

# Tell HBase whether it should manage it's own instance of Zookeeper or not.
# 由于要使用我们自行安装的zookeeper,所以要把内置的关闭掉
export HBASE_MANAGES_ZK=false

步骤4)修改hbase的site.xml(自定义配置文件)

<configuration>
    <!-- 属性hbase.rootdir用于指定hbase产生的数据的存储位置 -->
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://qianfeng01/hbase</value>
    </property>
    <!-- 开启用hbase集群模式 -->
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <!-- 指定hbase使用的zookeeper集群 -->
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>qianfeng01:2181,qianfeng02:2181,qianfeng03:2181</value>
    </property>
    <!--将属性hbase.unsafe.stream.capability.enforce 改为true -->
    <property>
        <name>hbase.unsafe.stream.capability.enforce</name>
        <value>true</value>
    </property>
</configuration>

步骤5)可以开心的玩了

由于使用自行安装的zookeeper,所以再启动hbase服务进程时,应该提前开启zookeeper集群

zkServer.sh start    <---三台一起开
start-hbase.sh
hbase shell
stop-hbase.sh

4.3 完全分布式模式

4.3.1 情况说明和布局安排

4.3.2 安装步骤

步骤1)上传并解压,更名

[root@qianfeng01 ~]# tar -zxvf hbase-1.2.1-bin.tar.gz -C /usr/local/
[root@qianfeng01 ~]# cd /usr/local/
[root@qianfeng01 local]# mv hbase-1.2.1/ hbase

步骤2)配置环境变量并重新引导

[root@qianfeng01 local]# vim /etc/profile
.........省略........
# hbase environment
export HBASE_HOME=/usr/local/hbase
export PATH=$HBASE_HOME/bin:$PATH

[root@qianfeng01 local]# source /etc/profile

步骤3)修改hbase的环境脚本(hbase-env.sh)

[hadoop@qianfeng01 local]$ vim $HBASE_HOME/conf/hbase-env.sh
#找到下面内容,解开注释,添加具体路径
# The java implementation to use.  Java 1.7+ required.
export JAVA_HOME=/usr/local/jdk

# Tell HBase whether it should manage it's own instance of Zookeeper or not.
# 由于要使用我们自行安装的zookeeper,所以要把内置的关闭掉
export HBASE_MANAGES_ZK=false

步骤4)修改hbase的site.xml(自定义配置文件)

<configuration>
    <!-- 属性hbase.rootdir用于指定hbase产生的数据的存储位置 -->
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://qianfeng01/hbase</value>
    </property>
    <!-- 开启用hbase集群模式 -->
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <!-- 指定hbase使用的zookeeper集群 -->
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>qianfeng01:2181,qianfeng02:2181,qianfeng03:2181</value>
    </property>
    <!--将属性hbase.unsafe.stream.capability.enforce 改为true -->
    <property>
        <name>hbase.unsafe.stream.capability.enforce</name>
        <value>true</value>
    </property>
</configuration>

步骤5)三台机器的免密登录认证要做好

步骤6)三台机器的时间一定要同步,不能超过30秒

步骤7)配置regionserver的布局

[root@qianfeng01 hbase]# vim conf/regionservers

qianfeng01
qianfeng02
qianfeng03

步骤8) 配置备份的hmaster

[root@qianfeng01 hbase]#  echo "qianfeng02" > ./conf/backup-masters

步骤9)将hadoop的core-site.xml和hdfs-site.xml拷贝到hbase的conf目录下

[root@qianfeng01 hbase]# cp ${HADOOP_HOME}/etc/hadoop/{core-site.xml,hdfs-site.xml} ./conf/

步骤10)分发到其他两台机器上

[root@qianfeng01 local]# scp -r hbase qianfeng02:/usr/local/
[root@qianfeng01 local]# scp -r hbase qianfeng03:/usr/local/

[root@qianfeng01 local]# scp /etc/profile qianfeng02:/etc/
[root@qianfeng01 local]# scp /etc/profile qianfeng03:/etc/

最好去另外两台机器上,重新加载一下环境变量的文件

步骤11)启动hbase

hdfs和zookeeper一定要先启动,
然后再启动hbase的服务进程

启动后,要去webui界面查看一下,ip:16010

如果启动失败,应该去相关进程所在的机器上的hbase的家里的logs目录下查看响应的日志文件