1 Hadoop是什么
1.hadoop是一个由Apache基金会所开发的分布式系统基础架构。
2.主要解决,海量数据的储存和海量数据的分析计算问题。
3.广义来说,hadoop通常是指一个更广泛的概念----Hadoop生态圈。
Hadoop三大发行版本
Hadoop三大发行版本:Apache、Cloudera、Hortonworks。
Apache版本最原始(最基础)的版本,对于入门学习最好。
Cloudera在大型互联网企业中用的较多。
Hortonworks文档较好。
Hadoop的优势(4高)
1.高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
2.高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。
3.高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
4.高容错性:能够自动将失败的任务重新分配。
HDFS的局限
HDFS的上述种种特点非常适合于大数据量的批处理,但是对于一些特点问题不但没有优势,而且有一定的局限性,主要表现以下几个方面:
1、不适合低延迟数据访问
如果要处理一些用户要求时间比较短的低延迟应用请求(比如毫秒级、秒级的响应时间),则HDFS不适合。HDFS是为了处理大型数据集而设计的,主要是为了达到高的数据吞吐量而设计的,
延迟时间通常是在分钟乃至小时级别。
对于那些有低延迟要求的应用程序,HBase是一个更好的选择,尤其是对于海量数据集进行访问要求毫秒级响应的情况,单HBase的设计是对单行或少量数据集的访问,对HBase的访问必须提供主键或主键范围。
2、无法高效存储大量小文件
3、不支持多用户写入和随机文件修改
在HDFS的一个文件中只有一个写入者,而且写操作只能在文件末尾完成,即只能执行追加操作。
HDFS架构概述
1.NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生存时间,副本数,文件权限),以及每个文件的快列表和块所在的DataNode等。
2.DataNode(dn):在本地文件系统储存文件块数据,以及块数据的校检和。
3.Secondary NameNode(2nn):用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
HDFS是分布式文件系统,有高容错性的特点,可以部署在价格低廉的服务器上,主要包含namenode和datanode。
Namenode是hdfs中文件目录和文件分配管理者,它保存着文件名和数据块的映射管理,数据块和datanode列表的映射关系。其中文件名和数据块的关系保存在磁盘上,但是namenode上不保存数据块和datanode列表的关系,该列表是通过datanode上报建立起来的。
Namenode上的有三种交互,1、client访问namenode获取的相关datanode的信息。2、datanode心跳汇报当前block的情况。3、secondarynamenode做checkpoint交互。
DataNode它负责实际的数据存储,并将数据息定期汇报给NameNode。DataNode以固定大小的block为基本单位组织文件内容,默认情况下block大小为128MB。当用户上传一个大的文件到HDFS上时,该文件会被切分成若干个block,分别存储到不同的DataNode;同时,为了保证数据可靠,会将同一个block以流水线方式写到若干个(默认是3,该参数可配置)不同的DataNode上。这种文件切割后存储的过程是对用户透明的。
SecondaryNameNode,用来辅助namenode进行元数据的合并,并且传回到namenode。
YARN架构概述
YARN主要包括几种角色
1.ResourceManager(RM):主要接收客户端任务请求,接收和监控NodeManager(NM)的资源情况汇报,负责资源的分配与调度,启动和监控ApplicationMaster(AM),一个集群只有一个。
2.NodeManager:主要是节点上的资源管理,启动Container运行task计算,上报资源、container情况给RM和任务处理情况给AM,整个集群有多个。
3.ApplicationMaster:主要是单个Application(Job)的task管理和调度,向RM进行资源的申请,向NM发出launch Container指令,接收NM的task处理状态信息。每个应用有一个。
4.Container:是YARN中资源的抽象,它封装了某个节点上一定量的资源(CPU和内存两类资源)。
MapReduce架构概述
MapReduce将计算过程分为两个阶段:Map和Reduce
1)Map阶段并行处理输入数据
2)Reduce阶段对Map结果进行汇总
MapReduce是hadoop的一种离线计算框架,适合离线批处理,具有很好的容错性和扩展性,适合简单的批处理任务。缺点启动开销大,任务多使用磁盘效率比较低。
一个MapReduce作业通常会把输入的数据集切分为若干独立的数据块,由map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序,然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。整个框架负责任务的调度和监控,以及重新执行已经失败的任务。通常,MapReduce框架和分布式文件系统是运行在一组相同的节点上的,计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。
一个MapReduce任务包含一般会这几个部分:Map、Shuffle(Sort、Partitioner、Combiner、Merge、Sort)、Reduce。
Hadoop运行环境搭建
虚拟机环境准备
1. 克隆虚拟机
2. 修改克隆虚拟机的静态IP
3. 修改主机名
4. 关闭防火墙
5. 创建jinghang用户
6. 配置jinghang用户具有root权限(详见《大数据技术之Linux》)
7.在/opt目录下创建文件夹
(1)在/opt目录下创建module、software文件夹
[jinghang@hadoop101 opt]$ sudo mkdir module
[jinghang@hadoop101 opt]$ sudo mkdir software
(2)修改module、software文件夹的所有者cd
[jinghang@hadoop101 opt]$ sudo chown jinghang:jinghang module/ software/
[jinghang@hadoop101 opt]$ ll
总用量 8
drwxr-xr-x. 2 jinghang jinghang 4096 1月 17 14:37 module
drwxr-xr-x. 2 jinghang jinghang 4096 1月 17 14:38 software
Hadoop运行模式
Hadoop运行模式包括:本地模式、伪模式以及完全分布式模式。
编写集群分发脚本xsync
1. scp(secure copy)安全拷贝
(1)scp定义:
scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
(2)基本语法
scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
2. rsync 远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)基本语法
rsync -av $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项参数说明
表2-2
选项 |
功能 |
-a |
归档拷贝 |
-v |
显示复制过程 |
3. xsync集群分发脚本
(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析:
(a)rsync命令原始拷贝:
rsync -av /opt/module root@hadoop103:/opt/
(b)期望脚本:
xsync要同步的文件名称
(c)说明:在/home/jinghang/bin这个目录下存放的脚本,jinghang用户可以在系统任何地方直接执行。
(3)脚本实现
集群配置
集群部署规划
表2-3
|
hadoop102 |
hadoop103 |
hadoop104 |
HDFS
|
NameNode DataNode |
DataNode |
SecondaryNameNode DataNode |
YARN |
NodeManager |
ResourceManager NodeManager |
NodeManager |
2. 配置集群
(1)核心配置文件
配置core-site.xml
[jinghang@hadoop102 hadoop]$ vi core-site.xml
在该文件中编写如下配置
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
(2)HDFS配置文件
配置hadoop-env.sh
[jinghang@hadoop102 hadoop]$ vi hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置hdfs-site.xml
[jinghang@hadoop102 hadoop]$ vi hdfs-site.xml
在该文件中编写如下配置
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
(3)YARN配置文件
配置yarn-env.sh
[jinghang@hadoop102 hadoop]$ vi yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置yarn-site.xml
[jinghang@hadoop102 hadoop]$ vi yarn-site.xml
在该文件中增加如下配置
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
(4)MapReduce配置文件
配置mapred-env.sh
[jinghang@hadoop102 hadoop]$ vi mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置mapred-site.xml
[jinghang@hadoop102 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[jinghang@hadoop102 hadoop]$ vi mapred-site.xml
在该文件中增加如下配置
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
3.在集群上分发配置好的Hadoop配置文件
[jinghang@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/
4.查看文件分发情况
[jinghang@hadoop103 hadoop]$ cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
集群单点启动
启动集群(再集群的各台服务器上启动对应的服务进程)
6.1 启动集群之前一定要格式化(/opt/module/hadoop-2.7.2)
bin/hdfs namenode -format ( has been successfully formatted)
如果格式化失败了:
1.删除/opt/module/hadoop-2.7.2目录下的data logs
2.bin/hdfs namenode --format
注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。所以,格式NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode。
6.2 启动HDFS服务
6.2.2 启动namenode
sbin/hadoop-daemon.sh start|stop namenode
6.2.3 启动datanode
sbin/hadoop-daemon.sh start|stop datanode
检查namenode的web页面是否可以访问
http://192.168.232.201:50070
启动YARN服务
6.3.1 启动resourcemanager
sbin/yarn-daemon.sh start|stop resourcemanager
6.3.2 启动nodemanager
sbin/yarn-daemon.sh start|stop nodemanager
检查yarn的web页面:http://192.168.232.201:8088
6.4 开启历史服务
sbin/mr-jobhistory-daemon.sh start|stop historyserver
SSH无密登录配置配置SSH免密登录,实现群停,群起服务
2.实现了集群的群停和群起
2.1 群起群停HDFS服务进程(再namenode所在的服务器上)
2.11 配置etc/hadoop/slaves (相对于hadoop-2.7.2)
2.12 群起的命令:start-dfs.sh
2.13 群停的命令:stop-dfs.sh
2.2 群起群停YARN服务进程(再resourcemanager所在的服务器上)
2.21 配置etc/hadoop/slaves (相对于hadoop-2.7.2)
2.22 群起的命令:start-yarn.sh
2.23 群停的命令:stop-yarn.sh
2.3 stop-all.sh | start-all.sh
MapReduce概述
1 MapReduce定义
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架。
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。
MapReduce优缺点
1,优点
1、MapReduce易于理解:简单地实现一些接口,就可以完成一个分布式程序,而且这个分布式程序还可以分布到大量廉价的PC机器运行。也就是说,写一个分布式程序,跟写一个简单的串行程序是一模一样的。MapReduce
2.良好的扩展性
当计算机资源不能得到满足的时候,可以通过简单的增加机器来扩展它的计算能力。多项研究发现,基于MapReduce的计算性可以随节点数目增长保持近似于线性的增长,这个特点是MapReduce处理海量数据的关键,通过将计算节点增至几百或者几千可以很容易地处理数百TB甚至PB级别的离线数据。
3、高容错性
MapReduce设计的初衷就是使程序能部署在廉价的PC机器上,这就要求它具有很高的容错性。比如,其中一台机器宕机了,它可以把上面的计算任务转移到另一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,完全是由Hadoop内部完成的。
缺点
MapReduce的局限
MapReduce虽然有很多的优势,但是也有它不擅长的。这里的“不擅长”,不代表不能做,而是在有些场景下实现的效果差,并不适合用MapReduce来处理,主要表现在以下结果方面:
1、实时计算:MapReduce无法像Oracle或MySQL那样在毫米或秒级内返回结果,如果需要大数据量的毫秒级响应,可以考虑使用HBase.
2、流计算:流计算的输入数据是动态的,而MapReduce的输入数据是静态的,不能动态变化,这是因为MapReduce自身的设计特点决定了数据源必须是静态的。如果需要处理流式数据可以用Storm,Spark Steaming、Flink 等流计算框架。
3、DGA(有向图)计算:多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入磁盘,会造成大量的词频IO导致性能非常低下,此时可以考虑用Spark等迭代计算框架。
MapReduce进程
一个完整的MapReduce程序在分布式运行时有三类实例进程:
1.MrAppMaster:负责整个程序的过程调度及状态协调。
2.MapTask:负责Map阶段的整个数据处理流程。
3.ReduceTask:负责Reduce阶段的整个数据处理流程。
HDFS和MapReduce基本架构
HDFS和MapReduce是Hadoop的两大核心,它们分工也非常明确,HDFS负责分布式存储,而MapReduce负责分布式计算。
1、HDFS采用了主从(Master/Slave)的结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的,其中NameNode作为主服务器,管理文件系统的命名空间(即文件有几块,分别存储在哪个节点上等)和客户端对文件的访问操作;
2、集群中DataNode管理存储的数据。HDFS允许用户以文件的形式存储数据。从内部来看,文件被分成若干数据块,而且这若干个数据块存放在一组DataNode上。
3、NameNode执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录等。它也负责数据块到具体DataNode的映射。
4、DataNode负责处理文件系统客户端的文件读写请求,并在NameNode的统一调度下进行数据块的创建、删除和复制工作。
MapReduce也是采用Master/Slave的主从架构,MapReduce包含4个组成部分,分别为Client、JobTracker、TaskTracker和Task

1、Client
每个Job都会在用户端通过Client类将应用程序以及配置参数Configuration打包成JAR文件存储在HDFS中,并把路径提交到JobTracker的Master服务,然后由Master创建每一个Task(即Map Task和 Reduce Task)将它们分发到各个TaskTracker服务中去执行。
2、JobTracker
JobTracker负责资源监控和作业调度。JobTracker负责监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其它节点;同时,JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而任务调度器会在资源出现空闲时,选择合适的任务使用这些资源。在Hadoop中,任务调度器是一个可插拔的模块,用户可以根据自己的需求设计相应的调度器。
3、TaskTracker
TaskTracker会周期性地通过Heartheat将本节点上的资源使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。TaskTracker使用“slot”来衡量划分本节点上资源量。"slot"代表单位的计算资源(CPU、内存能),一个Task获取到一个slot后才有机会运行,而Hadoop调度器的作用就是讲各个TaskTracker上空闲的slot分配给Task使用。slot分为Map slot和Reduce slot两种,分别供Map Task和Reduce Task使用。TaskTracker通过slot的数目(可配置参数)限定Task的并发度。
4、Task
Task分为Map Task和Reduce Task两种,均有TaskTracker启动。HDFS以固定大小的block为基本单位存储数据,而对于MapReduce而言,其处理单位是split。
从上面的描述可以看出,HFDS和MapReduce共同组成了HDFS体系结构的核心,HDFS在集群上实现了分布式文件系统,MapReduce则在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了对文件操作和存储等的支持。而MapReduce在HDFS的基础上实现任务的分发、跟踪和执行等工作,并收集结果,两种相互作用,完成了Hadoop分布式集群的主要任务。
Hadoop序列化
2.MapTask并行度决定机制
数据块:Block是HDFS物理上把数据分成一块一块。
数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。
CombineTextInputFormat切片机制
框架默认的TextInputFormat切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个MapTask,这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下。
高可用、、、、、、、、、、、、
第一部分环境准备
zookeeper分布式环境需要有,没有提前配置
见hdfs课件:8.3.3 配置Zookeeper集群
1.在/opt/module/下创建文件夹hadoop_ha
2.在/opt/module/目录下执行如下命令拷贝原有得非高可用得hadoop-2.7.2文件夹
cp -r hadoop-2.7.2 /opt/module/hadoop_ha
********第二部分,修改配置文件
3.配置core-site.xml
<configuration>
<!-- 把两个NameNode)的地址组装成一个集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop_ha/hadoop-2.7.2/data/tmp</value>
</property>
<!-- 自动故障转移时添加 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>主机名1:2181,主机名1:2181,主机名1:2181</value>
</property>
</configuration>
4.配置hdfs-site.xml
<configuration>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>主机名:9000</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>主机名:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>主机名:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>主机名:50070</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://主机名:8485;主机名:8485;主机名:8485/mycluster</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/jinghang/.ssh/id_rsa</value>
</property>
<!-- 声明journalnode服务器存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/hadoop_ha/hadoop-2.7.2/data/jn</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 自动故障转移时添加-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
4.配置YARN得高可用配置yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--启用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--声明两台resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<!--给两台resourcemanager的起名,别名-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!--resourcemanager关联到对于的服务器-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>主机名</value>
</property>
<!--resourcemanager关联到对于的服务器-->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>主机名</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>主机名:2181,主机名:2181,主机名:2181</value>
</property>
<!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的状态信息存储在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
将配置好的内容分发在其他服务器上
********第三部分启动
启动Zookeeper
(2)启动Zookeeper集群:
bin/zkServer.sh start
(3)初始化HA在Zookeeper中状态:
bin/hdfs zkfc -formatZK
启动hdfs
(1)首次需要在各个节点上,输入以下命令启动journalnode服务:
sbin/hadoop-daemon.sh start journalnode
(2)在[nn1]上,对其进行格式化,并启动:
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
(3)在[nn2]上,同步nn1的元数据信息:
bin/hdfs namenode -bootstrapStandby
(4)启动[nn2]:
sbin/hadoop-daemon.sh start namenode
(5)在[nn1]上启动所有节点
sbin/start-dfs.sh
启动yarn
(1)在rm1上执行
sbin/start-yarn.sh
(2)确保两个resourcemanager都启动了,如果没有启动手动开启rm2的resourcemanager:
sbin/yarn-daemon.sh start resourcemanager
//在浏览器中查看节点
访问 http://xxxx:50070/
两个namenode一个处于active状态,一个处于standby状态(只保证有一个namenode存活)
bin/hdfs haadmin -getServiceState nn1
bin/hdfs haadmin -getServiceState nn2
访问http://xxxx:8088/
两个resourcemanager访问后地址会重定向到一个地址里面(只保证有一个resourcemanager存活)
bin/yarn rmadmin -getServiceState rm1
bin/yarn rmadmin -getServiceState rm2