搭建环境准备
VMWARE WORKPRO 15 + CENTOS 7
- 虚拟化软件可以选择VMWare的新版本或者VirturalBox,建议使用统一的软件;
- Linux操作系统可以选择 CentOS 7 或更高版本,也可以选择 Ubuntu ,此次介绍在CentOS7上部署hadoop环境,建议统一;
问题:为什么要用虚拟化软件 ,要在 Linux 上搭建?
hadoop属于分布式技术 框架,需要搭设集群环境,由于物理机有限,通过虚拟化技术可以实现集群节点的创建;
hadoop应用的生产环境多使用Linux;
社区资源多,学习方便;
工具支持多,hadoop属于开源项目,与linux有共同点,有些开源工具方便使用;
配置的逻辑结构如下图:
一、前期准备
账户的免密执行
- 编辑文件sudoer(复制黏贴可用vim的 yy + p), 如为·
hadoop用户
设置免密
sudo vim /etc/sudoers
#-----sudoers
root ALL(ALL) ALL
hadoop ALL(ALL) NOPASSWD:ALL
#-----
主机名设置
(同集群设置hosts,这个可以在集群建立之后配置)
sudo vim /etc/hosts
- 编辑文件hosts ,将本机的ip地址(如192.168.x.x)和设置的机器名添加到文件末尾一行,配置集群映射
#-----hosts
127.0.0.1 hadoop01
192.168.x.x hadoop01
192.168.x.x hadoop02
......
#-----
- hostnamectl命令设置终端显示
hostnamectl --static set-hostname hadoop01 #设置终端显示
关闭SELINUX安全协议
sudo vim /etc/sysconfig/selinux
- 编辑文件hosts ,将本机的ip地址(如192.168.x.x)和设置的机器名添加到文件末尾一行
#-----
selinuxSELINUX = disabled
#-----
关闭防火墙
# 关闭防火墙
systemctl stop firewalld
# 关闭防火墙开机启动
systemctl disable firewalld
为什么要关闭防护墙?学习阶段可以直接关闭,避免影响集群内节点之间的通信,加上该环境搭建在内网中,一般不会出现安全问题。
实际应用场景建议使用安全组策略,开放指定端口,配置方法
添加windows远程桌面插件(可选)
#.安装epel库
yum install epel-release
# 安装
xrdp yum install xrdp -y
# 启动
xrdp systemctl start xrdp
# 设置为自启动
systemctl enable xrdp
二、基本环境配置
JRE环境
#查询已安装的jdk,若存在则准备卸载
rpm -qa |grep java
#卸载已安装的
jdkrpm -e --nodeps ****jdk****
# 建议使用完整的jdk,而不是 openjdk
# Hadoop为安装Hadoop的安装
cd /home/hadoop/software
# 解压jdk压缩包tar
tar -zvxf jdk-8u-121.tar.gz
# 配置 JDK 环境
sudo vim /etc/profile
#------
vi /etc/profile
#在文件末尾将解压后的jdk目录设置成JAVA_HOME变量,并配置到PATH中export
JAVA_HOME=/home/hadoop/software/jdk1.8.0_121export
PATH=$PATH:$JAVA_HOME/bin
#-----
# source profile使配置立即生效
source /etc/profile
# 测试 jdk 配置请看
whereis java
配置Hadoop环境
- 解压hadoop
# 解压hadoop压缩包
cd /home/hadoop/software tar -zvxf hadoop-2.7.7.tar.gz
# 配置环境变量
- 配置hadoop环境变量
vi /etc/profile
在文件末尾将解压后的hadoop目录设置成HADOOP_HOME变量,并配置到PATH中export
#------
HADOOP_HOME=/home/hadoop/software/hadoop.2.7.7export
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#-----
- source profile使配置立即生效
source /etc/profile
- 配置hadoop内部的jdk环境变量
vi hadoop2.7.7/etc/hadoop/hadoop-env.sh
#------hadoop2.7.7/etc/hadoop/hadoop-env.sh
#将jdk变量更换成本地的
# The java implementation to use.
export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121
#-----
- 测试 jdk 配置请看
whereis hadoop
# 或者通过hadoop直接查看
hadoop
单机版hadoop环境已经部署完成,简单测试
- 创建两个测试目录 input ,用于存放hadoop处理数据源和结果
cd /home/hadoop/software
mkdir hadoop-study-space
cd hadoop-study-space
mkdir input
cd ../
chmod -R 755 hadoop-study-space
- 将待处理数据拷贝到input目录下,如hadoop的xml包含dfs的内容
hadoop jar /home/hadoop/software/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar grep /home/hadoop/software/hadoop-study-space/input /home/hadoop/software/hadoop-study-space/output 'dfs[a-z.]+'
三、克隆虚拟机,搭建集群环境
复制虚拟机系统(虚拟机克隆或文件拷贝)
四、网络配置
设置静态ip地址等
(或者通过NAT-vm8的设置也可以)【可在集群搭建前配置】
# 先检查联网状态及ip地址以及第一个虚拟网卡的名称
ifconfig
# 设置ens的网络参数配置脚本
cd /etc/sysconfig/network-scripts/
# 找到自己的的网卡设置 ifcfg-ens33(当前主机使用的网卡)
vim ifcfg-ens33
# 修改ip获取方式(dhcp --> static)
# onboot 改为自启动 yes
vi /etc/sysconfig/network-scripts/ifcfg-ens33
设置ip地址
#-----/etc/sysconfig/network-scripts/ifcfg-ens33 文件
BOOTPROTO=static # 使用静态IP地址,默认为dhcp
IPADDR=192.168.38.130 # 设置的静态IP地址
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=192.168.38.1 # 网关地址
DNS1=8.8.8.8
#-----
为什么要配置静态地址?
目前虚拟机网卡IP地址为自动获取模式DHCP。也就是说虚拟机每次开机IP地址都不是确定的。这对于集群来说是不可接受的,因为集群节点(master、slave)之间通讯是靠IP地址找到对方的,如果IP地址不固定会造成集群间无法访问也就是集群无法工作。
设置本机名称
(其他虚拟机同下,host-ip地址的映射已在前面配置)
- 修改配置文件
cd /etc/sysconfig/
#若无network,则创建
vim network
#---network
NETWORKING=yes
HOSTNAME=hadoop001
#---
- 通过控制行直接修改
hostnamectl hostnamectl set-hostname hadoop001
为什么要配置HOSTS?
Hadoop多节点分布式集群中还有两个从节点DATANODE,而它默认是通过主机名去找到对应节点的;
Hosts文件存储网络中各节点的信息负责计算机名与IP的映射,通过配置hosts文件可以完成节点访问。
ssh远程设置免密切换
此处只展示单向,每台机器都按此流程配置【这部分建议在克隆后单独配置】
# 在源主机A中执行指令,生成ssh秘钥
ssh-keygen
# 默认生成在当前用户主目录下 .ssh ,目录名为 .ssh ,id_rsa 和 id_rsa.pub
# 将ssh的公钥传递到要免密切换的机器中
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop02
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop03
# ssh 命令测试
ssh hadoop02
ssh hadoop03
备注: .ssh目录的权限必须是700, .ssh/authorized_keys文件权限必须是600 (默认权限)
为什么要设置ssh远程设置免密切换?
在Hadoop启动以后,namenode是通过SSH(Secure Shell)来启动和停止各个节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,故我们需要配置SSH使用无密码公钥认证的方式。
这里其实需要了解hadoop namenode 的工作原理;
五、hadoop 配置集群配置
位置 hadoop-2.7.7/etc/hadoop
hadoop-2.7.7/etc/hadoop 里面存放了hadoop框架的配置脚本文件
cd /home/hadoop/software/hadoop-2.7.7/etc/hadoop
配置说明
这里准备设置3台机器来搭建hadoop(可以按需求配置时相应做调整)
- 其中一个nodenode
- 两个datanode,次secondarynamenode 不单独设置服务器(此处使用的是2.x版本,建议与namenode 分开),可以放到namenode下也可以放到datanode
运行环境配置 hadoop-env.sh
#hadoop-env.sh 环境变量,设置jdk路径、调整运行内存等参数
JAVA_HOME=/home/hadoop/software/jdk1.8.0_121
集群参数配置 core-site.xml
No. | 参数名 | 默认值 | 参数解释 |
1 | fs.defaultFS | file:/// | 文件系统主机和端口 |
2 | io.file.buffer.size | 4096 | 流文件的缓冲区大小 |
3 | hadoop.tmp.dir | /tmp/hadoop-${user.name } | 临时文件夹 |
说明:在配置文件中的节点里加入以下属性(下同)
- HDFS URI 、Hadoop的临时目录等
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
<description>hdfs的主节点</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoopdata</value>
<description>存放临时文件的目录</description>
</property>
HDFS参数配置 hdfs-site.xml
节点和数据节点的存放位置、文件副本的个数、http访问地址
No | .参数名 | 默认值 | 参数解释 |
1 | dfs.namenode.secondary.http-address | 0.0.0.0:50090 | 定义HDFS对应的HTTP服务器地址和端口 |
2 | dfs.namenode.name,dir | file://${hadoop.tmp.dir}/dfs/name | 定义DFS的名称节点在本地文件系统的位置 |
3 | hadoop.tmp.dir | file://${hadoop.tmp.dir}/dfs/data | 定义DFS数据节点存储数据块时存储在本地文件系统的位置 |
4 | dfs.replication | 3 | 缺省的块复制数量 |
5 | dfs.webhdfs.enabled | true | 是否通过http协议读取hdfs文件,如果选是,则集群安全性较差 |
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/hadoopdata/name</value>
<description>namenode的目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/hadoopdata/data</value>
<description>datanode的数据存储目录</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop02:50090</value>
<description>secondarynamenode的运行节点,和namenode不同节点</description>
</property>
注意:以下配置文件默认采用hosts主机名来定位主机(即步骤1-②),要设置ip地址的需要对配置文件进行修改
默认是通过host映射hdfs-site.xml
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
MapReduce参数配置
MapReduce参数配置 mapred-site.xml reduce任务个数、内存等
No. | 参数名 | 默认值 | 参数解释 |
1 | mapreduce.framework.name | local | 取值local、classic或yarn其中之一,如果不是yarn,则不会使用yarn集群来实现资源的分配 |
2 | mapreduce.jobhistory.address | 0.0.0.0:10020 | 定义历史服务器的地址和端口,通过历史服务器查看已经运行完的Mapreduce作业记录 |
3 | mapreduce.jobhistory.webapp.address | 0.0.0.0:19888 | 定义历史服务器web应用访问的地址和端口 |
备注,默认解压后只有mapre-site.xml.template,可以将mapre-site.xml.template重命名为mapre-site.xml
目前2.x采用yarn接管,这个配置文件是 JOB调度的。
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>指定MapReduce跑在yarn上</description>
</property>
Yarn参数配置
Yarn参数配置 yarn-site.xml 集群资源管理系统参数 配置Yarn的ResourceManager ,nodeManager的通信端口,web监控端口
No. | 参数名 | 默认值 | 参数解释 |
0 | yarn.resourcemanager.hostname | 设置主机节点(这里默认是hosts主机名) | |
1 | yarn.resourcemanager.address | 0.0.0.0:8032 | ResourceManager(以下简称RM) 提供客户端访问的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等 |
2 | yarn.resourcemanager.scheduler.address | 0.0.0.0:8030 | RM提供给ApplicationMaster的访问地址。ApplicationMaster同通过该地址向RM申请资源、释放资源等 |
3 | yarn,resoucemanager.resource.resource-tracker.address | 0.0.0.0:8031 | RM提供NodeManager的地址。NodeManager通过该地址向RM汇报心跳,领取任务等 |
4 | yarn.resourcemanager.admin.address | 0.0.0.0:8033 | RM提供管理员的访问地址。管理员通过该地址向RM发送管理命令等 |
5 | yarn.resourcemanager.webapp.address | 0.0.0.0:8088 | RM对web服务提供地址。用户可通过该地址在浏览器中查看集群各类信息6yarn.nodemanager.aux-servicesmapreduce_shuffle通过该配置项,用户可以自定义一些服务,例如Map-Reduce的shuffle功能就是采用这种方式实现的,这样就可以在NodeManager上扩展自己的服务 |
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop03</value>
<description>YARN集群的主节点</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>YARN集群为MapReduce程序提供shuffle服务</description>
</property>
slaves配置
master和slave的定义:
一般在集群中你唯一地选择一台机器作为 NameNode ,一台机器作为 ResourceManager,这是master (主)。那么 ,集群中剩下的机器作为DataNode 和 NodeManager。这些是slaves (从)。
在你的 hadoop目录/etc/hadoop/slaves 文件上列出全部slave的hostnamels或IP地址,一个一行。
# slaves
hadoop01
hadoop02
hadoop03
集群测试(带先后顺序的)
- 网络测试
- ssh 切换测试
- 启动hadoop
六、Hadoop启动
格式化节点并启动
1)确定主节点namenode,进行格式化,如果多次格式化,在最近格式化之前需要删除之前的data文件夹和logs文件夹
hadoop namenode -format # 如果多次格式化,需要删除之前的data文件夹和logs文件夹
2)先启动
start-hdfs.sh # hdfs启动
3)再启动
start-yarn.sh #yarn启动
web浏览器检查启动节点
备注:如果外部局域网不能访问,检查是否时防火墙未关闭,或者未设置对应端口安全组,我这里192.168.16.3对应的时hadoop01,我这里192.168.16.5对应的时hadoop03
hdfs hadoop01:50070
yarn hadoop03:8088