- 保姆级入门教程:图片讲解 + 各种问题解决方案
- 集群服务器:hadoop102、hadoop103和hadoop104
- 虚拟机版本:CentOS7-1804
- 资源分享处(文章最后)提供CentOS7和Hadoop各组件压缩包(也可以自行下载,要注意版本兼容的问题),有需要自取~
1, 模板虚拟机准备
2, 克隆三台虚拟机,作为完全分布式集群
3, Hadoop完全分布式环境搭建
4, ZooKeeper & HBase & Maven & IDEA安装
注:下方未出现的步骤,选择默认选项即可
(此虚拟机只为演示Hadoop完全分布式环境搭建过程所用,4G内存基本够用)
硬盘50G
(安装内容包含JDK、Hadoop、ZooKeeper、HBase、Maven和IDEA,50G够用)
选择稍后安装的要在这一步选择自定义硬件,添加ISO映像文件
(在操作体验上,与选择英语差别不大,建议英语不太好的童靴选择中文)
进入安装信息摘要界面
选择自动配置分区即可
(若想要手动分区,则点击 我要配置分区 - 完成,就会出现手动分区的界面)
12.1 选择配置
DHCP设置 - 查看IP地址范围
回到配置界面 - 选择IPv4配置 - 点击 Add
出现DNS1:检查网关地址是否正确
无法连接网络:检查IP地址是否在起始和终止的IP地址范围之内
将出现以下界面:
建议密码不要太复杂
- 创建一个普通用户,名称可自定义(我创建的用户名称是hadoop,之后用此名称指代普通用户)
- 目的: 在搭建项目的过程中,所有的项目有关的操作都由普通用户来执行,以此与超级用户(root用户)作区别,来维护系统的安全性(防止一些涉及到系统内核的操作被执行)。
- 建议密码不要太复杂
Q: 为什么使用静态IP地址?
A: 在使用虚拟机的时候,默认情况下使用的DHCP协议分配的动态IP地址,使得每次打开虚拟机后当前的IP地址都会发生变化,这样不方便管理。为了能够给当前虚拟机设置一个静态IP地址,方便后期使用XShell连接工具进行连接,以及配置各种服务。所以,我们需要为虚拟机设置一个静态IP地址。
1.1 打开终端,查看网卡名称 - 我的网卡名称为ens33,如下图所示
[root@bogon ~]$ ip addr
[root@bogon ~]$ vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO='dhcp' -> 'static'
ONBOOT='no' -> 'yes'
IPADDR='要设置的IP地址'
PREFIX='子网掩码'
GATEWAY='网关IP'
DNS1='网关IP'
1.3 重启网络
[root@bogon ~]$ service network restart
- 设置主机名很重要,我设置的模板机的主机名为hadoop100,之后集群服务器中的主机名为hadoop102、hadoop103和hadoop104
- 下面的命令按自己的主机名来
[root@bogon ~]$ hostnamectl set-hostname 主机名
例如:hostnamectl set-hostname hadoop100
2.1 查看hostname
[root@bogon ~]$ cat /etc/hostname
hadoop100
2.2 编辑hosts文件
目的: 修改/etc/hosts 文件,该文件主要用于映射 IP 地址和域名之间的连接
[root@bogon ~]$ vi /etc/hosts
IP地址 主机名
例如:
我设置的IP地址为xxx.xxx.xxx.130,那么我要添加的内容就是
xxx.xxx.xxx.130 hadoop100
# 执行su命令
[root@bogon ~]$ su
[root@localhost ~]$
# hadoop 普通用户
[root@localhost ~]$ su hadoop
# 第一次配置免密登录,执行下面这个命令后点三次回车即可
[hadoop@localhost root]$ ssh-keygen
[hadoop@localhost root]$ ssh-copy-id localhost
[hadoop@localhost root]$ ssh localhost
Last login: Web Feb 8 21:43:26 2023
[hadoop@localhost ~]$
[root@localhost ~]$ yum install -y epel-release
...
已安装:
epel-release.noarch 0:7-11
完毕!
[root@localhost ~]$ yum install -y net-tools
[root@localhost ~]$ yum install -y vim
CentOS7下报错14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误”-解决方法
[root@localhost ~]$ systemctl stop firewalld
[root@localhost ~]$ 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.
# 查看防火墙是否已关闭
[root@localhost ~]$ systemctl list-unit-files |grep firewalld
firewalld.service disabled
[root@localhost ~]$ vim /etc/sudoers
在%wheel 这行下面添加一行,其他为文件本身内容,不要改动
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
hadoop ALL=(ALL) NOPASSWD:ALL
7.1 module文件夹存放解压后的文件,software文件夹存放待解压的压缩包
[root@localhost ~]$ mkdir /opt/module /opt/software
7.2 修改两个目录的所属组和所有者均为hadoop用户
[root@localhost ~]$ chown -R hadoop:hadoop /opt/module
[root@localhost ~]$ chown -R hadoop:hadoop /opt/software
7.3 查看 module、software 文件夹的所有者和所属组
[root@localhost ~]$ cd /opt/
[root@localhost opt]$ ll
总用量 0
drwxr-xr-x. 2 hadoop hadoop 6 2月 8 21:53 module
drwxr-xr-x. 2 root root 6 9月 7 2017 rh
drwxr-xr-x. 2 hadoop hadoop 6 2月 8 12:53 software
[root@localhost opt]$ rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
[root@localhost opt]$ reboot
8.1 查看JDK版本(看是否卸载干净)
[root@hadoop100 ~]$ java -version
bash: java: 未找到命令...
使用VMware自带的克隆功能,利用模板虚拟机克隆三台虚拟机:
主机名分别为hadoop102、hadoop103和hadoop104
IP地址为xxx.xxx.xxx.132、xxx.xxx.xxx.133和xxx.xxx.xxx.134(根据自己虚拟机的IP地址范围配置,下面有具体配置过程)
注意:克隆时,要先关闭hadoop100
以下过程以hadoop102为例,三台虚拟机都需要做
1.1 修改网卡配置文件(记得后面要改成自己的网卡名称)
[root@hadoop100 ~]$ vi /etc/sysconfig/network-scripts/ifcfg-ens33
UUID='原来的UUID' -> '新生成的UUID'
IPADDR='原来的IP地址' -> '要设置的IP地址'
1.2 重启网络
[root@hadoop100 ~]$ service network restart
以下过程以hadoop102为例,三台虚拟机都需要做
[root@hadoop100 ~]$ vim /etc/hostname
hadoop102
以下过程以hadoop102为例,三台虚拟机都需要做
[root@hadoop100 ~]$ vim /etc/hosts
3.1 添加如下内容
依然是IP地址要修改成你自己的:
尤其是hadoop102~104,对应的IP地址为你要设置的IP
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
以下过程以hadoop102为例,三台虚拟机都需要做
[root@hadoop100 ~]$ reboot
4.1 重启之后,打开终端发现主机名已经修改成功
[root@hadoop102 ~]$
5.1 如果操作系统是window7,可以直接修改
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
5.2 如果操作系统是window10,先拷贝出来,修改保存以后,再覆盖即可
修改完毕后,就可以在windows环境下使用xshell连接虚拟机了,操作会方便很多哦~
附:XShell免费版的安装配置教程以及使用教程(超级详细、保姆级)
6.1 首先确保虚拟机自带JDK卸载干净
[root@hadoop102 ~]$ java -version
bash: java: 未找到命令...
6.2 解压JDK到/opt/module
- 提示1:xshell中可以使用rz命令将本地文件上传至虚拟机,或者建立共享文件夹也有同样效果。
- 提示2:文章末尾提供JDK8等各组件的安装包,需要自取~
[root@hadoop102 ~]$ cd /opt/software
[root@hadoop102 software]$ ls
[root@hadoop102 software]$ su hadoop
[hadoop@hadoop102 software]$ sudo tar -zxvf jdk-8u211-linux-x64.tar.gz -C /opt/module
6.3 修改JDK安装包名称
[hadoop@hadoop102 software]$ cd ../module
[hadoop@hadoop102 module]$ ls
jdk1.8.0_211
[hadoop@hadoop102 module]$ mv jdk1.8.0_211 jdk
[hadoop@hadoop102 module]$ ls
jdk
6.4 配置 JDK 环境变量
[hadoop@hadoop102 module]$ sudo vim /etc/profile.d/my_env.sh
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk
export PATH=$PATH:$JAVA_HOME/bin
[hadoop@hadoop102 module]$ source /etc/profile
[hadoop@hadoop102 module]$ java -version
首先再仔细检查一下 /etc/profile.d/my_env.sh 文件,尤其是注释前面的 # 有没有省略,以及HOME目录有没有配错。
7.1 进入/opt/software文件夹,解压Hadoop到/opt/module
[hadoop@hadoop102 software]$ sudo tar -zxvf hadoop-2.6.0-cdh5.14.2.tar.gz -C /opt/module
7.2 修改Hadoop安装包名称
[hadoop@hadoop102 module]$ ls
hadoop-2.6.0-cdh5.14.2 jdk
[hadoop@hadoop102 module]$ mv hadoop-2.6.0-cdh5.14.2 hadoop
[hadoop@hadoop102 module]$ ls
hadoop jdk
# 确保hadoop用户具有操作module目录下文件的权限
[hadoop@hadoop102 module]$ cd ..
[hadoop@hadoop102 opt]$ chown -R hadoop:hadoop module
7.3 将 Hadoop 添加到环境变量
[hadoop@hadoop102 module]$ sudo vim /etc/profile.d/my_env.sh
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
[hadoop@hadoop102 module]$ source /etc/profile
[hadoop@hadoop102 module]$ hadoop version
里面有些步骤与后续内容相关,尽量不要跳过
#创建hello.txt文件,用来测试hadoop自带的wordcount程序
[hadoop@hadoop102 module]$ mkdir /hadoop/wcinput
[hadoop@hadoop102 module]$ cd /hadoop/wcinput
[hadoop@hadoop102 wcinput]$ vim hello.txt
1.1 在hello.txt文件中填入任意内容即可,举例:
hello world
hello java
I'm MOSS
1.2 运行wordcount程序
注:在$HADOOP_HOME/share/hadoop/mapreduce/目录下找对应jar包
[hadoop@hadoop102 hadoop]$ pwd
/opt/module/hadoop
[hadoop@hadoop102 hadoop]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount wcinput wcoutput
[hadoop@hadoop102 hadoop]$ cat wcoutput/part-r-00000
2.1 执行以下命令同步jdk和hadoop文件到hadoop103和hadoop104,顺便测试scp和rsync命令
注意执行各命令的服务器
[hadoop@hadoop102 hadoop]$ scp -r /opt/module/jdk hadoop@hadoop103:/opt/module
[hadoop@hadoop103 hadoop]$ scp -r hadoop@hadoop102:/opt/module/hadoop /opt/module/
[hadoop@hadoop103 hadoop]$ scp -r hadoop@hadoop102:/opt/module/* hadoop@hadoop104:/opt/module
# 在hadoop103上删除wcinput目录,执行rsync同步命令后,hadoop103上wcinput目录恢复
[hadoop@hadoop103 hadoop]$ rm -rf wcinput/
[hadoop@hadoop102 opt]$ rsync -av hadoop/ hadoop@hadoop103:/opt/module/hadoop/
2.2 编写xsync脚本
[hadoop@hadoop102 opt]$ echo $PATH
[hadoop@hadoop102 opt]$ cd /home/hadoop
[hadoop@hadoop102 ~]$ mkdir bin
[hadoop@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh
#XSYNC_HOME
export XSYNC_HOME=/home/hadoop
export PATH=$PATH:$XSYNC_HOME/bin
[hadoop@hadoop102 ~]$ source /etc/profile
# 查看发现全局环境变量中已有/home/hadoop/bin目录
[hadoop@hadoop102 ~]$ echo $PATH
[hadoop@hadoop102 ~]$ cd bin
[hadoop@hadoop102 bin]$ vim xsync
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
2.3 修改脚本 xsync 具有执行权限
[hadoop@hadoop102 bin]$ chmod +x xsync
2.4 测试脚本
[hadoop@hadoop102 bin]$ xsync /home/hadoop/bin
2.5 同步环境变量配置
注意:如果用了 sudo,那么 xsync 一定要给它的路径补全。
[hadoop@hadoop102 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
2.6 让环境变量生效
[hadoop@hadoop103 bin]$ source /etc/profile
[hadoop@hadoop104 bin]$ source /etc/profile
3.1 生成公钥和私钥
[hadoop@hadoop102 ~]$ cd /home/hadoop/.ssh
[hadoop@hadoop102 .ssh]$ ssh-keygen -t rsa
3.2 将公钥拷贝到要免密登录的目标机器上
[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop102
[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop103
[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop104
注意:
- 还需要在 hadoop103 上采用 hadoop 账号配置一下无密登录到 hadoop102、hadoop103、 hadoop104 服务器上;
- 还需要在 hadoop104 上采用 hadoop 账号配置一下无密登录到 hadoop102、hadoop103、 hadoop104 服务器上;
- 还需要在 hadoop102 上采用 root 账号,配置一下无密登录到 hadoop102、hadoop103、hadoop104。
接下来就可以通过ssh 主机名命令免密登录到别的服务器了~
以下为测试:
[hadoop@hadoop102 .ssh]$ ssh hadoop103
Last login: Tue Feb 14 11:57:09 2023 from hadoop102
[hadoop@hadoop103 ~]$ pwd
/home/hadoop
[hadoop@hadoop103 ~]$ exit
登出
Connection to hadoop103 closed.
[hadoop@hadoop102 .ssh]$
4.1 集群部署规划
- 元数据节点、资源管理器和从元数据节点分别安装在三台服务器上
- 数据节点和节点管理器在三台服务器上均安装
[hadoop@hadoop102 .ssh]$ cd $HADOOP_HOME/etc/hadoop
[hadoop@hadoop102 hadoop]$ vim core-site.xml
注意这个hadoop数据存储目录哦,如果没有指定的话,hadoop会在HOME目录下生成一个tmp目录,现在我们指定了,就变成 /opt/module/hadoop/data目录。
所以如果在进行hadoop的格式化之前要删除的tmp目录和logs目录,就变成了data目录和logs目录了。
附:如何重新格式化Hadoop文件系统
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop/data</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 hadoop -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
</configuration>
[hadoop@hadoop102 hadoop]$ vim hdfs-site.xml
<configuration>
<!-- nn web 端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
[hadoop@hadoop102 hadoop]$ vim yarn-site.xml
<configuration>
<!-- 指定 MR 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME</value>
</property>
</configuration>
[hadoop@hadoop102 hadoop]$ vim mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4.3 在集群上分发配置好的 Hadoop 配置文件
[hadoop@hadoop102 hadoop]$ xsync /opt/module/hadoop/etc/hadoop/
4.4 去103 和 104上查看文件分发情况
[hadoop@hadoop103 ~]$ cat /opt/module/hadoop/etc/hadoop/core-site.xml
[hadoop@hadoop104 ~]$ cat /opt/module/hadoop/etc/hadoop/core-site.xml
5.1 配置 slaves(hadoop3.0之后版本改为workers)
[hadoop@hadoop102 hadoop]$ vim /opt/module/hadoop/etc/hadoop/slaves
hadoop102
hadoop103
hadoop104
[hadoop@hadoop102 hadoop]$ xsync /opt/module/hadoop/etc
5.2 启动集群
注意:如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode
[hadoop@hadoop102 hadoop]$ hdfs namenode -format
[hadoop@hadoop102 hadoop]$ start-dfs.sh
[hadoop@hadoop103 hadoop]$ start-yarn.sh
- 目的: 为了查看程序的历史运行情况
- Hadoop自带了一个历史服务器,可以通过历史服务器在web端查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息
- 所以修改mapreduce的配置文件以配置历史服务器
6.1 配置 mapred-site.xml
[hadoop@hadoop102 hadoop]$ vim mapred-site.xml
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器 web 端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
6.2 分发配置
[hadoop@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
6.3 在 hadoop102启动历史服务器
在hadoop2.0和hadoop3.0上,启动和终止历史服务器的命令有区别,以下为2.0版本
附:hadoop3.x集群:配置、启动历史服务(history server,端口19888)
[hadoop@hadoop102 hadoop]$ mr-jobhistory-daemon.sh start historyserver
6.4 查看历史服务器是否启动
[hadoop@hadoop102 hadoop]$ jps
- 目的: 可以方便的查看到程序运行详情,方便开发调试(在102的HDFS上)
7.1 配置 yarn-site.xml
[hadoopu@hadoop102 hadoop]$ vim yarn-site.xml
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
7.2 分发配置
[hadoop@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
7.3 关闭 NodeManager 、ResourceManager和 HistoryServer
[hadoop@hadoop103 hadoop]$ stop-yarn.sh
[hadoop@hadoop102 hadoop]$ mr-jobhistory-daemon.sh stop historyserver
7.4 启动 NodeManager 、ResourceManage 和 HistoryServer
[hadoop@hadoop103 hadoop]$ start-yarn.sh
[hadoop@hadoop102 hadoop]$ mr-jobhistory-daemon.sh start historyserver
7.5 测试
[hadoop@hadoop102 hadoop]$ pwd
/opt/module/hadoop
[hadoop@hadoop102 hadoop]$ hadoop fs -mkdir /input
[hadoop@hadoop102 hadoop]$ hadoop fs -put wcinput/hello.txt /input
[hadoop@hadoop102 hadoop]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount /input /output
# 查看运行结果
[hadoop@hadoop102 hadoop]$ hadoop fs -text /out*/p*
8.1 Hadoop 集群启停脚本(包含 HDFS,Yarn,Historyserver)
[hadoop@hadoop102 ~]$ cd /home/hadoop/bin
[hadoop@hadoop102 bin]$ vim myhadoop.sh
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop 集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop 集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop/sbin/mr-jobhistory-daemon.sh stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
[hadoop@hadoop102 bin]$ chmod +x myhadoop.sh
8.2 查看三台服务器 Java 进程脚本
[hadoop@hadoop102 ~]$ cd /home/hadoop/bin
[hadoop@hadoop102 bin]$ vim jpsall
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
[hadoop@hadoop102 bin]$ chmod +x jpsall
8.3 分发/home/hadoop/bin 目录,保证自定义脚本在三台机器上都可以使用:
# 先确保一下文件所属
[hadoop@hadoop102 ~]$ chown -R hadoop:hadoop bin
# 分发bin目录
[hadoop@hadoop102 ~]$ xsync /home/hadoop/bin/
8.4 测试
[hadoop@hadoop102 ~]$ myhadoop.sh stop
[hadoop@hadoop102 ~]$ jpsall
如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;
如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差, 导致集群执行任务时间不同步。
因为我没有配置,所以需要配置时间同步的童靴请自行搜索Hadoop集群时间同步配置
。
1.1 解压 Zookeeper 安装包到/opt/module/目录下
[hadoop@hadoop102 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
# 在/opt/module目录下修改ZK文件包名称
[hadoop@hadoop102 software]$ cd /opt/module
[hadoop@hadoop102 module]$ mv zookeeper-3.4.10 zookeeper
[hadoop@hadoop102 module]$ ls
hadoop jdk zookeeper
# 修改其所属为hadoop用户
[hadoop@hadoop102 module]$ sudo chown -R hadoop:hadoop zookeeper
1.2 同步/opt/module/zookeeper 目录内容到 hadoop103、hadoop104
[hadoop@hadoop102 module]$ xsync zookeeper/
2.1 在/opt/module/zookeeper/这个目录下创建 zkData
[hadoop@hadoop102 zookeeper]$ mkdir zkData
2.2 在/opt/module/zookeeper/zkData 目录下创建一个 myid 的文件
[hadoop@hadoop102 zkData]$ touch myid
添加 myid 文件,注意一定要在 linux 里面创建,在 notepad++里面很可能乱码
2.3 编辑 myid 文件
[hadoop@hadoop102 zkData]$ vim myid
2
2.4 拷贝配置好的 zookeeper 到其他机器上
[hadoop@hadoop102 zkData]$ xsync myid
3、4
注意:
使用xsync分发文件会使目标服务器上的文件与本服务器文件完全一致。进行Hadoop完全分布式环境搭建的时候,如果分发的目录或文件中包含myid文件,一定记得修改目标服务器上的myid文件,否则可能导致zookeeper无法启动等问题。3.1 重命名/opt/module/zookeeper/conf 这个目录下的 zoo_sample.cfg 为 zoo.cfg
[hadoop@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg
3.2 修改 zoo.cfg 文件
[hadoop@hadoop102 conf]$ vim zoo.cfg
dataDir=/opt/module/zookeeper/zkData
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
server.A=B:C:D
- A 是一个数字,表示这个是第几号服务器; 集群模式下配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面有一个数据就是A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息 较从而判断到底是哪个 server;
- B 是这个服务器的地址;
- C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口;
- D 是万一集群中的 Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
3.3 同步 zoo.cfg 配置文件
[hadoop@hadoop102 conf]$ xsync zoo.cfg
3.4 删除hadoop103和hadoop104上的多余文件
# hadoop103
[hadoop@hadoop103 conf]$ pwd
/opt/module/zookeeper/conf
[hadoop@hadoop103 conf]$ rm -rf zoo_sample.cfg
# hadoop104
[hadoop@hadoop104 conf]$ rm -rf zoo_sample.cfg
注意:
ZK有启动成功,只是在启动时返回这样一条报错信息,那么只需要把集群中的zoo_sample.cfg文件删除即可。
- 附:Zookeeper启动显示成功,zkServer.sh status报错
- 补充一条:重新查看集群中各服务器的myid文件中的编号,是否与在zoo.cfg文件配置的服务器编号一致。
4.1 将ZooKeeper目录所在路径添加到环境变量,方便全局调用命令
[hadoop@hadoop102 conf]$ sudo vim /etc/profile.d/my_env.sh
[hadoop@hadoop102 conf]$ source /etc/profile
#ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
export PATH=$PATH:$ZOOKEEPER_HOME/sbin
4.2 编写ZooKeeper启动脚本
注意:集群中全部服务器上的Zookeeper均启动成功,才能正常运行
[hadoop@hadoop102 conf]$ cd /home/hadoop/bin
[hadoop@hadoop102 bin]$ vim myzk.sh
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 zookeeper ==================="
echo " --------------- hadoop102 ---------------"
ssh hadoop102 "/opt/module/zookeeper/bin/zkServer.sh start"
echo " --------------- hadoop103 ---------------"
ssh hadoop103 "/opt/module/zookeeper/bin/zkServer.sh start"
echo " --------------- hadoop104 ---------------"
ssh hadoop104 "/opt/module/zookeeper/bin/zkServer.sh start"
;;
"stop")
echo " =================== 关闭 zookeeper ==================="
echo " --------------- hadoop104 ---------------"
ssh hadoop104 "/opt/module/zookeeper/bin/zkServer.sh stop"
echo " --------------- hadoop103 ---------------"
ssh hadoop103 "/opt/module/zookeeper/bin/zkServer.sh stop"
echo " --------------- hadoop102 ---------------"
ssh hadoop102 "/opt/module/zookeeper/bin/zkServer.sh stop"
;;
*)
echo "Input Args Error..."
;;
esac
[hadoop@hadoop102 bin]$ chmod +x myzk.sh
4.3 分发/home/hadoop/bin 目录,保证自定义脚本在三台机器上都可以使用
# 进入bin的上级目录/home/hadoop
[hadoop@hadoop102 bin]$ cd ..
# 先确保一下文件所属
[hadoop@hadoop102 ~]$ chown -R hadoop:hadoop bin
# 分发bin目录
[hadoop@hadoop102 ~]$ xsync bin/
4.4 运行ZooKeeper
[hadoop@hadoop102 ~]$ myzk.sh start
4.5 查看状态
[hadoop@hadoop102 zookeeper]$ zkServer.sh status
[hadoop@hadoop103 zookeeper]$ zkServer.sh status
[hadoop@hadoop104 zookeeper]$ zkServer.sh status
首先保证 Zookeeper 集群的正常部署,并启动之
# 启动过就不要再启动了
[hadoop@hadoop102 zookeeper]$ myzk.sh start
Hadoop 集群的正常部署并启动
[hadoop@hadoop102 hadoop]$ myhadoop.sh start
3.1 解压 HBase 到指定目录
[hadoop@hadoop102 software]$ tar -zxvf hbase-1.2.0-cdh5.14.0.tar.gz -C /opt/module
3.2 修改文件包名称和所属
[hadoop@hadoop102 module]$ mv hbase* hbase
[hadoop@hadoop102 module]$ sudo chown -R hadoop:hadoop hbase
# 进入conf目录,之后需修改配置文件
[hadoop@hadoop102 module]$ cd hbase/conf
[hadoop@hadoop102 conf]$
4.1 修改 hbase-env.sh
export JAVA_HOME=/opt/module/jdk
export HBASE_MANAGES_ZK=false
警告内容:
Java HotSpot™ 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot™ 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
解决方案:
hbase-env.sh文件中45行左右有注释说明下面两个export在JDK8+版本可以被安全地移除,注释掉即可
4.2 hbase-site.xml 修改内容
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop102:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 0.98后的新变动,之前版本没有.port,默认端口为60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/module/zookeeper/zkData</value>
</property>
</configuration>
4.3 regionservers文件内容如下:原内容删去
regionservers文件列出了所有运行HRegionServer进程服务器,对该文件的配置与Hadoop中对slaves或者workers文件的配置相似,需要在文件的每一行指定一台服务器,当HBASE启动时会读取该文件,将文件指定的所有服务器启动HRegionServer进程,当HBASE停止的时候,也会同时停止他们。
因此,在启动hbase后,主服务器hadoop102将启动两个节点HMaster和HRegionServer,其余各服务器启动一个节点HRegionServer。
hadoop102
hadoop103
hadoop104
4.4 软连接 hadoop 配置文件到 hbase:
[hadoop@hadoop102 module]$ ln -s /opt/module/hadoop/etc/hadoop/core-site.xml /opt/module/hbase/conf/core-site.xml
[hadoop@hadoop102 module]$ ln -s /opt/module/hadoop/etc/hadoop/hdfs-site.xml /opt/module/hbase/conf/hdfs-site.xml
[hadoop@hadoop102 module]$ xsync hbase/
6.1 添加环境变量
[hadoop@hadoop102 module]$ sudo vim /etc/profile.d/my_env.sh
[hadoop@hadoop102 module]$ source /etc/profile
#HBASE_HOME
export HBASE_HOME=/opt/module/hbase
export PATH=$PATH:$HBASE_HOME/bin
6.2 分发环境变量文件
[hadoop@hadoop102 module]$ sudo /home/hadoop/bin/xsync /etc/profile.d/my_env.sh
# 使文件在各服务器上生效
[hadoop@hadoop103 module]$ source /etc/profile
[hadoop@hadoop104 module]$ source /etc/profile
6.3 测试
[hadoop@hadoop102 module]$ start-hbase.sh
[hadoop@hadoop102 module]$ jpsall
[hadoop@hadoop102 module]$ hbase shell
这里提供一个特别zz的解决方案:
我在后续把IDEA的目录添加到环境变量中时,因为错把$IDEA_HOME
写成$HBASE_HOME
(复制粘贴的锅),导致环境变量中$HBASE_HOME
被IDEA的目录所覆盖,因此出现如上报错。
所以可以先仔细检查环境变量文件,我当时就是没有全部看一遍,导致困扰许久。
6.4 关闭集群顺序
[hadoop@hadoop102 module]$ stop-hbase.sh
[hadoop@hadoop102 module]$ myhadoop.sh stop
[hadoop@hadoop102 module]$ myzk.sh stop
# 查看各服务器上的进程,正常关闭后,各服务器上均只剩下一个进程jps
[hadoop@hadoop102 module]$ jpsall
# 解压安装
## MAVEN
[hadoop@hadoop102 software]$ tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /opt/module
## IDEA
[hadoop@hadoop102 software]$ tar -zxvf ideaIU-2017.2.7.tar.gz -C /opt/module
# 修改目录名和所属
[hadoop@hadoop102 module]$ mv apache* maven
[hadoop@hadoop102 module]$ mv idea* idea
[hadoop@hadoop102 module]$ sudo chown -R hadoop:hadoop maven idea
[hadoop@hadoop102 module]$ ll
[hadoop@hadoop102 module]$ sudo vim /etc/profile.d/my_env.sh
[hadoop@hadoop102 module]$ source /etc/profile
#MAVEN_HOME
export MAVEN_HOME=/opt/module/maven
export PATH=$PATH:$MAVEN_HOME/bin
#IDEA_HOME
export IDEA_HOME=/opt/module/idea
export PATH=$PATH:$IDEA_HOME/bin
# 输入名令 mvn -v 可以查看版本号
[hadoop@hadoop102 module]$ mvn -v
[hadoop@hadoop102 conf]$ pwd
/opt/module/maven/conf
[hadoop@hadoop102 conf]$ vim settings.xml
id=alimaven
name=aliyun maven
url=http://maven.aliyun.com/nexus/content/groups/public/
mirrorOf=central
[hadoop@hadoop102 conf]$ idea.sh
教程相关
【1】尚硅谷大数据技术之 Hadoop(入门)
【2】hadoop3.x集群:配置、启动历史服务(history server,端口19888)
【3】【尚硅谷】大数据全套教程下载
【4】centos7安装IDEA配置Maven
【5】如何重新格式化Hadoop文件系统
【6】同一个局域网内如何共享文件夹(含共享打印机操作方法)
【7】在本地用idea连接虚拟机上的hbase集群
报错相关
【1】Hbase启动警告
【2】linux 终端启动图形化程序界面时报错:No protocol specified
【3】stop-hbase.sh一直处于等待状态
知识相关
【1】【hadoop 的坑】hadoop的配置文件slaves/workers
【2】Hadoop配置文件详解
【3】Zookeeper学习笔记
【4】Hbase的集群模式安装配置(笔记)
【5】maven-porm.xml详解
【6】hadoop3.x——历史服务器
【7】UUID详细介绍
实战项目
【1】HBase快速入门系列 (九)| HBase 的实战案例(微博)
链接:https://pan.baidu.com/s/1YnO6NQYrU4gGgx1kEVy1jA
提取码:MNZX
以上过程希望对你有所帮助! |
欢迎评论区交流指教! |