Java大数据开发入门系列(一)————环境搭建

环境

  • MacOS10.15

  • Parallels Desktop16创建搭建的centos8 虚拟机

  • 集群环境:

    IP地址 主机名 操作系统 角色 服务
    10.211.55.8/24 master Centos8 master HDFS(NameNode)、DFSZKFailoverController(zkfc)、SYNC(同步文件服务器)、ResourceManager(资源分配与调度)
    10.211.55.9/24 slave1 Centos8 slave1 Zookeeper、HDFS(SecondaryNamenode)、MapReduce(JobHistoryServer)、NodeManager
    10.211.55.10/24 slave2 Centos8 Slave2 Zookeeper、HDFS(DataNode)、NodeManager
    10.211.55.11/24 slave3 Centos8 Slave3 Zookeeper、HDFS(DataNode)、NodeManager

开始搭建

防火墙和SELINUX设置

因为Hadoop需要开启的端口很多,而且牵涉到很多的权限,所以我们在测试时将防火墙和SELINUX都关掉。
在生产环境中,需要针对不同的开放端口做针对性的设置。

关闭防火墙

运行以下命令,关闭防火墙

1
2
3
# 临时关闭防火墙 和 禁止开机启动防火墙
systemctl stop firewalld && systemctl disable firewalld
systemctl status firewalld #查看防火墙状态。

关闭SELINUX

运行以下命令:

1
vi /etc/selinux/config         #SELINUX配置文件

相关参数修改如下:

1
2
#SELINUX=enforcing
SELINUX=disabled

重启服务器,然后查看SELINUX状态:

1
2
3
reboot       #重启
getenforce #查询SELinux的运行模式,permissive(宽容模式);enforcing(强制模式);
/usr/sbin/sestatus -v #查看SELINUX的状态

显示如下内容,则说明SELINUX已经关闭了

1
SELinux status:                 disabled

修改主机名

以master(10.211.55.8)节点为例,运行下面的命令,修改本机的hostname

1
2
#修改hostname
hostnamectl set-hostname master

运行下面的命令查看设置好的hostname

1
cat /etc/hostname

如果显示如下的内容,则说明修改成功

1
master

其他节点(10.211.55.9~11)同样进行以上操作,修改主机名。

hosts设置

由于一次次的远程连接需要输入IP地址,不利于管理和使用,我们可以在hosts里面把服务器的hostname跟IP地址对应起来。

在master(10.211.55.8)输入以下命令

1
vi /etc/hosts

设置成以下内容

1
2
3
4
5
6
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.211.55.8 master
10.211.55.9 slave1
10.211.55.10 slave2
10.211.55.11 slave3

其他节点(10.211.55.9~11)同样进行以上操作,修改hosts。

添加Hadoop用户

1
useradd hadoop && passwd hadoop

命令输入完毕后设置用户密码就行

可为 hadoop 用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题,执行:

1
visudo

Shell 命令

如下图,找到 root ALL=(ALL) ALL 这行(应该在第98行,可以先按一下键盘上的 ESC 键,然后输入 :98 (按一下冒号,接着输入98,再按回车键),可以直接跳到第98行 ),然后在这行下面增加一行内容:

1
hadoop  ALL=(ALL)       ALL

如下图所示:

RhXSSv

切换到hadoop用户

1
2
su hadoop
cd ~

每个节点都执行一次

配置免密登录

在所有的节点上执行以下命令

1
2
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa         #生成验证密钥
cat ~/.ssh/id_rsa.pub|ssh hadoop@master "cat - >> ~/.ssh/authorized_keys" #发送给主服务器

如果需要互相免密码登录,则master执行下面命令,把密钥分发给从服务器

1
2
3
scp ~/.ssh/authorized_keys hadoop@slave1:~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys hadoop@slave2:~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys hadoop@slave3:~/.ssh/authorized_keys

在所有的节点执行以下命令

1
chmod 0600 ~/.ssh/authorized_keys

退出hadoop用户,再重新 su hadoop进入一次即可免密登录了

验证免密登录

oE23jf

安装JDK

创建upload目录

1
mkdir upload

将下载下来的jdk上传到master节点的/home/hadoop/upload下,jdk下载地址

执行以下命令

