CentOS-7 Linux 上部署hadoop集群(3台)
🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈
🌈前言
本文记载一次在虚拟机上Linux 上部署hadoop集群(3台)
🌈环境说明:
虚拟机采用: vmware虚拟机软件 centos包CentOS-7-x86_64-Minimal-1804.iso (也可以是DVD的iso文件安装的系统可以少安装很多包) jdk版本:1.8.181 hadoop版本:3.2.1 zookeeper版本:3.4.13 需要依赖glibc-2.14以上版本 集群地址分配: 192.168.1.227 master hadoop1 192.168.1.228 slave1 hadoop2 192.168.1.229 slave2 hadoop3
🌈安装部署
🐁1.安装VirtualBox虚拟机软件
下载VirtualBox软件并安装
🐂2.在虚拟机上安装centos-7
🐅3.设置虚拟机
安装常用命令 yum -y install net-tools vim zip unzip
(1)修改虚拟机名称(如果在安装时,设置了主机名,那么就不用修改)
[root@master /]
hostname查看一个主机名称
(2)设置虚拟机网络 1.将VirtualBox软件虚拟机网络设置为桥接自动(也可心用其它网络设置),
2.查询虚拟机使用的网卡信息,并修改网卡
[root@master /]
我的虚拟机网卡信息如下:
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.166.188 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::20c:29ff:fe8f:ff32 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:8f:ff:32 txqueuelen 1000 (Ethernet)
RX packets 679298 bytes 160057604 (152.6 MiB)
RX errors 0 dropped 1138 overruns 0 frame 0
TX packets 426918 bytes 65730954 (62.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 465005 bytes 50278038 (47.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 465005 bytes 50278038 (47.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
对应的网卡文件为/etc/sysconfig/network-scripts/ifcfg-enp0s3,如果看到的网卡为ecth0,那么对应的网卡文件为/etc/sysconfig/network-scripts/ifcfg-ecth0 3. 修改对应的网卡文件,将ip设置成静态并且随机启动
[root@master /]
内容如下:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
#修改IP分配策略
BOOTPROTO=static
DEFROUTE=yes
#IPV4_FAILURE_FATAL=no
#IPV6INIT=yes
#IPV6_AUTOCONF=yes
#IPV6_DEFROUTE=yes
#IPV6_FAILURE_FATAL=no
#IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=80c892ca-6412-4418-9918-e17c3b168fd4
DEVICE=ens33
#修改网卡为开机启动
ONBOOT=yes
#设置静态的ip地址
IPADDR=192.168.1.227
#设置网关
GATEWAY=192.168.1.1
#设置子网掩码
NETMASK=255.255.255.0
#设置DNS地址
DNS1=192.168.1.1
其中大部分配置为原有,#开头的是注释掉原来的配置,修改的配置有BOOTPROTO,ONBOOT
添加的有IPADDR,GATEWAY,NETMASK,DNS1
保存后重启网卡
[root@master /]
用ifconfig 或ip addr命令查看网络,检查配置的网卡是否生效,如果没有请重新配置ip
- 通过ping命令检查看虚拟机是否可以连网
ping www.baidu.com
[root@hrmw-web-api ~]
PING www.a.shifen.com (110.242.68.4) 56(84) bytes of data.
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=1 ttl=54 time=18.3 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=2 ttl=54 time=16.2 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=3 ttl=54 time=17.2 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=4 ttl=54 time=16.2 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=5 ttl=54 time=16.5 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=6 ttl=54 time=17.9 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=7 ttl=54 time=18.1 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=8 ttl=54 time=28.5 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=9 ttl=54 time=19.0 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=10 ttl=54 time=16.4 ms
^Z
[1]+ 已停止 ping www.baidu.com
如果结果如下:则表示网卡正常
[root@master /]# ping www.baidu.com
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=1 ttl=55 time=14.2 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=2 ttl=55 time=14.6 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=3 ttl=55 time=14.8 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=4 ttl=55 time=13.8 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=5 ttl=55 time=15.1 ms
^C
--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 13.814/14.551/15.116/0.465 ms
(这时已经可以用xshell等ssh工具连接虚拟机了,不用再在vmwarn中操作(太麻烦))
3.安装net-tools,方便使用ifconfig查询网络信息,也可以不安装,用ip addr命令查看
安装net-tools
yum -y install net-tools
(3)修改虚拟机host文件
安装vim命令:
yum -y install vim
[root@master /]#vim /etc/hosts
修改内容:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.227 master hadoop1
192.168.1.228 slave1 hadoop2
192.168.1.229 slave2 hadoop3
其中 master 对应本机ip, hadoop1为本机hostname
其它两个ip为其它两个slave节点的ip
让修改生效
[root@master /]#source /etc/hosts
- 关闭防火墙
临时关闭
[root@master /]#systemctl stop firewalld
禁止开机启动
[root@master /]# systemctl disable firewalld
这里关闭防火墙并禁止开机启动(也可心将下面安装步骤中所涉及到的端口开放即可,建议先关闭,安装测试完成后再考虑开放端口,开启防火墙)
- 安装或升级glibc
注意:hadoop依赖glibc-2.14以上版本,在格式化之前先安装glibc用下面命令即可
yum -y install glibc
🐇4.下载并安装jdk1.8.181
去oracle官网下载最新的jdk版本,我用的是jdk-8u181-linux-x64.tar.gz 下载完成后,使用xftp或其它ftp工具将文件上传到虚拟机的任意一个目录(我放在的/root目录下) 通过tar命令解压 cd 到jdk-8u181-linux-x64.tar.gz文件所在目录
软件的下载也可以,通过安装wget命令,通过wget下载(这样可以省去ftp上传,但是要在网卡找对下载地址,我用的本地下载ftp上传) 安装wget可以用yum就行:
yum -y install wget
[root@master /]#cd /root 解压到/usr/local(这个是linux默认安装软件的目录,也可以装到其它地方,只要配置环境变量的时候,设置为对应的目录即可) [root@master /]#tar -xzvf jdk-8u181-linux-x64.tar.gz -C /usr/local 解压后的jdk目录为/usr/local/jdk1.8.0_181 这里我用mv命令把jdk1.8.0_181改为jdk8,也可以不修改 [root@master /]#mv /usr/local/jdk1.8.0_181 /usr/local/jdk8 设置jdk的环境变量,修改/etc/profile文件(这个是所有用启都可用的配置文件,也可以在用户根目录的.bash_profile中设置,这样的话只对用户本身有效) [root@master /]#vim /etc/profile 在文件的最后添加如下配置:
export JAVA_HOME=/usr/local/jdk8
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
这里要在path中把jdk的配置到最前,因为系统默认是openJdk,如果放后面的话不会生效 修改完后让配置生效,执行:
[root@master /]
检查jdk是否安装正确:
[root@master /]
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
如上所示则jdk安装完成
🐉5. 创建hadoop用户,并设置sudo(以下也可以用root用户,这里我新建了个hadoop用户来安装)
[root@master /]#useradd hadoop 设置hadoop用户密码 [root@master /]#passwd hadoop 设置sudo(让hadoop用户可以用sudo命令来修改一些系统配置,省去了用su来回切换用户的麻烦) [root@master /]#vim /etc/sudoers 增加一条类似root用户的配置: root ALL=(ALL) ALL hadoop ALL=(ALL) ALL [root@master /]#source /etc/sudoers 上面这条执行如果有错误,可以不用理会 配置完hadoop用户就可以使用sudo命令了
以下安装基本都用hadoop用户了,安装软件的步骤每个机器上基本相同,所以装好之后克隆虚拟机就可以,然后稍改下配置即可
🐍6.安装zookeeper集群
(1)在网上下载zookeeper,我这里下载了zookeeper-3.4.13.tar.gz其它的版本也可以 将安装包上传到hadoop用户根目录 在hadoop用户根目录下新建app目录(我把软件装在app目录下,也可以是其它目录,其它目录要给zookeepr用户赋权限) [hadoop@master ~]
m
k
d
i
r
/
h
o
m
e
/
h
a
d
o
o
p
/
a
p
p
解
压
z
o
o
k
e
e
p
e
r
安
装
包
到
a
p
p
目
录
下
[
h
a
d
o
o
p
@
m
a
s
t
e
r
?
]
mkdir /home/hadoop/app 解压zookeeper安装包到app目录下 [hadoop@master ~]
mkdir/home/hadoop/app解压zookeeper安装包到app目录下[hadoop@master?]tar -xzvf zookeeper-3.4.13.tar.gz -C /home/hadoop/app 解压之后的目录为/home/hadoop/app/zookeeper-3.4.13 这里我改为了/home/hadoop/app/zookeeper [hadoop@master ~]
m
v
/
h
o
m
e
/
h
a
d
o
o
p
/
a
p
p
/
z
o
o
k
e
e
p
e
r
?
3.4.13
/
h
o
m
e
/
h
a
d
o
o
p
/
a
p
p
/
z
o
o
k
e
e
p
e
r
(
2
)
配
置
z
o
o
k
e
e
p
e
r
集
群
进
入
z
o
o
k
e
e
p
e
r
的
c
o
n
f
目
录
[
h
a
d
o
o
p
@
m
a
s
t
e
r
?
]
mv /home/hadoop/app/zookeeper-3.4.13 /home/hadoop/app/zookeeper (2)配置zookeeper集群 进入zookeeper的conf目录 [hadoop@master ~]
mv/home/hadoop/app/zookeeper?3.4.13/home/hadoop/app/zookeeper(2)配置zookeeper集群进入zookeeper的conf目录[hadoop@master?]cd /home/hadoop/app/zookeeper/conf 将zoo_sample.cfg配置文件拷贝一份改名为zoo.cfg [hadoop@master ~]
c
p
z
o
o
s
a
m
p
l
e
.
c
f
g
z
o
o
.
c
f
g
修
改
z
o
o
.
c
f
g
[
h
a
d
o
o
p
@
m
a
s
t
e
r
?
]
cp zoo_sample.cfg zoo.cfg 修改zoo.cfg [hadoop@master ~]
cpzoos?ample.cfgzoo.cfg修改zoo.cfg[hadoop@master?]vim zoo.cfg 增加如下配置: #zookeeper的data文件存放目录 dataDir=/home/hadoop/app/zookeeper/data #zookeeper的日志文件目录 dataLogDir=/home/hadoop/app/zookeeper/datalog # the port at which the clients will connect #zookeeper的端口(我这里用默认) clientPort=2181 #集群配置 server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888 注意:dataDir是原有的只要修改下目录即可,这个目录可以随意,没有的话可以mkdir去建,cilentPort也是原有的不用动; 集群配置中的server.1,server.2,server.3这个是集群的id,随后建myid文件用的id;
master,slave1,slave2是在/etc/hosts中配置的安装集群的服务器地址,也可以用IP,后面的端口都是用默认的
(3)创建zookeeper的data和log存放目录 [hadoop@master ~]
m
k
d
i
r
?
p
/
h
o
m
e
/
h
a
d
o
o
p
/
a
p
p
/
z
o
o
k
e
e
p
e
r
/
d
a
t
a
[
h
a
d
o
o
p
@
m
a
s
t
e
r
?
]
mkdir -p /home/hadoop/app/zookeeper/data [hadoop@master ~]
mkdir?p/home/hadoop/app/zookeeper/data[hadoop@master?]mkdir -p /home/hadoop/app/zookeeper/datalog 要和zoo.cfg中配置的一致 (4)创建myid文件 进入上一步建的data目录,并创建myid文件 [hadoop@master ~]
c
d
/
h
o
m
e
/
h
a
d
o
o
p
/
a
p
p
/
z
o
o
k
e
e
p
e
r
/
d
a
t
a
[
h
a
d
o
o
p
@
m
a
s
t
e
r
?
]
cd /home/hadoop/app/zookeeper/data [hadoop@master ~]
cd/home/hadoop/app/zookeeper/data[hadoop@master?]vim myid myid文件中的内容对应,zoo.cfg中集群配置中的server.后面的数字,例如master机器上配置1,slave1上配置2,slave3上配置3 [hadoop@master data]$ vim myid
1
~
注意:myid文件原来是不存在的,通过vim命令编辑保存后,会新建的
另外的机器安装相同,克隆虚拟机后修改myid文件就好
(5)设置zookeeper的环境变量,方便启动(也可以不设置,每次启动都要到zookeeper安装目录的bin下启动)
[hadoop@master ~]$sudo vim /etc/profile
说明:第一次用sudo可能要输入root用户密码
在/etc/profile后面添加
export JAVA_HOME=/usr/local/jdk8
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export ZOOKEEPER_HOME=/home/hadoop/app/zookeeper
export PATH=$JAVA_HOME/bin:$PATH:$ZOOKEEPER_HOME/bin
(6)配置完成后就可以启动zookeeper了
按照以上配置就没问题,这里就不启动了,还要安装hadoop
zookeeper的启动命令:
zkServer.sh start 启动
zkServer.sh stop 关闭
zkServer.sh restart 重启
🐎7.安装hadoop3.2.1并配置
(1)hadoop这里用3.2.1的版本
去官网下载hadoop-3.2.1.tar.gz包,通过ftp上传到hadoop根目录 解压到app目录 [hadoop@master ~]
t
a
r
?
x
z
v
f
h
a
d
o
o
p
?
3.2.1.
t
a
r
.
g
z
?
C
a
p
p
/
解
压
后
目
录
/
h
o
m
e
/
h
a
d
o
o
p
/
a
p
p
/
h
a
d
o
o
p
?
3.2.1
这
里
我
把
目
录
修
改
为
h
a
d
o
o
p
3
[
h
a
d
o
o
p
@
m
a
s
t
e
r
?
]
tar -xzvf hadoop-3.2.1.tar.gz -C app/ 解压后目录/home/hadoop/app/hadoop-3.2.1 这里我把目录修改为hadoop3 [hadoop@master ~]
tar?xzvfhadoop?3.2.1.tar.gz?Capp/解压后目录/home/hadoop/app/hadoop?3.2.1这里我把目录修改为hadoop3[hadoop@master?] mv /home/hadoop/app/hadoop-3.2.1 /home/hadoop/app/hadoop3 (2)配置环境变量,方便启动,执行hdfs命令 [hadoop@master ~]$ sudo vim /etc/profile 在最后添加: export JAVA_HOME=/usr/local/jdk8 export CLASSPATH=.:
J
A
V
A
H
O
M
E
/
l
i
b
/
d
t
.
j
a
r
:
JAVA_HOME/lib/dt.jar:
JAVAH?OME/lib/dt.jar:JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/home/hadoop/app/hadoop3
export ZOOKEEPER_HOME=/home/hadoop/app/zookeeper
export PATH=$JAVA_HOME/bin:$PATH:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
这里path中要添加hadoop的bin和sbin两个目录
(3)hadoop配置文件配置(hadoop的配置文件在安装目录下的etc/hadoop下)
1.修改workers,配置服务器列节点表
[hadoop@hadoop1 app]$ cd /home/hadoop/app/hadoop3/etc/hadoop/
[hadoop@master hadoop]$ vim workers
内容如下:
master
slave1
slave2
注意:这个是在/etc/hosts中配置的三台集群服务器节点
2.配置hadoop-env.sh
[hadoop@master hadoop]$ vim hadoop-env.sh
添加JAVA_HOME和HADOOP_HOME 防止找到不jdk和hadoop
export JAVA_HOME=/usr/local/jdk8
export HADOOP_HOME=/home/hadoop/app/hadoop3
3.配置mapred-env.sh
[hadoop@master hadoop]$ vim mapred-env.sh
添加JAVA_HOME和HADOOP_HOME 防止找到不jdk和hadoop
export JAVA_HOME=/usr/local/jdk8
export HADOOP_HOME=/home/hadoop/app/hadoop3
4.配置yarn-env.sh
[hadoop@master hadoop]$ vim yarn-env.sh
添加JAVA_HOME和HADOOP_HOME 防止找到不jdk和hadoop
export JAVA_HOME=/usr/local/jdk8
export HADOOP_HOME=/home/hadoop/app/hadoop3
注意:下面步骤的配置文件如果在home/hadoop/app/hadoop3/etc/hadoop下没有时,将该目录下相应的 ***-**.xml.example文件拷贝一份改名即可
5.配置core-site.xml
[hadoop@master hadoop]$ vim core-site.xml
内容如下:
<configuration>
<!--默认是namenode,datanode,journalNode等存放数据的公共目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/app/hadoop3/hdfs/tmp</value>
</property>
<!--流文件的缓冲区大小128k 默认4096 4k-->
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<--默认的hdfs路径,当有多个HDFS集群同时工作时,的hdfs集群路径,其中mycluster的值来源于hdfs-size.xml中的配置-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!--zookeeper集群的地址和端口,注意数量一定是可数个,最少三个-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
</configuration>
[hadoop@master hadoop]$ mkdir -p /home/hadoop/app/hadoop3/hdfs/tmp
6.配置hdfs-site.xml
[hadoop@master hadoop]$ vim hdfs-site.xml
内容如下:
<configuration>
<!--定义集群名称-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--指定datanode存储数据复制的块数量,这里集群有3台机器,一共3份,两个是备份,默认是3个-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--指定namenode存放数据的目录-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/app/hadoop3/hdfs/name</value>
<final>true</final>
</property>
<!--指定datanode存放数据的目录-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/app/hadoop3/hdfs/data</value>
<final>true</final>
</property>
<!--文件操作是否检查权限,一般设置为false,设置为true时,有时候访问会出现权限问题-->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!--指定mycluster集群的namenode机器有哪些,这里我的3个机器都可以作为namenode,名字随意不重复即可-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>master,slave1,slave2</value>
</property>
<!--指定master,namenode的rpc访问地址-->
<property>
<name>dfs.namenode.rpc-address.mycluster.master</name>
<value>master:9820</value>
</property>
<!--指定slave1,namenode的rpc访问地址-->
<property>
<name>dfs.namenode.rpc-address.mycluster.slave1</name>
<value>slave1:9820</value>
</property>
<!--指定slave2,namenode的rpc访问地址-->
<property>
<name>dfs.namenode.rpc-address.mycluster.slave2</name>
<value>slave2:9820</value>
</property>
<!--指定master,namenode的http访问地址-->
<property>
<name>dfs.namenode.http-address.mycluster.master</name>
<value>master:9870</value>
</property>
<!--指定slave1,namenode的http访问地址-->
<property>
<name>dfs.namenode.http-address.mycluster.slave1</name>
<value>slave1:9870</value>
</property>
<!--指定slave2,namenode的http访问地址-->
<property>
<name>dfs.namenode.http-address.mycluster.slave2</name>
<value>slave2:9870</value>
</property>
<!--指定namenode共享edits文件目录时,使用的journalNode集群信息-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property>
<!--指定journalNode集群在对namenode的目录共享时,自己存放数据的目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/app/hadoop3/data/journaldata/jn</value>
</property>
<!--指定集群出故障时,哪个实现类执行故障切换-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--一旦需要namenode切换,使用ssh的方式进行操作-->
<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>
<!--设置ssh连接超时时间-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10000</value>
</property>
<!--设置ssh重连次数限制-->
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<!--指定是否启动自动故障恢复,即当namenode出故障时,是否自动切换另一个-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
注意:为了省事,这里先配置一台的,其中ssh密钥地址,后面两台虚拟机建好时会配置ssh免密登陆,会产生密钥
[hadoop@master hadoop]$ mkdir -p /home/hadoop/app/hadoop3/hdfs/name
[hadoop@master hadoop]$ mkdir -p /home/hadoop/app/hadoop3/hdfs/data
[hadoop@master hadoop]$ mkdir -p /home/hadoop/app/hadoop3/data/journaldata/jn
[hadoop@master hadoop]$ mkdir -p /home/hadoop/app/hadoop3/logs
7.配置mapred-site.xml
[hadoop@master hadoop]$ vim mapred-site.xml
内容如下:
<configuration>
<!--指定资源管理,这里用hadoop的yarn来管理-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--设置mapreduce的环境变量-->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/home/hadoop/app/hadoop3</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/home/hadoop/app/hadoop3</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/home/hadoop/app/hadoop3</value>
</property>
</configuration>
8.配置yarn-site.xml
[hadoop@master hadoop]$ vim yarn-site.xml
内容如下:
<configuration>
<!--指定resourcmanager重连间隔时间-->
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>2000</value>
</property>
<!--指定RM HA高可用激活-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--故障切换激活;默认的,在HA激活下可用。-->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--当自动故障切换可用时,使用内嵌的选举器来选择活跃RM。默认的,在HA激活下可用。-->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
<value>true</value>
</property>
<!--定义集群的ID。被选举器使用确保RM不会在其他集群中接管称为活跃RM-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-rm-cluster</value>
</property>
<!--指定RMs的逻辑ID列表-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!--指定rm1的主机地址-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
</property>
<!--指定rm2的主机地址-->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave1</value>
</property>
<!--指定是否覆盖-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!---->
<property>
<description>The class to use as the persistent store.</description>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!--配置zookeeper集群地址,如果是hadoop3.1以上版本,name属性改为hadoop.zk-address-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!--指定rm1的配置地址-->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>master:8032</value>
</property>
<!--指定rm1的调度地址-->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>master:8034</value>
</property>
<!--指定rm1的web地址-->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>master:8088</value>
</property>
<!--指定rm2的配置地址-->
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>slave1:8032</value>
</property>
<!--指定rm2的调度地址-->
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>slave1:8034</value>
</property>
<!--指定rm2的web地址-->
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>slave1:8088</value>
</property>
<!--指定nodemanager的服务,用逗号隔开,不能以数字开头 默认mapreduce_shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- Map reduce 配置 shuffle-->
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!--指定不进行container的大小限制检查-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
<description>Whether virtual memory limits will be enforced for containers.</description>
</property>
</configuration>
以上集群的主节点服务器就已经配置完成
🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
🐐8.部署剩余两台从节点虚拟机
最简单的办法:1.以上面安装的虚拟机为基础克隆出两个虚拟机 2.然后修改网卡和主机名称 第2台虚拟机 [root@hadoop2 ~]# hostnamectl set-hostname hadoop2
[root@hadoop2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
#BOOTPROTO=dhcp
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=53334ffe-be25-46ee-b974-b17d3c55c313
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.1.228
GATEWAY=192.168.1.1
NETMASK=255.255.255.0
DNS1=192.168.1.1
[root@hadoop2 ~]# service network restart
第3台同上,主机名改为hadoop3
ip地址改为192.168.1.229
3.修改zookeeper的myid文件改为与ip相对应的即可
修改网卡和zookeeper的myid详见上面步骤
第2台(hadoop2)
[hadoop@hadoop2 ~]# cd /home/hadoop/app/zookeeper/data
[hadoop@hadoop2 data]# vim myid
2
第3台(hadoop3)
[hadoop@hadoop3 ~]# cd /home/hadoop/app/zookeeper/data
[hadoop@hadoop3 data]# vim myid
3
最麻烦的办法:按照以上步骤再装两台虚拟机 🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
🐒9.设置集群的3台虚拟机hadoop用户的ssh免密登陆
-
以hadoop的用户登陆虚拟机 3台机器都要生成 执行ssh-keygen命令创建ssh密钥 [hadoop@master ~]$ ssh-keygen -t rsa 出现输入和选择统一回车,取默认值就可以 会在hadoop的根目录/home/hadoop/ 下生成一个.ssh的文件夹.ssh文件是隐藏文件可以用ls -a命令来查看 [hadoop@master ~]$ cd .ssh/ [hadoop@master .ssh]$ ls 会看到如下文件: id_rsa id_rsa.pub known_hosts 其中id_rsa是私钥(注意:私钥文件就是在hdfs-site.xml中配置的密钥地址),id_rsa.pub是公钥 -
将上一步中的公钥分别放到集群中的三台服务器 (1)方法1: [hadoop@master .ssh]
s
s
h
?
c
o
p
y
?
i
d
?
i
?
/
.
s
s
h
/
i
d
r
s
a
.
p
u
b
h
a
d
o
o
p
@
m
a
s
t
e
r
其
中
?
/
.
s
s
h
/
i
d
r
s
a
.
p
u
b
是
公
钥
文
件
的
路
径
,
也
可
写
绝
对
路
径
h
a
d
o
o
p
@
m
a
s
t
e
r
中
h
a
d
o
o
p
是
l
i
n
u
x
用
户
名
,
m
a
s
t
e
r
为
服
务
器
地
址
(
因
为
之
前
在
/
e
t
c
/
h
o
s
t
s
文
件
中
配
置
过
地
址
映
射
,
所
有
写
了
m
a
s
t
e
r
)
也
可
以
改
为
i
p
地
址
执
行
完
上
面
的
命
令
后
会
在
m
a
s
t
e
r
服
务
器
h
a
d
o
o
p
用
户
根
目
录
下
的
.
s
s
h
文
件
夹
下
生
成
一
个
a
u
t
h
o
r
i
z
e
d
k
e
y
s
文
件
记
录
公
钥
信
息
同
时
执
行
以
下
两
条
命
令
,
将
本
机
公
钥
也
放
到
其
它
两
台
虚
拟
机
上
[
h
a
d
o
o
p
@
m
a
s
t
e
r
.
s
s
h
]
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@master 其中 ~/.ssh/id_rsa.pub是公钥文件的路径, 也可写绝对路径 hadoop@master中hadoop是linux用户名,master为服务器地址(因为之前在/etc/hosts文件中配置过地址映射,所有写了master)也可以改为ip地址 执行完上面的命令后会在master服务器hadoop用户根目录下的.ssh文件夹下生成一个authorized_keys文件记录公钥信息 同时执行以下两条命令,将本机公钥也放到其它两台虚拟机上 [hadoop@master .ssh]
ssh?copy?id?i?/.ssh/idr?sa.pubhadoop@master其中?/.ssh/idr?sa.pub是公钥文件的路径,也可写绝对路径hadoop@master中hadoop是linux用户名,master为服务器地址(因为之前在/etc/hosts文件中配置过地址映射,所有写了master)也可以改为ip地址执行完上面的命令后会在master服务器hadoop用户根目录下的.ssh文件夹下生成一个authorizedk?eys文件记录公钥信息同时执行以下两条命令,将本机公钥也放到其它两台虚拟机上[hadoop@master.ssh]ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@slave1 [hadoop@master .ssh]$ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@slave2 (2)方法2: 执行以下命令将公钥放下authorized_keys文件中 [hadoop@master .ssh]cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 别两个服务器 可以用scp 将id_rsa.pub文件复制到其它两台服务器上,然后用cat id_rsa.pub >>~/.ssh/authorized_keys 放入文件中 -
在其它两台虚拟机上重复1,2步骤 也可心把三台机器的id_rsa.pub 都放入1台机器的authorized_keys,然后把authorized_keys拷贝到其它两个虚拟机相应目录即可 完成之后测试下3台机器间ssh免密是否配置成功 注意:其中第2步用(2)种方法时第一次用ssh会出现确认选择,第(1)种不用
🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
🐓10.启动测试
三台虚拟机都安装完成后,分别为hadoop用户连接三台虚拟机 注意:测试前要保证虚拟机的防火墙是关闭状态(或者程序用到的端口是开放状态,建议关闭防火墙) (1)启动zookeeper集群 分别以hadoop用户在三台服务器上 执行:zkServer.sh start启动zookeeper 也可以编写脚本来同时启动3台linux上的zookeeper 测试zookeeper 分别在3台机器上执行 zkServer.sh status 如果出现两个follower和一个leader,说明zookeeper集群安装正常,否则检查配置,主要是myid文件 (2)分别在3台虚拟机上执行以下命令启动journalnode hdfs --daemon start journalnode 启动后用jps查看进程 (3)格式化namenode 在master虚拟机上执行以下命令 [hadoop@master ~]
h
d
f
s
n
a
m
e
n
o
d
e
?
f
o
r
m
a
t
(
4
)
格
式
化
高
可
用
[
h
a
d
o
o
p
@
m
a
s
t
e
r
?
]
hdfs namenode -format (4)格式化高可用 [hadoop@master ~]
hdfsnamenode?format(4)格式化高可用[hadoop@master?]hdfs zkfc -formatZK (5)启动dfs [hadoop@master ~]$start-dfs.sh (6)在slave1和slave2上启动namenode的备份 [hadoop@slave1 ~]hdfs namenode -bootstrapStandby [hadoop@slave2 ~]hdfs namenode -bootstrapStandby (7)在浏览器中测试namenode(可跳过) 地址: http://master:9870 http://slave1:9870 http://slave2:9870 其中master,slave1,slave2对应集群三台虚拟机的ip (8)测试hdfs文件上传 新建一个words.txt文件
[hadoop@master ~]# vim words.txt
hadoop
hadoop
hadoop
hello
java
hive
hive
world
spark
hello
hi
word
在hdfs上创建一个test目录
[hadoop@master ~]#hdfs dfs -mkdir /test
查看目录是否创建成功
[hadoop@master ~]#hdfs dfs -ls /
将words.txt上传到test目录下
[hadoop@master ~]#hdfs dfs -put words.txt /test
查看test目录,文件是否上传成功
[hadoop@master ~]#hdfs dfs -ls /test
查询hdfs上words.txt的内容
[hadoop@master ~]#hdfs dfs -cat /test/words.txt
(9)启动yarn
在master和slave1上分别启动resourcemanager执行命令如下:
yarn --daemon start resourcemanager
在3台虚拟机上分别启动nodemanager执行命令如下:
yarn --daemon start nodemanager
(10)可以通过web查看yarn(可以省去)
地址:
http://master:8088
http://slave1:8088
其中master、slave1对应master和salve1的ip(只有一个地址是可访问的)
可以通过命令查看resourcemanager状态
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
(11)测试运行WordCount
hadoop jar /home/hadoop/app/hadoop3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar wordcount /test/words.txt /test/output
运行成功后用
hdfs dfs -ls /test/output
会看到
-rw-r--r-- 3 hadoop supergroup 0 2018-09-01 06:47 /test/output/_SUCCESS
-rw-r--r-- 3 hadoop supergroup 52 2018-09-01 06:47 /test/output/part-r-00000
可以查看part-r-00000来查看wordcount的结果
hdfs dfs -cat /test/output/part-r-00000
如果执行时出现visual memory的错误,可以看下虚拟机的内存,我设置的是2G的
🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
🐕11.hadoop的启动与停止
启动
start-all.sh
停止
stop-all.sh
也可用单独的脚本启动
💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰💰
🌈后记
如果本文章有何错误,请您评论中指出,或联系我,我会改正,如果您觉得这篇文章有用,请帮忙一键三连,让更多的人看见,谢谢 作者 yang_z_1 csdn博客地址: https://blog.csdn.net/yang_z_1?type=blog
|