Hadoop集群部署文档
1、hadoop概述
Hadoop 是 Lucene 创始人 Doug Cutting,根据 Google 的相关内容山寨出来的分布式文件系统和对海量数据进行分析计算的基础框架系统,其中包含 MapReduce 程序,hdfs 系统等(它受到最先由 Google Lab 开发的 Map/Reduce和 Google File System(GFS) 的启发)。
Hadoop实现了一个分布式文件系统(HadoopDistributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop框架最核心的设计就是:HDFS和MapReduce,HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
2、hadoop集群优点
2.1、分布式处理软件框架
Hadoop是一个能够对大量数据进行分布式处理的软件框架,是以一种可靠、高效、可伸缩的方式进行数据处理。
2.1.1、Hadoop 是可靠的
因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。
2.1.2、Hadoop 是高效的
因为它以并行的方式工作,通过并行处理加快处理速度。
2.1.3、Hadoop 是可伸缩的
能够处理 PB 级数据。(1PB=1024TB)
2.2、分布式计算平台
Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。它主要有以下几个优点:
2.2.1、高可靠性
Hadoop按位存储和处理数据的能力值得人们信赖。
2.2.2、高扩展性
Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
2.2.3、高效性
Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
2.2.4、高容错性
Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
2.2.5、低成本
与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低。
Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop上的应用程序也可以使用其他语言编写,比如 C++等。
3、hadoop相关概念
3.1、分布式存储
如上图:这就是分布式文件系统。
3.2、命名空间
Namespace:在分布式存储系统中,分散在不同节点中的数据可能属于同一个文件,为了组织众多的文件,把文件可以放到不同的文件夹中,文件夹可以一级一级的包含。我们把这种组织形式称为命名空间Namespace;命名空间管理着整个服务器集群中的所有文件,命名空间的职责与存储真实数据的职责是不一样的,负责命名空间职责的节点称为主节点master node,负责存储真实数据职责的节点称为从节点slave node。
3.3、主、从节点
主节点负责管理文件系统的文件结构,从节点负责存储真实的数据,合称为主从式结构master-slaves,用户操作时,也应该先和主节点打交道,查询数据在哪些从节点上存储,然后再从从节点读取。在主节点上,为了加快用户访问的速度,会把整个命名空间信息都放在内存中,当存储的文件越多时,那么主节点就需要越多的内存空间。
3.4、块(block)
在从节点存储数据时,有的原始数据文件可能很大,有的可能很小,大小不一的文件不容易管理,那么可以抽象出一个独立的存储文件单位,称为块(block)。
3.5、容灾
数据存放在集群中,可能因为网络原因或者服务器硬件原因造成访问失败,最好采用副本(replication)机制,把数据同时备份到多台服务器中,这样数据就安全了,数据丢失或者访问失败的概率就小了。
4、分布式存储工作原理和流程图
4.1、工作原理和流程图
在以上的主从式结构中,由于主节点含有整个文件系统的目录结构信息,非常重要。另外,由于主节点运行时会把命名空间信息都放到内存中,因此存储的文件越多,主节点的内存就需要的越多,所以需要大内存。
在 hadoop 中,分布式存储系统称为 HDFS(hadoopdistributed file system)。其中,主节点称为名字节点(namenode),从节点称为数据节点(datanode)。
整个流程大致如下:
1:首先,客户端请求查看数据,请求先访问namenode
2:namenode根据客户端的需求,告诉客户端数据存储在那些datanode上
3:客户端直接和从节点联系,获取数据
4.2、分布式计算
在 hadoop 中,分布式计算部分称为MapReduce
MapReduce 是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",和它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。
4.3、分布式计算角色
主节点称为作业节点(jobtracker)
从节点称为任务节点(tasktracker)
在任务节点中,运行第一阶段的代码称为 map 任务(map task),运行第二阶段的代码称为 reduce任务(reduce task)。
4.4、名词解释
(1)Hadoop:Apache 开源的分布式框架。
(2)HDFS:Hadoop 的分布式文件系统。
(3)NameNode:Hadoop HDFS 元数据主节点服务器,负责保存 DataNode 文件存储元数据信息,这个服务器是单点的。
(4)JobTracker:Hadoop 的 Map/Reduce 调度器,负责与TaskTracker 通信分配计算任务并跟踪任务迚度,这个服务器也是单点的。
(5)DataNode:Hadoop 数据节点,负责存储数据。
(6)TaskTracker:Hadoop 调度程序,负责 Map,Reduce 任务的启动和执行。
注:Namenode 记录着每个文件中各个块(block)所在的数据节点的位置信息。
5、安装部署Hadoop集群
此次搭建使用最小稳定版本hadoop-2.7.3.tar.gz,JDK版本:jdk-8u111-linux-x64.rpm
5.1、网络拓扑图
5.2、环境角色清单
操作系统 | 主机名 | IP地址 | 角色 |
Centos6.8 | hadoop-master | 192.168.13.131 | JDK、hadoop、NN、zkfc、RM |
Centos6.8 | hadoop-master | 192.168.13.135 | JDK、hadoop、NN、zkfc、RM |
Centos6.8 | hadoop-slave1 | 192.168.13.132 | JDK、hadoop、zookeeper、DN、NM、JN |
Centos6.8 | hadoop-slave2 | 192.168.13.133 | JDK、hadoop、zookeeper、DN、NM、JN |
Centos6.8 | hadoop-slave3 | 192.168.13.134 | JDK、hadoop、zookeeper、DN、NM、JN |
角色说明:
NN:namenode //元数据主节点
DN:datanode //数据节点
Zkfc:DFSZKFailoverController //DFS故障转移控制器
RM:ResourceManager //资源管理程序,负责集群中所有资源的统一管理和分配
NM:NodeManager //数据节点
JN:JournalNode // HA的两个namenode之间保持editlog的共享同步
5.3、环境准备
5.3.1、配置hosts
[root@hadoop-master ~]#vim /etc/hosts //追加以下五行
192.168.13.131 hadoop-master
192.168.13.135 hadoop-master1
192.168.13.132 hadoop-slave1
192.168.13.133 hadoop-slave2
192.168.13.134 hadoop-slave3
其他四台机器做相同操作
5.3.2、关闭Iptables和selinux
[root@hadoop-master ~]# /etc/init.d/iptablesstop
[root@hadoop-master ~]# chkconfig iptablesoff
[root@hadoop-master ~]# setenforce 0 //临时关闭,永久关闭需要修改/etc/selinux/config
其他四台机器做相同操作
5.3.3、安装JDK
[root@hadoop-master ~]# rpm -ivhjdk-8u111-linux-x64.rpm
Preparing... ###########################################[100%]
1:jdk1.8.0_111 ########################################### [100%]
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
[root@hadoop-master ~]# vim /etc/profile //配置环境变量,在末尾追加以下几行
export JAVA_HOME=/usr/java/jdk1.8.0_111
export PATH=$JAVA_HOME/bin:$PATH
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
[root@hadoop-master ~]# source /etc/profile //使环境变量生效
[root@hadoop-master ~]# java -version //查看java版本,看到以下内容说明java安装成功
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build25.111-b14, mixed mode)
其他四台机器做相同操作
5.3.4、创建运行hadoop的用户
在hadoop-master上创建
[root@hadoop-master ~]# useradd -u 8000hadoop
[root@hadoop-master ~]# echo hadoop:123456 |chpasswd
在hadoop-slave1上创建
[root@hadoop-slave1 ~]# useradd -u 8000hadoop
[root@hadoop-slave1 ~]# echo hadoop:123456 |chpasswd
在hadoop-slave2上创建
[root@hadoop-slave2 ~]# useradd -u 8000hadoop
[root@hadoop-slave2 ~]# echo hadoop:123456 |chpasswd
在hadoop-slave3上创建
[root@hadoop-slave3 ~]# useradd -u 8000hadoop
[root@hadoop-slave3 ~]# echo hadoop:123456 |chpasswd
在hadoop-master1上创建
[root@hadoop-slave3 ~]# useradd -u 8000hadoop
[root@hadoop-slave3 ~]# echo hadoop:123456 |chpasswd
5.3.5、配置免密码登录
配置在hadoop-master上,可以ssh无密码登录机器hadoop-master,hadoop-slave1,hadoop-slave2,hadoop-slave3,hadoop-master1方便后期复制文件和启动服务。因为namenode启动时,会连接到datanode上启动对应的服务。也就是namenode会和datanode上的服务关联(这个启动过程并不是数据传输),所以我们需要免密码登陆。
[hadoop@hadoop-master ~]$ ssh-keygen
[hadoop@hadoop-master ~]$ ssh-copy-idhadoop-slave1
[hadoop@hadoop-master ~]$ ssh-copy-idhadoop-slave2
[hadoop@hadoop-master ~]$ ssh-copy-idhadoop-slave3
[hadoop@hadoop-master ~]$ ssh-copy-idhadoop-master1
[hadoop@hadoop-master ~]$ ssh-copy-idhadoop-master
Ssh-copy-id时需要输入密码。
5.4、安装zookeeper
Zookeeper版本:最新稳定版本zookeeper-3.4.10.tar.gz
解压
[root@hadoop-slave1 ~]# tar xf zookeeper-3.4.10.tar.gz-C /home/hadoop/
修改配置文件
[root@hadoop-slave1 ~]# cd/home/hadoop/zookeeper-3.4.10/conf/
[root@hadoop-slave1 conf]# mv zoo_sample.cfgzoo.cfg
[root@hadoop-slave1 conf]# vim zoo.cfg
修改以下行
dataDir=/home/hadoop/zookeeper-3.4.10/data //需要手动创建
末尾追加以下几行
server.1=hadoop-slave1:2888:3888
server.2=hadoop-slave2:2888:3888
server.3=hadoop-slave3:2888:3888
然后创建data文件夹
[root@hadoop-slave1 zookeeper-3.4.10]# mkdir data
进入此文件夹
[root@hadoop-slave1data]# echo 1 > myid
将配置好zookeeper复制到其他两台机器
[root@hadoop-slave1hadoop]# scp -r zookeeper-3.4.10/ hadoop@192.168.13.133:~
[root@hadoop-slave1hadoop]# scp -r zookeeper-3.4.10/ hadoop@192.168.13.134:~
修改slave2、slave3对应的myid的内容:
Slave2:
[root@hadoop-slave2 data]# echo 2 > myid
Slave3:
[root@hadoop-slave3 data]# echo 3 > myid
到此zookeeper安装完成
5.5、安装NameNode
Hadoop安装目录:/home/hadoop/hadoop-2.7.3,使用 root 账号将 hadoop-2.7.3.tar.gz上传到服务器的/home/hadoop下。
[root@hadoop-master ~]# su - hadoop
[hadoop@hadoop-master ~]$ ll
total 209076
-rw-r--r-- 1 root root 214092195Aug 1 09:57 hadoop-2.7.3.tar.gz
创建所需文件夹
[hadoop@hadoop-master ~]$ mkdir -p/home/hadoop/dfs/name /home/hadoop/dfs/data /home/hadoop/tmp
解压
[hadoop@hadoop-master ~]$ tar xfhadoop-2.7.3.tar.gz
[hadoop@hadoop-master ~]$ ll
total 209088
drwxrwxr-x 4 hadoop hadoop 4096 Aug 1 16:15 dfs
drwxr-xr-x 9 hadoop hadoop 4096 Aug 18 2016 hadoop-2.7.3
-rw-r--r-- 1 root root 214092195 Aug 1 09:57hadoop-2.7.3.tar.gz
drwxrwxr-x 2 hadoop hadoop 4096 Aug 1 16:15 tmp
进入配置文件目录
[hadoop@hadoop-master ~]$ cdhadoop-2.7.3/etc/hadoop/
重点了解下面几个文件:
hadoop-env.sh、yarn-evn.sh、slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
hadoop-env.sh //java环境变量脚本
yarn-env.sh //制定yarn框架的java运行环境,YARN,它将资源管理和处理组件分开。基于 YARN 的架构不受 MapReduce 约束。这里将介绍 YARN,以及它相对于 Hadoop 中以前的分布式处理层的一些优势。
slaves //指定datanode数据存储服务器
core-site.xml //指定访问hadoop web界面的路径
hdfs-site.xml //文件系统的配置文件
mapred-site.xml //mapreducer任务配置文件
yarn-site.xml //该文件为yarn框架的配置,主要是一些任务的启动位置
5.5.1、修改hadoop-env.sh
[hadoop@hadoop-master hadoop]$ vim hadoop-env.sh
改:
export JAVA_HOME=${JAVA_HOME}
为:
export JAVA_HOME= /usr/java/jdk1.8.0_111
5.5.2、修改yarn-env.sh
[hadoop@hadoop-master hadoop]$ vim yarn-env.sh
改:
#export JAVA_HOME=/home/y/libexec/jdk1.6.0/
为:
export JAVA_HOME= /usr/java/jdk1.8.0_111
5.5.3、修改slaves
添加datanode节点
[hadoop@hadoop-master hadoop]$ vim slaves
hadoop-slave1
hadoop-slave2
hadoop-slave3
5.5.4、修改core-site.xml
配置hadoop的核心配置文件
[hadoop@hadoop-master hadoop]$ vimcore-site.xml
这里需要配置的就这两个属性,fs.default.name 配置了 hadoop 的HDFS 系统的命名,位置为mycluster; hadoop.tmp.dir 配置了 hadoop 的 tmp 目彔的根位置。这里使用了一个文件系统中没有的位置,所以要先用 mkdir 命令新建一下。
<configuration>
<!--配置namenode入口-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!--配置zookeeper集群的位置-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop-slave1:2181,hadoop-slave2:2181,hadoop-slave3:2181</value>
</property>
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>60000</value>
</property>
<!-- 故障检查时间 -->
<property>
<name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
<value>60000</value>
</property>
<!-- ipc通讯超时时间 -->
<property>
<name>ipc.client.connect.timeout</name>
<value>20000</value>
</property>
<!--配置hadoop的临时目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
<description>Abase for other temporarydirectories.</description>
</property>
</configuration>
在<configuration></configuration>之间添加上面的内容
[hadoop@hadoop-master hadoop]$ vim hdfs-site.xml
这个是 hdfs 的配置文件,dfs.http.address 配置了 hdfs 的 http 的访问位置; dfs.replication 配置了文件块的副本数,一般不大于从机的个数。
<!--配置命名服务-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--配置所有namenode名字-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!--配置RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop-master:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop-master1:8020</value>
</property>
<!--配置http通信地址-->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop-master:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop-master1:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop-slave1:8485;hadoop-slave2:8485;hadoop-slave3:8485/mycluster</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--配置journalname的工作目录,此目录需要手工创建-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/tmp/journal</value>
</property>
<!--开启自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用隔离机制时需要ssh免密码登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!--指定可以通过web访问hdfs目录-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.image.transfer.bandwidthPerSec</name>
<value>1048576</value>
</property>
<!--指定数据冗余份数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--指定namenode名称空间的存储地址-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/dfs/name</value>
</property>
<!--指定datanode数据存储地址-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/dfs/data</value>
</property>
<!--保证数据恢复 -->
<property>
<name>dfs.journalnode.http-address</name>
<value>0.0.0.0:8480</value>
</property>
<property>
<name>dfs.journalnode.rpc-address</name>
<value>0.0.0.0:8485</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop-slave1:2181,hadoop-slave2:2181,hadoop-slave3:2181</value>
</property>
5.5.5、修改mappred-site.xml
[hadoop@hadoop-master hadoop]$cp mapred-site.xml.template mapred-site.xml
这个是mapreduce任务的配置,由于hadoop2.x使用了yarn框架,所以要实现分布式部署,必须在mapreduce.framework.name属性下配置为yarn,mapred.map.tasks和mapred.reduce.tasks分别为map和reduce的任务数,同时指定:Hadoop的历史服务器historyserver。
Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。默认情况下,Hadoop历史服务器是没有启动的,我们可以通过下面的命令来启动Hadoop历史服务器。
[hadoop@hadoop-master hadoop]$ /home/hadoop/hadoop-2.7.3/sbin/mr-jobhistory-daemon.shstart historyserver
这样我们就可以在相应机器的19888端口上打开历史服务器的WEB UI界面。可以查看已经运行完的作业情况。
[hadoop@hadoop-master hadoop]$ vim mapred-site.xml
<property>
<!-- 指定mr框架为yarn方式 -->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop-master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop-master:19888</value>
</property>
5.5.6、配置yarn-site.xml
[hadoop@hadoop-master hadoop]$ vimyarn-site.xml
该文件为yarn框架的配置,主要是一些任务的启动位置
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>2000</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop-slave1:2181,hadoop-slave2:2181,hadoop-slave3:2181</value>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop-master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop-master1</value>
</property>
<!--在namenode1上配置rm1,在namenode2上配置rm2,注意:一般都喜欢把配置好的文件远程复制到其它机器上,但这个在YARN的另一个机器上一定要修改 -->
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</value>
</property>
<!--开启自动恢复功能 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--配置与zookeeper的连接地址 -->
<property>
<name>yarn.resourcemanager.zk-state-store.address</name>
<value>hadoop-slave1:2181,hadoop-slave2:2181,hadoop-slave3:2181</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop-slave1:2181,hadoop-slave2:2181,hadoop-slave3:2181</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>mycluster-yarn</value>
</property>
<!--schelduler失联等待连接时间-->
<property>
<name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
<value>5000</value>
</property>
<!--配置rm1 -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop-master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop-master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop-master:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>hadoop-master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>hadoop-master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.ha.admin.address.rm1</name>
<value>hadoop-master:23142</value>
</property>
<!--配置rm2 -->
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop-master1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop-master1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop-master1:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>hadoop-master1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>hadoop-master1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.ha.admin.address.rm2</name>
<value>hadoop-master1:23142</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/home/hadoop/data/yarn/local</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/home/hadoop/log/yarn</value>
</property>
<property>
<name>mapreduce.shuffle.port</name>
<value>23080</value>
</property>
<!--故障处理类 -->
<property>
<name>yarn.client.failover-proxy-provider</name>
<value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.zk-base-path</name>
<value>/yarn-leader-election</value>
</property>
注意:上面的所有内容在<configuration></configuration>之间添加
5.6、安装datanode
[hadoop@hadoop-master ~]$ scp -r hadoop-2.7.3 hadoop@192.168.13.132:~
[hadoop@hadoop-master ~]$ scp -r hadoop-2.7.3hadoop@192.168.13.133:~
[hadoop@hadoop-master ~]$ scp -r hadoop-2.7.3hadoop@192.168.13.134:~
5.7、配置hadoop环境变量
[root@hadoop-master ~]# vim /etc/profile //末尾追加以下几行
export HADOOP_HOME=/home/hadoop/hadoop-2.7.3
exportPATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
exportHADOOP_LOG_DIR=/home/hadoop/hadoop-2.7.3/logs
export YARN_LOG_DIR=$HADOOP_LOG_DIR
[root@hadoop-master ~]# source /etc/profile
其他四台机器也做同样配置
5.8、启动集群
5.8.1、启动zookeeper
由于我们配置了QJM,所以我们需要先启动QJM的服务,启动顺序如下所示:
进入到DN节点(三个节点都需要启动),启动zk的服务:zkServer.shstart
启动之前需要将每台机器的/home/hadoop目录设置用户hadoop权限,否则不能正常启动
chownhadoop.hadoop /home/hadoop/ -R
[root@hadoop-slave1 hadoop]# su - hadoop
[hadoop@hadoop-slave1 ~]$ cd zookeeper-3.4.10/bin/
[hadoop@hadoop-slave1 bin]$ ./zkServer.shstart
ZooKeeper JMX enabled by default
Using config:/home/hadoop/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@hadoop-slave1 bin]$ jps
1685 Jps
1579 QuorumPeerMain
查看zookeeper角色(需要三个节点都起来后查看)
[root@hadoop-slave1 bin]# ./zkServer.shstatus
ZooKeeper JMX enabled by default
Using config:/home/hadoop/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
[root@hadoop-slave2 bin]# ./zkServer.shstatus
ZooKeeper JMX enabled by default
Using config:/home/hadoop/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader
[root@hadoop-slave3 bin]# ./zkServer.shstatus
ZooKeeper JMX enabled by default
Using config:/home/hadoop/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
5.8.2、启动journalnode
在NN节点上(选一台即可,这里我选择的是一台master节点),然后启动journalnode服务,命令如下:hadoop-daemons.sh startjournalnode(在hadoop用户下启动);或者单独进入到每个DN输入启动命令:hadoop-daemon.shstart journalnode。输入jps显示启动进程:JournalNode
[hadoop@hadoop-master ~]$ cdhadoop-2.7.3/sbin/
[hadoop@hadoop-master sbin]$./hadoop-daemons.sh start journalnode
hadoop-slave1: starting journalnode,logging to/home/hadoop/hadoop-2.7.3/logs/hadoop-hadoop-journalnode-hadoop-slave1.out
hadoop-slave3: starting journalnode,logging to /home/hadoop/hadoop-2.7.3/logs/hadoop-hadoop-journalnode-hadoop-slave3.out
hadoop-slave2: starting journalnode,logging to/home/hadoop/hadoop-2.7.3/logs/hadoop-hadoop-journalnode-hadoop-slave2.out
[hadoop@hadoop-slave1 bin]$ jps
1826 Jps
1767 JournalNode
1579 QuorumPeerMain
5.8.3、namenode格式化数据
格式化数据:hadoop namenode 的初始化,只需要第一次的时候初始化,之后就不需要了
[hadoop@hadoop-master ~]$ cdhadoop-2.7.3/bin/
[hadoop@hadoop-master bin]$ ./hdfs namenode-format
17/08/04 10:57:50 INFOnamenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = hadoop-master/192.168.13.131
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.7.3
…………
17/08/04 10:57:53 INFO util.GSet:Computing capacity for map NameNodeRetryCache
17/08/04 10:57:53 INFO util.GSet: VMtype = 64-bit
17/08/04 10:57:53 INFO util.GSet:0.029999999329447746% max memory 889 MB = 273.1 KB
17/08/04 10:57:53 INFO util.GSet:capacity = 2^15 = 32768 entries
17/08/04 10:57:54 INFO namenode.FSImage:Allocated new BlockPoolId: BP-1777517485-192.168.13.131-1501815474547
17/08/04 10:57:54 INFO common.Storage:Storage directory /home/hadoop/dfs/name has been successfully formatted.
17/08/04 10:57:54 INFO namenode.FSImageFormatProtobuf:Saving image file/home/hadoop/dfs/name/current/fsimage.ckpt_0000000000000000000 using nocompression
17/08/04 10:57:55 INFOnamenode.FSImageFormatProtobuf: Image file/home/hadoop/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 353bytes saved in 0 seconds.
17/08/04 10:57:55 INFOnamenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
17/08/04 10:57:55 INFO util.ExitUtil:Exiting with status 0
17/08/04 10:57:55 INFOnamenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode athadoop-master/192.168.13.131
************************************************************/
看到如上信息说明初始化完成。
[hadoop@hadoop-master ~]$ tree/home/hadoop/dfs/ //生成如下内容就OK
/home/hadoop/dfs/
├── data
└── name
└── current
├── fsimage_0000000000000000000
├── fsimage_0000000000000000000.md5
├── seen_txid
└── VERSION
3 directories, 4 files
5.8.4、格式化ZK
命令如下:hdfs zkfc –formatZK
[hadoop@hadoop-master bin]$ ./hdfs zkfc-formatZK
5.8.5、启动hdfs
[hadoop@hadoop-master ~]$ cdhadoop-2.7.3/sbin/
[hadoop@hadoop-master sbin]$ ./start-dfs.sh
Starting namenodes on [hadoop-master]
hadoop-master: starting namenode,logging to /home/hadoop/hadoop-2.7.3/logs/hadoop-hadoop-namenode-hadoop-master.out
hadoop-slave1: starting datanode,logging to/home/hadoop/hadoop-2.7.3/logs/hadoop-hadoop-datanode-hadoop-slave1.out
hadoop-slave2: starting datanode,logging to /home/hadoop/hadoop-2.7.3/logs/hadoop-hadoop-datanode-hadoop-slave2.out
hadoop-slave3: starting datanode,logging to/home/hadoop/hadoop-2.7.3/logs/hadoop-hadoop-datanode-hadoop-slave3.out
Starting secondary namenodes[hadoop-master]
hadoop-master: startingsecondarynamenode, logging to/home/hadoop/hadoop-2.7.3/logs/hadoop-hadoop-secondarynamenode-hadoop-master.out
完成之后,查看进程,此时master有进程:namenode进程
[hadoop@hadoop-master sbin]$ jps
2770 DFSZKFailoverController
2436 NameNode
5240 Jps
5.8.6、启动yarn
启动分布式计算
[hadoop@hadoop-master sbin]$ pwd
/home/hadoop/hadoop-2.7.3/sbin
[hadoop@hadoop-master sbin]$ ./start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to/home/hadoop/hadoop-2.7.3/logs/yarn-hadoop-resourcemanager-hadoop-master.out
hadoop-slave3: starting nodemanager,logging to/home/hadoop/hadoop-2.7.3/logs/yarn-hadoop-nodemanager-hadoop-slave3.out
hadoop-slave1: starting nodemanager,logging to/home/hadoop/hadoop-2.7.3/logs/yarn-hadoop-nodemanager-hadoop-slave1.out
hadoop-slave2: starting nodemanager,logging to/home/hadoop/hadoop-2.7.3/logs/yarn-hadoop-nodemanager-hadoop-slave2.out
查看进程,应该有ResourceManager进程
[hadoop@hadoop-master sbin]$ jps
2770 DFSZKFailoverController
3299 ResourceManager
2436 NameNode
5242 Jps
注:start-dfs.sh 和start-yarn.sh 这两个脚本可用 start-all.sh 代替
[hadoop@hadoop-master ~]$/home/hadoop/hadoop-2.7.3/sbin/start-all.sh //启动
[hadoop@hadoop-master ~]$ /home/hadoop/hadoop-2.7.3/sbin/stop-all.sh //停止
5.8.7、启动jobhistory
启动jobhistory服务,查看mapreduce运行状态
[hadoop@hadoop-master ~]$ /home/hadoop/hadoop-2.7.3/sbin/mr-jobhistory-daemon.shstart historyserver
[hadoop@hadoop-master sbin]$ jps
2770 DFSZKFailoverController
3299 ResourceManager
2436 NameNode
5293 JobHistoryServer
5343 Jps
上面已经启动,这里可以直接通过web页面查看了192.168.13.131:19888
5.8.8、同步Hadoop-master元数据
在hadoop-master1上操作
[root@hadoop-master1 ~]# su - hadoop
[hadoop@hadoop-master1 ~]$ cdhadoop-2.7.3/bin/
[hadoop@hadoop-master1 bin]$ hdfs namenode-bootstrapStandby
启动namenode
[hadoop@hadoop-master1 bin]$ cd ../sbin/
[hadoop@hadoop-master1 sbin]$./hadoop-daemon.sh start namenode
验证
[hadoop@hadoop-master1 sbin]$ jps
2049 DFSZKFailoverController
7862 Jps
2333 NameNode
启动ResourceManager
[hadoop@hadoop-master1 hadoop-2.7.3]$ cdsbin/
[hadoop@hadoop-master1 sbin]$ ./start-yarn.sh
启动时会提示连接其他机器,不用管,这里是要启动ResourceManager
[hadoop@hadoop-master1 sbin]$ jps
1474 DFSZKFailoverController
2532 Jps
2437 ResourceManager
1643 NameNode
5.8.9、Web查看HDFS
访问:192.168.13.131:50070
访问:192.168.13.135:50070
验证高可用:
现在hadoop-master是active的,hadoop-master1是standby的,将hadoop-master的namenode停掉,然后再查看hadoop-master状态
[hadoop@hadoop-master sbin]$./hadoop-daemon.sh stop namenode
stopping namenode
再启动hadoop-master的namenode
发现hadoop-master成为standby状态了,说明namenode高可用配置成功
5.9、查看hdfs状态
[hadoop@hadoop-master ~]$ cd /home/hadoop/hadoop-2.7.3/bin/
[hadoop@hadoop-master bin]$ ./hdfs dfsadmin -report
Configured Capacity: 81411637248 (75.82 GB)
Present Capacity: 71973384192 (67.03 GB)
DFS Remaining: 71973298176 (67.03 GB)
DFS Used: 86016 (84 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
-------------------------------------------------
Live datanodes (3):
Name: 192.168.13.134:50010 (hadoop-slave3)
Hostname: hadoop-slave3
Decommission Status : Normal
Configured Capacity: 27137212416 (25.27 GB)
DFS Used: 28672 (28 KB)
Non DFS Used: 3134394368 (2.92 GB)
DFS Remaining: 24002789376 (22.35 GB)
DFS Used%: 0.00%
DFS Remaining%: 88.45%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Sun Aug 06 06:44:39 CST 2017
Name: 192.168.13.132:50010 (hadoop-slave1)
Hostname: hadoop-slave1
Decommission Status : Normal
Configured Capacity: 27137212416 (25.27 GB)
DFS Used: 28672 (28 KB)
Non DFS Used: 3169472512 (2.95 GB)
DFS Remaining: 23967711232 (22.32 GB)
DFS Used%: 0.00%
DFS Remaining%: 88.32%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Sun Aug 06 06:44:39 CST 2017
Name: 192.168.13.133:50010 (hadoop-slave2)
Hostname: hadoop-slave2
Decommission Status : Normal
Configured Capacity: 27137212416 (25.27 GB)
DFS Used: 28672 (28 KB)
Non DFS Used: 3134386176 (2.92 GB)
DFS Remaining: 24002797568 (22.35 GB)
DFS Used%: 0.00%
DFS Remaining%: 88.45%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Sun Aug 06 06:44:39 CST 2017
5.10、查看文件块组成
[hadoop@hadoop-master bin]$ ./hdfs fsck /-files -blocks
Connecting to namenode viahttp://hadoop-master:50070/fsck?ugi=hadoop&files=1&blocks=1&path=%2F
FSCK started by hadoop (auth:SIMPLE)from /192.168.13.131 for path / at Sun Aug 06 06:47:07 CST 2017
/ <dir>
/tmp <dir>
/tmp/hadoop-yarn <dir>
/tmp/hadoop-yarn/staging <dir>
/tmp/hadoop-yarn/staging/history<dir>
/tmp/hadoop-yarn/staging/history/done<dir>
/tmp/hadoop-yarn/staging/history/done_intermediate<dir>
Status: HEALTHY
Total size: 0B
Total dirs: 7
Total files: 0
Total symlinks: 0
Total blocks (validated): 0
Minimally replicated blocks: 0
Over-replicated blocks: 0
Under-replicated blocks: 0
Mis-replicated blocks: 0
Default replication factor: 3
Average block replication: 0.0
Corrupt blocks: 0
Missing replicas: 0
Number of data-nodes: 3
Number of racks: 1
FSCK ended at Sun Aug 06 06:47:07 CST2017 in 6 milliseconds
The filesystem under path '/' is HEALTHY
5.11、Web查看集群状态
浏览器输入http://192.168.13.131:8088
ResourceManager HA state状态也是active,说明resourceManager也是高可用的
到此为止,hadoop集群搭建完成。
6、安装部署hive
1、hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
2、Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
6.1、安装mysql并配置
安装mysql过程略
6.1.1、创建hive用户,数据库
创建用户:CREATE USER 'hive' IDENTIFIED BY 'hive';
创建数据库:create database hive;
授权:grant all on hive.* to hive@'%' identified by 'hive';
grant all on hive.* to hive@'localhost' identified by 'hive';
刷新授权表:
flush privileges;
测试:
mysql -uhive -phive
能正常进去,说明配置成功
6.2、安装hive
6.2.1、解压:
[root@hadoop-master ~]# tar xfapache-hive-2.1.1-bin.tar.gz -C /home/hadoop/
6.2.2、建立软连接
[root@hadoop-master ~]# ln /home/hadoop/apache-hive-2.1.1-bin/hive
6.2.3、更改属主属组:
[root@hadoop-master ~]# chown hadoop.hadoop-R /home/hadoop/apache-hive-2.1.1-bin/
6.2.4、添加环境变量
[root@hadoop-master ~]# vim/home/hadoop/.bash_profile
export HIVE_HOME=/home/hadoop/hive
export PATH=$PATH:$HIVE_HOME/bin
使其有效
source /home/hadoop/.bash_profile
6.2.5、修改hive.site.xml配置
[root@hadoop-master ~]# su - hadoop
[hadoop@hadoop-master ~]$ cphive/conf/hive-default.xml.template hive/conf/hive-site.xml
[hadoop@hadoop-master ~]$ vim /hive/conf/hive-site.xml
修改以下内容:
<property>
<name>javax.jdo.option.ConnectionURL </name>
<value>jdbc:mysql://192.168.11.20:3306/hive </value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName </name>
<value>com.mysql.jdbc.Driver </value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword </name>
<value>hive </value>
</property>
<property>
<name>hive.hwi.listen.port </name>
<value>9999 </value>
<description>This is the port the Hive Web Interface will listen on </descript ion>
</property>
<property>
<name>datanucleus.autoCreateSchema </name>
<value>true</value>
</property>
<property>
<name>datanucleus.fixedDatastore </name>
<value>false</value>
</property>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>Username touse against metastore database</description>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/home/hdpsrc/hive/iotmp</value>
<description>Local scratchspace for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/home/hdpsrc/hive/iotmp</value>
<description>Temporarylocal directory for added resources in the remote filesystem.</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/home/hdpsrc/hive/iotmp</value>
<description>Location ofHive run time structured log file</description>
</property>
6.2.6、复制mysql-connector-java包
拷贝mysql-connector-java-5.1.43-bin.jar 到hive 的lib下面
把jline-2.12.jar拷贝到hadoop相应的目录下
[hadoop@hadoop-master lib]$ cp jline-2.12.jar/home/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib/
6.2.7、创建hive临时文件夹
[hadoop@hadoop-master hive]$ mkdir iotmp
6.2.8、配置conf下的 hive-log4j2.properties和hive-exec-log4j2.properties
[hadoop@hadoop-master conf]$ mvhive-log4j2.properties.template hive-log4j2.properties
[hadoop@hadoop-master conf]$ mvhive-exec-log4j2.properties.template hive-exec-log4j2.properties
分别编辑hive-log4j2.properties和hive-exec-log4j2.properties,修改log文件路径
[hadoop@hadoop-master conf]$ vimhive-log4j2.properties
property.hive.log.dir =/home/hadoop/hive/log
[hadoop@hadoop-master conf]$ vimhive-exec-log4j2.properties
property.hive.log.dir = /home/hadoop/hive/log/exec
6.3、启动hive
在启动hive之前,需要使用schematool初始化
[hadoop@hadoop-masterbin]$ schematool -dbType mysql -initSchema
启动hive
[hadoop@hadoop-master conf]$ hive
hive> show databases;
OK
default
Time taken: 1.459 seconds, Fetched: 1row(s)
启动元数据
hive --service metastore &