1
2
3
4
sudo mkdir /usr/java
cd /home/hadoop/upload
tar -zxvf jdk-8u261-linux-x64.tar.gz #解压JDK
sudo sudo mv jdk1.8.0_261/ /usr/java/ #将JDK移动(剪切)到/usr/java/目录

修改全局环境变量

1
sudo vi /etc/profile       #文件底部添加以下内容

在文件底部添加以下内容

1
2
3
# jdk
export JAVA_HOME="/usr/java/jdk1.8.0_261"
export PATH=$JAVA_HOME/bin:$PATH

加载新的全局环境变量

1
source /etc/profile

执行以下命令验证jdk是否安装成功

1
java -version

LZmlJj

将jdk发送到其他节点

1
2
3
4
5
6
7
cd /usr/java

ssh root@slave1 'mkdir -p /usr/java/jdk1.8.0_261' && sudo scp -r /usr/java/jdk1.8.0_261/ root@slave1:$PWD

ssh root@slave2 'mkdir -p /usr/java/jdk1.8.0_261' && sudo scp -r /usr/java/jdk1.8.0_261/ root@slave2:$PWD

ssh root@slave3 'mkdir -p /usr/java/jdk1.8.0_261' && sudo scp -r /usr/java/jdk1.8.0_261/ root@slave3:$PWD

将环境变量发送到其他节点

1
2
3
4
5
sudo scp /etc/profile root@slave1:/etc/profile

sudo scp /etc/profile root@slave2:/etc/profile

sudo scp /etc/profile root@slave3:/etc/profile

在slave1、slave2、slave3上分别执行以下命令,让环境变量生效

1
source /etc/profile

安装Zookeeper

安装并配置Zookeeper

由于Zookeeper类似于民主选举,每台服务器分别投票共同选举一个作为leader,剩下的都是follower。基于这个原因,官方建议服务器集群设置为奇数台,偶数台的话会有一台的资源浪费。根据咱们的集群规划:slave1~3为我们的Zookeeper服务器。

在slave1执行以下命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mkdir /home/hadoop/upload

su root

cd /home/hadoop/upload

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz

tar -zxvf apache-zookeeper-3.6.1-bin.tar.gz

mkdir /home/hadoop/server && mkdir -p /home/hadoop/data/zkdata && mkdir -p /home/hadoop/log/zklog

mv apache-zookeeper-3.6.1-bin/ /home/hadoop/server/

