1. Hadoop基础
1.1 Hadoop介绍
Hadoop是 Apache 旗下的一个用 java 语言实现开源软件框架,是一个开发和运行处理大规模数据的软件平台。允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理。
- 狭义上 : Hadoop是处理大数据的软件平台
- HDFS(
分布式文件系统
) : 解决海量数据存储 - YARN(
作业调度和集群资源管理的框架
) : 解决资源任务调度 - MAPREDUCE(
分布式运算编程框架
) : 解决海量数据计算
- HDFS(
- 广义上 : Hadoop生态圈
1.2 Hadoop特点
- 扩展能力强
- 成本低
- 高效率
- 可靠性高
2. Hadoop集群搭建
2.1 发行版本
Hadoop发行版本分为开源社区版和商业版 , 社区版是Apache软件基金会维护的, 是官方维护的版本 ; 商业版指第三方商业公司在社区版基础上进行优化 , 整合 , 测试 , 较为著名的有cloudera的CDH、mapR等
Hadoop 2.0 则包含一个支持 NameNode 横向扩展的 HDFS,一个资源管理系统YARN 和一个运行在 YARN 上的离线计算框架 MapReduce。相比于 Hadoop1.0,Hadoop 2.0 功能更加强大,且具有更好的扩展性、性能,并支持多种计算框架。
我们使用当前2系列最稳定的版本 : Apache Hadoop 2.7.4。
2.2 集群简介
Hadoop集群 = HDFS集群 + YARN集群 , 两者都是主从集群 , 一主带多从 , 两者逻辑上分离 , 物理上常常在一起
-
HDFS 集群负责海量数据的存储,集群中的角色主要有:
-
NameNode : 主角色
-
DataNode : 从角色
-
SecondaryNameNode : 秘书角色
-
-
YARN 集群负责海量数据运算时的资源调度,集群中的角色主要有 :
- ResourceManager : 主角色
- NodeManager : 从角色
-
简写
nn namenode
dn datanode
snn SecondaryNameNode
rm ResourceManager
nm NodeManager
mr mapreduce
Hadoop 部署方式分三种,Standalone mode (独立模式)、Pseudo-Distributedmode(伪分布式模式)、Cluster mode(群集模式),其中前两种都是在单机部署。
扩展 :
集群规划:
结合软件中组件的特性和服务器的硬件做出合理的角色分配
如果两个角色间所依赖的硬件有冲突 尽量不在一起
如果两个角色间有工作上的依赖 尽量在一起
补充:nodemanager和datanode是好基友 成双成对出现
我们部署的是Cluster mode ( 集群模式 )
node-1 : namenode datanode | resourcemanager nodemanager
node-2 : secondarynamenode datanode | nodemanager
node-3 : datanode | nodemanager
-
如果企业中需要扩大集群规模:
node-4: datanode nodemanager node-5: datanode nodemanager ......
规划和最终实际效果要想一致 需要
配置文件
中参数做出约束保证。 -
如何高效的在多台机器上搭建分布式的软件?
一般选择一台机器先配置好 后scp到其他各个机器
Hadoop集群图解
tips: mapreduce(mr)是计算框架 , 是代码层的组件 , 当我们需要计算大数据的时候, 需要自己动手编程mr , mr在hadoop集群上运行
2.3 服务器准备
本案例使用 VMware Workstation Pro 虚拟机创建虚拟服务器来搭建 HADOOP集群,所用软件及版本如下:
VMware Workstation Pro 12.0 或者 14.0
Centos 6.7 64bit
2.4 网络环境准备
采用NAT方式联网
2.5 服务器系统设置
同步时间
-
手动同步集群各机器时间
date -s "2018-11-14 11:40:08"
yum install ntpdate
-
网络同步时间
ntpdate cn.pool.ntp.org
设置主机名
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node-1
配置IP、主机名映射
vi /etc/hosts
192.168.244.151 node-1
192.168.244.152 node-2
192.168.244.153 node-3
配置ssh免密登录
-
生成ssh免密登录密钥
ssh-keygen -t rsa(四个回车)
执行完这个命令 , 会生成id_rsa(私钥) , id_rsa.pub(公钥)
将公钥拷贝到要免密登陆的目标机器上
ssh-copy-id node-1
tips: 也需要拷贝给自己 , 其他的机器也需要生成免密登录的密钥 , 然后拷贝即可
设置防火墙
-
查看防火墙状态
service iptables status
-
关闭防火墙
service iptables stop
-
查看防火墙开机启动状态
chkconfig iptables --list
-
关闭防火墙开机启动
chkconfig iptables off
2.6 JDK环境安装
-
删除openjdk
- 查看是否存在openjdk
rpm -qa | grep java
- 删除所有openjdk
rpm -e --nodeps xxxxxxxxx
- 查看是否存在openjdk
-
上传jdk安装包
jdk-8u65-linux-x64.tar.gz
到**/export/servers**下 -
解压安装包(解压到当前包(/export/servers)即可)
tar zxvf jdk-8u65-linux-x64.tar.gz
-
配置环境变量
vi /etc/profile
export JAVA_HOME=/export/servers/jdk1.8.0_65 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
-
刷新配置
source /etc/profile
===> 查看版本java -version
2.7 Hadoop安装包目录结构
- hadoop官方tar包介绍
hadoop-2.7.4-src.tar.gz src 源码包
hadoop-2.7.4.tar.gz bin 安装包
-
Q:为什么有些软件需要自己下载源码进行编译?
- 软件中有些特性跟系统的版本位数息息相关 需要下载源码结合你具体的操作系统进行编译 , 将源码放在操作系统上先进行编译
- 有些软件需要修改源码 满足自己的特性 这时候也需要自己重新编译
- 如何编译源码 :
- 可以用maven进行编译 , 利用
maven-package
编译即可 , 具体参考资料中的源码编译
- 可以用maven进行编译 , 利用
-
这里我们选择将编译好的打包进行安装
-
上传
hadoop-2.7.4-with-centos-6.7.tar.gz
到**/export/servers** -
解压即可 , 也可以删除安装包
了解Hadoop的目录结构
- bin : Hadoop 最基本的管理脚本和使用脚本的目录
- etc:Hadoop 配置文件所在的目录
- sbin:Hadoop 管理脚本所在的目录,主要包含 HDFS 和 YARN 中各类服务的
启动/关闭脚本
- share : hadoop自带示例,编译后的jar
2.8 Hadoop配置文件修改
首先进入配置文件目录cd etc/hadoop/
再进行操作
2.8.1 hadoop-env.sh
文件中设置的是 Hadoop 运行时需要的环境变量。JAVA_HOME是必须设置的 , 保证hadoop运行时一定可以加载到JDK
vi hadoop-env.sh
export JAVA_HOME=/export/servers/jdk1.8.0_65
2.8.2 core-site.xml
hadoop 的核心配置文件,有默认的配置项 core-default.xml。
vi core-default.xml
<!-- 指定默认文件系统类型,以及文件系统老大所在位置 , namenode在node-1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node-1:9000</value>
</property>
<!--指定Hadoop运行时所有数据保存的目录,默认/tmp/hadoop-${user.name}-->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/data/hddata</value>
</property>
2.8.4 hdfs-site.xml
HDFS 的核心配置文件,有默认的配置项 hdfs-default.xml。
vi hdfs-site.xml
<!-- 指定HDFS副本的数量, 默认副本数是3-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- secondary namenode 所在主机的 ip 和端口->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node-2:50090</value>
</property>
2.8.4 mapred-site.xml
MapReduce 的核心配置文件,有默认的配置项 mapred-default.xml。
vi mapred-site.xml
<!-- 指定mr运行时框架名称,也就是由谁提供运算资源-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
2.8.5 yarn-site.xml
YARN 的核心配置文件,有默认的配置项 yarn-default.xml。
vi yarn-site.xml
<!-- 指定 YARN 的老大(ResourceManager)的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node-1</value>
</property>
<!-- NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce
程序默认值:"" -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
2.8.6 slaves ???
slaves 文件里面记录的是集群主机名。
vi slaves
node-1
node-2
node-3
注意 : 先删除本地的 , 这里一行一个 , 不要一行多个
2.9 Hadoop环境变量
编辑环境变量的配置文件
vi /etc/profile
export HADOOP_HOME=/export/servers/hadoop-2.7.4
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
保存配置文件 , 刷新配置文件 :
source /etc/profile
复制到其他机器
scp -r /export/servers/hadoop-2.7.4/ root@node-2:/export/servers/
scp -r /export/servers/hadoop-2.7.4/ root@node-3:/export/servers/
scp -r /etc/profile root@node-2:/etc
scp -r /etc/profile root@node-3:/etc
source /etc/profile
3. Hadoop集群启动、初体验
3.1 启动方式
要启动 Hadoop 集群,需要启动 HDFS 和 YARN 两个集群。
注意 : 首次启动(是指刚刚搭建好Hadoop集群)HDFS时,必须对其进行格式化操作
。本质上是一些清理和准备工作,因为此时的 HDFS 在物理上还是不存在的。
hdfs namenode -format
或者 hadoop namenode -format
-
hdfs 格式化 准确来说是对hdfs的文件系统进行初始化的操作 保证运时的目录数据文件等存在。
- 该操作在集群搭建完成后首次启动之前进行
- 格式化
只可进行一次
如果出现多次格式化 就是使得主从之间的集群ID不一致 导致集群启动失败 - 一般在namenode所在机器执行一次
Q:万一格式化多次怎么破? 解决方式:把每个机器上初始化生成的文件夹都删除 重新格式化一次
-
格式化会自动创建配置中指定目录(hadoop.tmp.dir) 和生成hdfs运行相关的数据文件
-rw-r--r--. 1 root root 321 Nov 14 11:52 fsimage_0000000000000000000 -rw-r--r--. 1 root root 62 Nov 14 11:52 fsimage_0000000000000000000.md5 -rw-r--r--. 1 root root 2 Nov 14 11:52 seen_txid -rw-r--r--. 1 root root 208 Nov 14 11:52 VERSION
3.1.1 单节点逐个启动
- 启动/关闭HDFS NameNode :
hadoop-daemon.sh start/stop namenode
- 启动/关闭HDFS DataNode :
hadoop-daemon.sh start/stop datanode
- 启动/关闭YARN ResourceManager :
yarn-daemon.sh start/stop resourcemanager
- 启动/关闭YARN nodemanager :
yarn-daemon.sh start/stop nodemanager
3.1.2 脚本一键启动
如果配置了 etc/hadoop/slaves 和 ssh 免密登录,则可以使用程序脚本启动所有 Hadoop 两个集群的相关进程,在主节点所设定的机器上执行。
开启集群 : start-dfs.sh start-yarn.sh
停止集群 : stop-dfs.sh stop-yarn.sh
前提是配置好免密登录
下面两方式尽量少用 :
开启集群 : start-all.sh
停止集群 : stop-all.sh
3.2 集群web-ui
一旦Hadoop集群启动并运行 , 可以通过web-ui进行集群查看 , 如下所述:
NameNode http://nn_ip:port/ 默认50070
==>http://node-1:50070 该网站是用于访问的 ; http://node-1:9000该网站是用于操作的
hdfs:本质上就是文件系统 存放文件的(文件就是文件 目录就是目录)
操作起来慢
ResourceManager http://rm_ip:port 默认8088
==>http://node-1:8088
3.3 Hadoop初体验
3.3.1 HDFS使用
从 Linux 本地上传一个文本文件到 hdfs 的/test/input 目录下
hadoop fs -mkdir -p /test/input
hadoop fs -put /root/startZk.sh /test/input
3.3.2 运行MapReduce程序
在 Hadoop 安装包的 hadoop-2.7.4/share/hadoop/mapreduce 下有官方自带的 mapreduce 程序。我们可以使用如下的命令进行运行测试。
示例程序 jar:
hadoop-mapreduce-examples-2.7.4.jar
计算圆周率:
hadoop jar hadoop-mapreduce-examples-2.7.4.jar pi 2 4
关于圆周率的估算,感兴趣的可以查询资料 Monte Carlo 方法来计算 Pi 值。