目录
一、安装两台虚拟机
二、修改主机名和用户名
三、配置静态IP地址
四、配置SSH无密码连接
五、安装JDK:
六、配置Hadoop
本文笔记整理自《Hadoop海量数据处理:技术详解与项目实战》范东来,修正了原书中的一些细节处的问题,经过试验,可部署成功,特此附上完整部署笔记。
1.本机(笔记本)系统环境:CPU:Intel Core i5-7300HQ @2.50GHz;内存:16GB;机械硬盘:45GB。
2.通过VMware安装两台CentOS7系统,分别为master和slave1。
3.很重要:安装类型采用“计算节点安装”,不要“最小安装”,以免后续要手动安装一大堆软件。
可参考博客:vm安装无可视化桌面的CentOS系统
1.修改用户名密码,创建hadoop用户:
master和slave1节点都需创建hadoop用户
1.统一设置密码为123456
$ passwd root
2.创建hadoop用户,并修改密码
$ useradd hadoop
$ passwd hadoop
2.修改主机名:
2.规范化主机名,虽然安装CentOS时输入过主机名
$ vi /etc/sysconfig/network
<修改或添加内容,如下:>
NETWORKING=yes
HOSTNAME=master
<注1:HOSTNAME根据节点名称设定,主节点master,从节点slave1、slave2等等>
<注2:伪分布只需设置一个master,无从节点>
修改主机名,更改内容为:
$ vi /etc/hostname
master
3.添加主机名列表:
3.修改主机名列表,为了各节点间能用主机名相互访问
$ vi /etc/hosts
<文件末尾追加,如下:>
# 填写IP地址与主机名
192.168.190.200 master
192.168.190.201 slave1
<注1:若是伪分布模式,从节点IP和主机名slave1不用配置>
<注2:完全分布式时,master和slave1节点都需修改此文件,保持文件内容一致>
<主3:windows hosts 文件位置: C:\Windows\System32\drivers\etc\hosts >
(由于Hadoop集群在启动时需要通过固定的主机名或者地址启动,所以必须配置静态IP地址。)
(主从节点都需配置)
0. 首先查看本地网卡名称
$ ip addr
1: lo: ............
2: ens33: ...............
注:此地为 ens33
或者通过如下命令查看网卡状态:
$ service network status
1.修改文件ifcfg-ens33,输入如下内容:
a. 先查看网络配置目录,并备份 ifcfg-ens33 文件:
$ cd /etc/sysconfig/network-scripts/
$ ll
$ cp ifcfg-ens33 ifcfg-ens33.copy
b. 之后在对 ifcfg-ens33 进行修改:
$ vi ifcfg-ens33
<删除原内容,添加如下内容:>
# 静态
DEVICE="ens33"
BOOTPROTO="static"
NM_CONTROLLED="no" # 禁用 NetworkManager 服务,不让其获取动态IP,默认 yes
# 设备硬件地址
HWADDR="00:0b:28:33:ec:e1" (各节点硬件地址不同)
ONBOOT="yes"
#TYPE="Ethernet"
# 静态IP和子网掩码
IPADDR=192.168.190.200 (master节点为 200 ;slave1从节点为 201)
NETMASK=255.255.255.0
# 网关IP
GATEWAY=192.168.190.1
DNS1=8.8.8.8
c. 修改完文件 ifcfg-ens33 后重启网络:
$ service network restart
注:遇到提示,按回车即可
<注1:Linux6.4前用ifcfg-em1,后用ifcfg-eth0>
<注2:所有节点都需配置,伪分布只需配置一个>
<注3:HWADDR(硬件地址)可用 $ ip addr 命令查看,找到 "link/ether 00:0b:28:33:ec:e1">
eth0,eth1,eth2……代表网卡一,网卡二,网卡三……
lo代表127.0.0.1,即localhost
<注4:IPADDR 根据本机网段确定,命令 $ ifconfig 查看>
2.网络适配器连接模式:【桥接模式】
测试各台机之间能通过静态IP相互ping通
slave1]$ ping 192.168.190.200
master]$ ping 192.168.190.201
<注1:在vmware虚拟机中:vmnet0对应桥接模式;vmnet1对应NAT模式;vmnet8对应仅主机模式>
<注2:本机搭建虚拟机环境,网络使用 ‘无线局域网适配器 WLAN’>
<注3:更换无线网络后,IP变化,需要重新更改对应的 IP ,需修改这两个文件:
vi /etc/sysconfig/network-scripts/ifcfg-ens33
vi /etc/hosts
如原 IP :192.168.190.200
如现 IP :192.168.242.200
同时,还需更改 ssh 免密登录设置
**同时出现的问题:
1)会导致 hadoop namenode 与 datanode 不一致;
2)出现 datanode 无法启动的问题(提示 0 datanode 可用);
3)就算 datanode 能启动,向HDFS上传下载文件时会 name node is in safe mode;
暂时解决方式:(针对单机试验阶段,真实环境不可取)
1. 必须先关闭Hadoop,删除各节点的 /opt/hdfs/name 和 /opt/hdfs/data 文件夹
2. 然后格式化 namenode
3. 重启恢复
>
注4:如果开机发现本机获得了两个IP,一个动态IP和一个静态IP,那么如何禁止动态IP呢?如下:
原因:network与NetworkManager服务冲突
解决:禁用NetworkManager服务
$ systemctl stop NetworkManager.service -- 停止服务
$ systemctl disable NetworkManager.service -- 禁用服务
$ service network restart -- 重启网络
同时,还需修改 ifcfg-ens33 配置文件中的 NM_CONTROLLED="no"
参考博客:系统设置了静态IP之后还会获取动态IP的问题解决
1.关闭防火墙:
1.首先查看防火墙状态
$ service firewalld status
<会显示绿色的active状态>
2.关闭防火墙
$ service firewalld stop
3.再次查看防火墙状态
$ service firewalld status
<会显示白色的inactive状态>
2.配置防火墙开机不自启:
$ systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
$ systemctl list-unit-files | grep firewalld
firewalld.service disabled
3.检查SSH是否安装:(一般已经安装,除非最小安装)
1.安装SSH协议(每个节点都需安装)
$ yum install ssh
$ yum install rsync
2.启动/重启SSH服务
$ service sshd restart
3.检查ssh是否安装成功
$ rpm -qa | grep openssh
openssh-7.4p1-16.el7.x86_64
openssh-server-7.4p1-16.el7.x86_64
openssh-clients-7.4p1-16.el7.x86_64
<表示已安装成功>
4.检查远程数据同步工具是否安装成功
$ rpm -qa | grep rsync
rsync-3.1.2-4.el7.x86_64
<表示已安装成功>
4.生成SSH公钥:
参看文章:SSH免密登录原理介绍
此处可以先不配置(跳过),等配置好Hadoop后再回过来配置,可以更好理解。
如果已经配置好Hadoop了,或者已经知道来龙去脉的,就直接如下配置:
在master节点以hadoop用户执行启动Hadoop:
1.在hadoop启动NameNode节点时,会访问hadoop@master,需要输入密码;
2.在hadoop启动DateNode节点时,会访问hadoop@slave1、hadoop@slave2 ... 等等(看配了多少台从节点),需要输入密码;
以上启动时的不断输入密码很繁琐,可以通过SSH配置免密登陆,如下:
以hadoop用户登陆master主节点,执行如下命令:
1.生成公钥/密钥(任意路径下执行)(master和slave1节点都需执行)
$ ssh-keygen -t rsa
2.查看生成的'.ssh/'目录
$ cd ~/.ssh/
$ ll
id_rsa (私钥)
id_rsa.pub (公钥)
known_hosts (已访问过的主机公钥)
3.复制master节点的公钥,并重命名,存放当前文件夹下
$ cp id_rsa.pub id_rsa.pub.master
$ ll
4.加入到master和slave1主机的hadoop用户的~/.ssh/下的authorized_keys文件中
4.1.由于当前已经是在master节点的hadoop用户目录下,直接加入authorized_keys(此文件一开始不存在)
$ cat id_rsa.pub.master >> authorized_keys
4.2.跨域发送到slave1节点的hadoop用户目录下,并加入authorized_keys文件末尾
$ scp id_rsa.pub.master hadoop@slave1:~/.ssh/
$ cat id_rsa.pub.master >> authorized_keys
5.更改权限(master和slave1节点都需执行)
5.1.更改'~/.ssh'文件夹权限
$ chmod 700 ~/.ssh
5.2.更改'~/.ssh/authorized_keys'文件权限
$ chmod 644 ~/.ssh/authorized_keys
6.验证免密连接(master节点hadoop用户登陆)
$ ssh hadoop@master
$ ssh hadoop@slave1
<注1:如果没有提示输入密码便能直接登陆,便是设置成功了>
<注2:经验证,只需配置主节点向从节点的免密连接即可,无需设置从节点向主节点的免密连接>
<简述:A主机公钥放入B主机授权列表中,A主机就能实现免密登录B主机>
<注3:windows .ssh 文件位置:C:\Users\Wayne Fong\.ssh>
如果系统预装了Open JDK,卸载掉,装Oracle JDK
下载地址:Java SE - Downloads | Oracle Technology Network | Oracle
注:JDK的卸载安装以 root 用户执行
1.卸载Open JDK:
root用户登陆主从节点
1.检查是否安装了JDK
$ rpm -qa | grep jdk
xxx
如果出现的xxx为 openjdk,则执行命令卸载:
$ yum -y remove xxx
2.安装Oracle JDK:
安装JDK版本:jdk-8u191-linux-x64.tar.gz
1.将JDK 从Windows下的D:/根目录 上传至 Linux下的/opt目录下
Win下运行Power Shell或者CMD命令行工具
1.1.上传至master节点(使用静态IP)
D:> scp jdk-8u191-linux-x64.tar.gz [email protected]:/opt/
1.2.上传至slave1节点(使用静态IP)
D:> scp jdk-8u191-linux-x64.tar.gz [email protected]:/opt/
2.使用tar文件的方式安装JDK
$ cd /opt
$ tar -xzvf jdk-8u191-linux-x64.tar.gz
3.配置环境变量:
配置JDK环境变量,主从节点都需配置
1.修改 /etc/profile 文件,追加内容如下:
$ vi /etc/profile
export JAVA_HOME=/opt/jdk1.8.0_191
export PATH=$PATH:$JAVA_HOME/bin
修改环境变量后,可以在任意路径下使用java命令
2.立即生效环境变量
$ source /etc/profile
3.验证安装
$ java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
<出现版本信息即安装成功>
1.解压安装hadoop:
root用户登陆主从节点
1.更改'/opt'文件夹的拥有者为hadoop
$ chown -R hadoop /opt
hadoop用户登陆主从节点
安装Hadoop版本:hadoop-2.9.2.tar.gz
1.将文件从Windows下的D:/根目录 上传至 Linux下的/opt目录下
Win下运行Power Shell或者CMD命令行工具(需windows上已经安装SSH)
1.1.上传至master节点(使用静态IP)
D:> scp hadoop-2.9.2.tar.gz [email protected]:/opt/
1.2.上传至slave1节点(使用静态IP)
D:> scp hadoop-2.9.2.tar.gz [email protected]:/opt/
2.使用tar文件的方式安装Hadoop
$ cd /opt
$ tar -zxvf hadoop-2.9.2.tar.gz
2.修改配置文件:(主从节点都需一样的配置)
进入配置文件夹下:
$ cd /opt/hadoop-2.9.2/etc/hadoop
1.修改 hadoop-env.sh,在文件末尾追加环境变量
$ vi hadoop-env.sh
export JAVA_HOME=/opt/jdk1.8.0_191
export HADOOP_HOME=/opt/hadoop-2.9.2
2.修改core-site.xml,修改为:
fs.default.name
hdfs://master:9000
注1:此项配置设置了提供HDFS服务的主机名和端口号
注2:指明了NameNode运行于主节点master
3.修改hdfs-site.xml,修改为:
dfs.replication
3
dfs.name.dir
/opt/hdfs/name
dfs.data.dir
/opt/hdfs/data
注1:dfs.replication指定HDFS文件副本数
注2:dfs.name.dir指定NameNode的元数据存放的本地文件系统路径
注3:dfs.data.dir指定DataNode的数据存放的本地文件系统路径
4.修改mapred-site.xml,修改为:
mapreduce.framework.name
yarn
注:指明MapReduce计算框架基于YARN工作
5.修改yarn-site.xml,修改为:
The hostname of the RM.
yarn.resourcemanager.hostname
master
The address of the applications manager interface in the RM.
yarn.resourcemanager.address
${yarn.resourcemanager.hostname}:8032
The address of the scheduler interface.
yarn.resourcemanager.scheduler.address
${yarn.resourcemanager.hostname}:8030
The http address of the RM web application.
yarn.resourcemanager.webapp.address
${yarn.resourcemanager.hostname}:8088
The https adddress of the RM web application.
yarn.resourcemanager.webapp.https.address
${yarn.resourcemanager.hostname}:8090
yarn.resourcemanager.resource-tracker.address
${yarn.resourcemanager.hostname}:8031
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.nodemanager.aux-services.mapreduce.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler
注:指明了ResourceManager服务的主机名和端口号
注:指明了mapreduce_shuffle的类
6.修改slaves文件内容,修改为:
slave1
slave2
...
注:这里指定了运行DataNode和NodeManager进程的从节点节点信息
注:如果是伪分布模式,slaves文件中只需加入master,意为运行于主节点
3.配置环境变量:(主从节点都需配置)
root用户登录master/slave1 主/从节点,添加全局环境变量(也可以只添加hadoop用户的局部环境变量)
1.在文件 /etc/profile 内容末尾追加如下内容,以确保任何路径下使用Hadoop命令:
$ vi /etc/profile
export HADOOP_HOME=/opt/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin
2.立即生效环境变量
$ source /etc/profile
4.格式化HDFS:
hadoop用户登录master/slave1 主/从节点
1.第一次启动Hadoop之前,必须格式化HDFS,如下命令:
$ hadoop namenode -format
格式化成功信息:
INFO common.Storage: Storage directory /opt/hdfs/name has been successfully formatted.
5.启动验证:
1.启动Hadoop(master节点hadoop用户登陆)
$ /opt/hadoop-2.9.2/sbin/start-dfs.sh
$ /opt/hadoop-2.9.2/sbin/start-yarn.sh
$ /opt/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver
2.启动后查看进程信息
2.1.master主节点执行
$ jps
会出现如下主节点进程:
Jps
NameNode
ResourceManager
SecondaryNameNode
2.2.slave1从节点执行
$ jps
会出现如下从节点进程:
Jps
DataNode
NodeManager
2.3.如果是伪分布模式,master节点将出现所有进程:
Jps
NameNode
ResourceManager
SecondaryNameNode
DataNode
NodeManager
6.验证是否安装成功:(跑一个程序:单词计数)
slave1从节点hadoop用户执行
1.查看HDFS根目录,发现为空
$ hadoop fs -ls /
2.创建HDFS用户目录
$ hadoop fs -mkdir /user
$ hadoop fs -mkdir /user/hadoop
3.本地用户目录下创建文件words
$ cd ~/
$ touch words
$ vi words
输入如下内容
data mining on data warehouse
4.在HDFS中创建MapReduce作业输入目录
$ hadoop fs -mkdir /user/hadoop/wordsinput
5.将本地words文件上传至HDFS目录下
$ hadoop fs -put words /user/hadoop/wordsinput
6.查看HDFS上的words文件
$ hadoop fs -cat /user/hadoop/wordsinput/words
显示如下内容:
data mining on data warehouse
7.执行MapReduce任务
$ hadoop jar /opt/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /user/hadoop/wordsinput /user/hadoop/wordsoutput
注1:这是Hadoop自带的测试用例测试
注2:结构是:hadoop jar 参数1 参数2 参数3
注3:参数1为执行的MapReduce作业名称
参数2为输入数据路径
参数3为输出数据路径
8.查看执行结果:
$ hadoop fs -cat /user/hadoop/wordsoutput/part-r-00000
data 2
mining 1
on 1
warehouse 1
<说明Hadoop安装成功>
9.停止Hadoop
$ /opt/hadoop-2.9.2/sbin/stop-dfs.sh
$ /opt/hadoop-2.9.2/sbin/stop-yarn.sh
<注:无法访问删除HDFS文件,并提示 'Name node is in safe mode.'
解决方式:
hadoop dfsadmin -safemode leave # 解除安全模式
hadoop dfsadmin -safemode enter # 进入安全模式
hadoop dfsadmin -safemode get # 查询安全模式
hadoop dfsadmin -safemode wait # 阻塞直到安全模式解除
>