sudo chown -R hadoop:hadoop /home/hadoop/*

修改全局环境变量

1
sudo vi /etc/profile       #文件底部添加以下内容

在文件底部添加以下内容

1
2
3
# zookeeper
export ZOOKEEPER_HOME="/home/hadoop/zookeeper"
export PATH=$ZOOKEEPER_HOME/bin:$PATH

加载新的全局环境变量

1
2
3
source /etc/profile  
# 切换到hadoop用户
su hadoop

将Zookeeper发送到slave2、slave3

1
2
3
4
5
cd /home/hadoop

ssh root@slave2 'mkdir -p /home/hadoop/server && mkdir -p /home/hadoop/data/zkdata && mkdir -p /home/hadoop/log/zklog' && sudo scp -r /home/hadoop/server/ root@slave2:$PWD && sudo scp -r /home/hadoop/data/ root@slave2:$PWD && sudo scp -r /home/hadoop/log/ root@slave2:$PWD

ssh root@slave3 'mkdir -p /home/hadoop/server && mkdir -p /home/hadoop/data/zkdata && mkdir -p /home/hadoop/log/zklog' && sudo scp -r /home/hadoop/server/ root@slave3:$PWD && sudo scp -r /home/hadoop/data/ root@slave3:$PWD && sudo scp -r /home/hadoop/log/ root@slave3:$PWD

将环境变量发送到slave2、slave3

1
sudo scp /etc/profile root@slave2:/etc/profile && sudo scp /etc/profile root@slave3:/etc/profile

在slave2、slave3上分别执行以下命令,让环境变量生效

1
source /etc/profile

使用hadoop执行以下命令

1
2
cd /home/hadoop/server/apache-zookeeper-3.6.1-bin/conf
sudo cp zoo_sample.cfg zoo.cfg

修改zoo.cfg的文件内容

1
vi zoo.cfg
1
2
3
4
5
dataDir=/home/hadoop/data/zkdata
dataLogDir=/home/hadoop/log/zklog/
server.1=slave1:2888:3888
server.2=slave2:2888:3888
server.3=slave3:2888:3888

将zoo.cfg分发到slave2~3

1
sudo scp /home/hadoop/server/apache-zookeeper-3.6.1-bin/conf/zoo.cfg hadoop@slave2:/home/hadoop/server/apache-zookeeper-3.6.1-bin/conf/zoo.cfg && sudo scp /home/hadoop/server/apache-zookeeper-3.6.1-bin/conf/zoo.cfg hadoop@slave3:/home/hadoop/server/apache-zookeeper-3.6.1-bin/conf/zoo.cfg

最后不要忘了在每个服务器“/home/hadoop/data/zkdata/”下新建文件“myid”并把当前服务器编号写进去,举例:

1
2
3
sudo chown -R hadoop:hadoop /home/hadoop/*
# slave1是1,slave2是2,slave3是3
echo 1 > /home/hadoop/data/zkdata/myid

以下内容只能在slave1~3上执行才能看到正确的结果:

1
2
3
zkServer.sh stop    #停止Zookeeper服务
zkServer.sh start #开启Zookeeper服务
zkServer.sh status #开启Zookeeper服务

执行zkServer.sh start正常情况下会看到下面的内容:

PW9TW7

如果启动失败,可以到“/home/hadoop/zookeeper/logs/”这个目录里面看看启动日志。

录入下面的命令:

1
jps

可以看到如下的结果:

FHDioK

注意:虽然我们在配置文件中写明了服务器的列表信息,但是,我们还是需要去每一台服务 器去启动,不是一键启动集群模式。
每启动一台查看一下状态再启动下一台
三台机器上都要有QuorumPeerMain进程,都能显示follower或者leader

安装Hadoop

把下载好的Hadoop安装包上传到master节点的/home/hadoop/upload目录下面。

hadoop下载地址

先通过root账户执行以下操作

1
2
3
4
5
6
su root
mkdir -p cd /home/hadoop/server
cd /home/hadoop/server
tar -zxvf hadoop-3.3.0.tar.gz
mv /home/hadoop/upload/hadoop-3.3.0/ /home/hadoop/server/
chown -R hadoop:hadoop /home/hadoop/*

修改全局环境变量

1
sudo vi /etc/profile       #文件底部添加以下内容

在文件底部添加以下内容

1
2
3
# Hadoop
export HADOOP_HOME="/home/hadoop/server/hadoop-3.3.0"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

加载新的全局环境变量

1
source /etc/profile

输入echo $HADOOP_HOME显示如下则表明成功

6RkiD2

在其他节点同样执行以上添加环境变量的操作

进入master节点,创建相关目录,执行以下命令

1
2
3
4
su hadoop
rm -rf /home/hadoop/server/hadoop-3.3.0/share/doc #删除文档,很大,又没用
mkdir -p /home/hadoop/data/dfs/data && mkdir /home/hadoop/data/dfs/name && mkdir /home/hadoop/data/dfs/tmp && mkdir /home/hadoop/data/journaldata
cd /home/hadoop/server/hadoop-3.3.0/etc/hadoop

修改hadoop-env

1
vi /home/hadoop/server/hadoop-3.3.0/etc/hadoop/hadoop-env.sh

添加一行内容:

1
export JAVA_HOME="/usr/java/jdk1.8.0_261"

修改配置文件core-site.xml

1
vi /home/hadoop/hadoop/etc/hadoop/core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<configuration>
<!-- 指定hdfs的nameservice为master -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/dfs/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>slave1:2181,slave2:2181,slave3:2181</value>
</property>
<!-- hadoop链接zookeeper的超时时长设置 -->
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>1000</value>
<description>ms</description>
</property>
<!-- 修改core-site.xml中的ipc参数,防止出现连接journalnode服务ConnectException -->
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
<description>Indicates the number of retries a client will make to establish a server connection.</description>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>10000</value>
<description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.</description>
</property>
<property>
<name>topology.script.file.name</name>
<value>10000</value>
<description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.</description>
</property>
</configuration>

修改配置文件hdfs-site.xml

1
vi /home/hadoop/hadoop/etc/hadoop/hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<configuration>
<!-- 指定副本数 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 配置namenode和datanode的工作目录-数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/dfs/data</value>
</property>
<!-- 启用webhdfs -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- 配置HDFS的权限控制 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- 配置SecondaryNameNode的节点地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave1:50090</value>
</property>
</configuration>

修改配置文件mapred-site.xml

1
vi /home/hadoop/hadoop/etc/hadoop/mapred-site.xml

全部内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

<!-- 指定mapreduce jobhistory地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>slave1:10020</value>
</property>

<!-- 任务历史服务器的web地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>slave1:19888</value>
</property>
</configuration>

修改配置文件yarn-site.xml

1
vi /home/hadoop/hadoop/etc/hadoop/yarn-site.xml

内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<configuration>
<!-- 以逗号分隔的服务列表,其中服务名称应仅包含a-zA-Z0-9_并且不能以数字开头-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 配置ResourceManager的服务节点 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>

<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>

<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>

修改配置文件workers

1
vi /home/hadoop/hadoop/etc/hadoop/workers

文件中配置的是DataNode的所在节点服务

1
2
slave2
slave3

修改yarn-env

1
vi /home/hadoop/hadoop/etc/hadoop/yarn-env.sh

添加一行内容:

1
export JAVA_HOME="/usr/java/jdk1.8.0_261"

修改mapred-env

1
vi /home/hadoop/hadoop/etc/hadoop/mapred-env.sh

添加一行内容:

1
export JAVA_HOME="/usr/java/jdk1.8.0_261"

将hadoop安装包分发到其他集群节点

1
2
3
4
5
cd /home/hadoop/server
scp -r /home/hadoop/server/hadoop-3.3.0/ hadoop@slave1:$PWD && scp -r /home/hadoop/server/hadoop-3.3.0/ hadoop@slave2:$PWD && scp -r /home/hadoop/server/hadoop-3.3.0/ hadoop@slave3:$PWD

cd /home/hadoop/data
scp -r /home/hadoop/data/dfs/ hadoop@slave1:$PWD && scp -r /home/hadoop/data/journaldata hadoop@slave1:$PWD && scp -r /home/hadoop/data/dfs/ hadoop@slave2:$PWD && scp -r /home/hadoop/data/journaldata hadoop@slave2:$PWD && scp -r /home/hadoop/data/dfs/ hadoop@slave3:$PWD && scp -r /home/hadoop/data/journaldata hadoop@slave3:$PWD

格式化HDFS

在master节点中格式化HDFS(只在master节点,即NameNode执行),执行以下命令

1
hdfs namenode -format

格式化zkfc

在master节点中格式化HDFS(只在master节点,即NameNode执行),执行以下命令

1
hdfs zkfc -formatZK

启动Hadoop集群

日常启动hadoop

Hadoop启动顺序:Zookeeper->Hadoop->Hbase>Hive…

停止所有服务

1
2
3
stop-all.sh                            #最好在master(NameNode)上执行
mapred --daemon stop historyserver #master上执行
zkServer.sh stop #slave1~3上操作

启动ZooKeeper

在slave1~3上分别执行以下命令:

1
2
3
zkServer.sh stop
zkServer.sh start
jps

显示如下内容,则启动成功

0VF4xe

启动HDFS

其中一台机器执行就OK了,比如:master

1
2
stop-dfs.sh    #先停掉服务
start-dfs.sh #如果出现错误,则在hadoop-env.sh中,再显示地重新声明一遍JAVA_HOME

显示内容如下:

fjyyxM

执行命令查看:

1
jps

master上显示如下:

2yw9A8

Slaver1~3显示如下:

FYF63v

pRRr0o

启动YARN

在master进行启动:

1
2
stop-yarn.sh
start-yarn.sh

显示内容如下:

y1tDm5

执行命令查看:

1
jps

显示如下:

vwyzNP

若备用节点的 resourcemanager 没有启动起来,则手动启动起来

1
yarn-daemon.sh start resourcemanager

启动 mapreduce 任务历史服务器

在slave1上执行如下命令:

1
2
mapred --daemon stop historyserver
mapred --daemon start historyserver

执行命令查看:

1
jps

显示如下:

JfbHLC

WEB控制台

hdfs控制台

http://10.211.55.8:9870/dfshealth.html#tab-overview

![image-20200830213217841](/Users/roger/Library/Application Support/typora-user-images/image-20200830213217841.png)

yarn控制台

http://10.211.55.8:8088/cluster

nq8zHG