1-前提
集群相关内容
IP地址 | 主机名 | 密码 |
---|---|---|
192.168.145.130 | master | 123456 |
192.168.145.131 | slaves1 | 12346 |
192.168.145.132 | slaves2 | 123456 |
准备工作
修改root密码
sudo passwd root
输入密码:123456
再次输入密码:123456
保证ssh、ftp能够远程连接,下载服务
- master
安装ssh服务
sudo apt-get install -y openssh-server
sudo service ssh start
安装vsftp服务
sudo apt-get install -y vsftpd
vsftp需要修改的配置文件
sudo vi /etc/vsftpd.conf
# 25行
anonymous_enable=NO
# 28行
local_enable=YES
# 31行
write_enable=YES
启动vsftp服务
sudo service vsftp start
在/opt下创建module、software
- master
mkdir /opt/module
mkdir /opt/software
给予software权限,确保ftp有权限传输文件
chmod 777 /opt/software
配置ip映射
vi /etc/hosts
# 以下内容 ------
192.168.145.130 master
192.168.145.131 slaves1
192.168.145.132 slaves2
配置ssh密钥登陆
三台节点都需要配置
- master
- slaves1
- slaves2
ssh-keygen -t rsa
# 三次回车-----
ssh-copy-id master
ssh-copy-id slaves1
ssh-copy-id slaves2
# 第一次yes、输入密码:123456
注:这个步骤不能使用root用户来操作,需要使用本机的master
scp传输文件问题
a.需要给被传输的目录可读可写的权限
b.需要配置好ssh密钥
例:master传输java8文件给slaves1
- slaves1
sudo mkdir /opt/module
sudo chmod 777 /opt/module
scp传输
- master
scp -r /opt/module/java8 slaves1:/opt/module
注:如果按上述操作完后,还是存在权限问题Permission denied, please try again.
,使用bash刷新一下系统
master、slaves1都刷新一下
bash
2-搭建Hadoop的hdfs、yarn集群分布式服务
内容展示
主机名 | 服务 |
---|---|
master | (hdfs)namenode、datanode |(yarn)nodemanager |
slaves1 | (hdfs)datanode | (yarn)resourcemanager、nodemanager |
slaves2 | (hdfs)resondarynamenode、datanode | (yarn)nodemanager |
操作系统版本:ubuntu-18.04.6-desktop-amd64.iso
使用的相关软件版本
服务 | 版本号 |
---|---|
jdk8 | jdk-8u144-linux-x64.tar.gz |
hadoop-2.7.2 | hadoop-2.7.2.tar.gz |
搭建hdfs、yarn
- 解压Hadoop、jdk
- 配置环境变量、测试环境是否生效
- 配置修改文件、分发文件
- 格式化namenode
- 集群测试启动
注:使用的都是绝对路径
登录root用户,不平凡使用sudo
su root
输入密码:123456
解压
- master
(1)解压jdk、hadoop
tar -zxvf /opt/software/jdk-8u144-linux-x64.tar.gz -C /opt/module/
tar -zxvf /opt/software/hadoop-2.7.2.tar.gz -C /opt/module/
(2)修改目录名
mv /opt/module/jdk1.8.0_144/ /opt/module/java8
(3)复制好相关路径,配置环境变量
JAVA_HOME=/opt/module/java8
HADOOP_HOME=/opt/module/hadoop-2.7.2
vi /etc/profile
# 以下内容
# ----------
# JAVA_HOME
export JAVA_HOME=/opt/module/java8
export PATH=$PATH:$JAVA_HOME/bin
# HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
(4)验证环境
source /etc/profile
javac
java -version
hadoop version
(5)分发文件
- master
注:传输文件别使用root用户
scp -r /opt/module/java8 slaves1:/opt/module
scp -r /opt/module/java8 slaves2:/opt/module
scp -r /opt/module/hadoop-2.7.2 slaves1:/opt/module
scp -r /opt/module/hadoop-2.7.2 slaves2:/opt/module
scp -r /etc/hosts slaves1:/opt/module
scp -r /etc/hosts slaves2:/opt/module
scp -r /etc/profile slaves1:/opt/module
scp -r /etc/profile slaves2:/opt/module
- slaves1
cat /opt/module/profile
cat /opt/module/hosts
profile
# JAVA_HOME
export JAVA_HOME=/opt/module/java8
export PATH=$PATH:$JAVA_HOME/bin
# HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
hosts
192.168.145.130 master
192.168.145.131 slaves1
192.168.145.132 slaves2
sudo vi /etc/profile
sudo vi /etc/hosts
# 结尾添加到文件末尾就行
source /etc/profile
- slaves2
上同操作:)
——摸鱼
source /etc/profile
注:不知为什么,/etc目录下的文件就同步不过去
注:我没有添加sudo
时,就表示在使用root
用户
配置文件
修改hadoop-env.sh
vi /opt/module/hadoop-2.7.2/etc/hadoop/hadoop-env.sh
# 修改内容
# 28行
export JAVA_HOME=/opt/module/java8
修改core-site.xml
vi /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
# 修改内容
# 末尾
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
</configuration>
修改hdfs-site.xml
vi /opt/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml
# 修改内容
# 末尾
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slaves2:50090</value>
</property>
</configuration>
注:下面开始将省略文件中的<configuration>
修改mapred-site.xml
cp /opt/module/hadoop-2.7.2/etc/hadoop/mapred-site.xml.template /opt/module/hadoop-2.7.2/etc/hadoop/mapred-site.xml
vi /opt/module/hadoop-2.7.2/etc/hadoop/mapred-site.xml
# 修改内容
# 末尾
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
修改yan-site.xml
vi /opt/module/hadoop-2.7.2/etc/hadoop/yarn-site.xml
# 修改内容
# 末尾
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slaves1</value>
</property>
修改slaves
vi /opt/module/hadoop-2.7.2/etc/hadoop/slaves
# 修改为
master
slaves1
slaves2
分发文件
- master(现在不是root用户了,以后不再提醒啦o( ̄▽ ̄)o)
scp -r /opt/module/hadoop-2.7.2/ slaves1:/opt/module/
scp -r /opt/module/hadoop-2.7.2/ slaves2:/opt/module/
测试
准备启动hdfs、yarn
(1)格式化namenode
- master
# 执行下面格式化时,需要给到hadoop-2.7.2目录可执行权限
# 先进入root
su root
# 给予权限
chmod -R a+w /opt/module/hadoop-2.7.2/
hdfs namenode -format
start-dfs.sh
注:如果start-dfs.sh
不存在,那就是你没有配置好hadoop环境变量的bin或者sbin
- slaves1
start-yarn.sh
启动状况用jps
查看,我这里以文本形式展示
- master
8449 NodeManager
7878 NameNode
8554 Jps
8047 DataNode
- slaves1
4880 ResourceManager
4102 DataNode
5022 NodeManager
5310 Jps
- slaves2
2726 SecondaryNameNode
2859 NodeManager
2587 DataNode
3308 Jps
2.5-搭建zookeeper集群
服务 | 版本 |
---|---|
zookeeper | zookeeper-3.4.6.tar.gz |
- 解压、改名
- 添加环境变量
- 修改配置文件
- 测试
(1)解压、改名
tar -zxvf /opt/software/zookeeper-3.4.6.tar.gz -C /opt/module/
mv /opt/module/zookeeper-3.4.6/ /opt/module/zookeeper
(2)配置环境变量
vi /etc/profile
# 内容如下
# ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
source /etc/profile
注:因为scp不能够分发到/etc下,所以这个环境请手动配置咯(ง •_•)ง
(3)配置文件
修改zoo.cfg
cp /opt/module/zookeeper/conf/zoo.sample.cfg /opt/module/zookeeper/conf/zoo.cfg
vi /opt/module/zookeeper/conf/zoo.cfg
# 内容如下
# 12行
dataDir=/opt/module/zookeeper/data #在该行下面(13行)继续添加
server.1=master:2888:3888
server.2=slaves1:2888:3888
server.3=slaves2:2888:3888
创建zookeeper/data目录,写入myid
文件
mkdir /opt/module/zookeeper/data
echo 1 > /opt/module/zookeeper/data/myid
(4)分发zookeeper文件
- master
scp -r /opt/module/zookeeper/ slaves1:/opt/module
scp -r /opt/module/zookeeper/ slaves2:/opt/module
注:别忘记将环境变量也添加进来哦(。・∀・)ノ
(5)配置每台节点上的myid
节点名称 | myid |
---|---|
master | 1 |
slaves1 | 2 |
slaves2 | 3 |
- slaves1
sed -i 's/1/2/g' /opt/module/zookeeper/data/myid
- slaves2
sed -i 's/1/3/g' /opt/module/zookeeper/data/myid
注:了解shell脚本的应该对sed
不陌生吧,这里直接用vi
达到效果也一样的。
(6)测试
补充:这里也是一样,启动前,需要给zookeeper目录中所有文件可执行权限
- master
- slaves1
- slaves2
# 可执行权限
sudo chmod -R a+w /opt/module/zookeeper
启动
- master
zkServer.sh start
- slaves1
zkServer.sh start
- slaves2
zkServer.sh start
都启动完成后,有一个进程名为QuorumPeerMain
就是zookeeper的进程
注:最好先启动master节点的zk在启动另外两个
了解zookeeper的朋友,可以查看zookeeper的运行状态,查看leader、follower
复习复习zookeeper的选举机制
zkServker.sh status
3-搭建Hadoop-HA高可用集群
前提搭建好了之前的hdfs、yarn、zookeeper,且能正常启动。
满足以上条件就可以开始搭建HA啦(。^▽^)
提示:本节的配置文件内容非常多,真的!!~
- 配置文件
- 重新格式化namenode、格式化zkfc
- 启动测试
- 可能遇到的问题
介绍:HA跟普通hdfs的区别在于,HA有两个节点的namenode,可厉害了
1-配置文件
- master
修改core-site.xml
vi /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
# 内容如下
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slaves1:2181,slaves2:2181</value>
</property>
修改hdfs-site.xml
vi /opt/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml
# 需要删除一段配置,该配置是hdfs的辅助节点,现在搭建完HA后,就不需要辅助节点了
# <property>
# <name>dfs.namenode.secondary.http-address</name>
# <value>slaves2:50090</value>
# </property>
# 内容如下
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>slaves1:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>slaves1:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slaves1:8485;slaves2:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/hadoop-2.7.2/jn</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
修改hadoop-env.sh
vi /opt/module/hadoop-2.7.2/etc/hadoop/hadoop-env.sh
# 内容如下
export JAVA_HOME=/opt/module/java8 # 之前应该添加过,再检查一遍防止未添加
修改yarn-site.xml
vi /opt/module/hadoop-2.7.2/etc/hadoop/yarm-site.xml
# 内容如下
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>r1,r2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.r1</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.r1</name>
<value>master:8088</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.r2</name>
<value>slaves1</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.r2</name>
<value>slaves1:8088</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master,slaves1,slaves2</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
修改yarn-env.sh
vi /opt/module/hadoop-2.7.2/etc/hadoop/yarn-env.sh
# 内容如下
# 23行,需取消注释
export JAVA_HOME=/opt/module/java8
修改mapred-env.sh
vi /opt/module/hadoop-2.7.2/etc/hadoop/mapred-env.sh
# 内容如下
# 16行,需取消注释
export JAVA_HOME=/opt/module/java8
修改mapred-site.xml
vi /opt/module/hadoop-2.7.2/etc/hadoop/mapred-site.xml
# 内容如下
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
修改slaves
# 内容
master
slaves1
slaves2
同步文件
scp -r /opt/module/hadoop-2.7.2/ slaves1:/opt/module
scp -r /opt/module/hadoop-2.7.2/ slaves2:/opt/module
以防万一:发现重新分发hadoop-2.7.2目录后,之前给予的可执行权限无了(>人<;),再次添加
- slaves1
sudo chmod -R a+w /opt/module/hadoop-2.7.2
- slaves2
sudo chmod -R a+w /opt/module/hadoop-2.7.2
启动准备
三台节点都需要启动zookeeper、journalnode
- master
zkServer.sh start
hadoop-daemon.sh start journalnode
- slaves1
zkServer.sh start
hadoop-daemon.sh start journalnode
- slaves2
zkServer.sh start
hadoop-daemon.sh start journalnode
补充:hadoop的另一种启动journalnode节点集群的方式hadoop-daemons.sh start journalnode
,可以一次启动三台的journalnode
- 重新格式化namenode
注:重新格式化,需要删除hadoop-2.7.2/目录下的data/、logs/目录
三台节点都进行这个删除操作,因为刚刚同步了文件
- master
- slaves1
- slaves2
rm -rf /opt/module/hadoop-2.7.2/data/
rm -rf /opt/module/hadoop-2.7.2/logs/
- master重新格式化namenode
hdfs namenode -format
提醒:如果这里格式化失败,一般有三个问题
- (1)没有删除data/或者logs/目录
- (2)
hdfs-site.xml
配置文件出错,或者是少配置了 - (3)没有启动
journalnode
进程
希望朋友一定要耐心查找🔍,累了休息会再查找。相信一定能排查出来的( ̄︶ ̄*))
启动master节点的namenode(前提是,namenode格式化成功了)
hadoop-daemon.sh start namenode
使用jps
查看master的进程
9984 JournalNode
10689 NameNode
10763 Jps
9583 QuorumPeerMain
- slaves1
- 同步master节点的namenode
hdfs namenode -bootstrapStandby
无报错就是正常的。
- master
- 主节点nn1(master)中格式化zkfc,在zookeeper中可见目录data/、logs/
hdfs zkfc -formatZK
之后启动hdfs、yarn集群
- master
start-dfs.sh
- slaves1
start-yarn.sh
ps:搭建HA真的是配置文件出错很难找啊,可能是<name>
或者<value>
有问题;又或者是其中的某一个字母拼错,如果不需要练习搭建大数据组件的朋友,直接复制我的配置文件就行。————手敲真的很容易出错啊~(ノ`Д)ノ
之后有时间,还会更新其他大数据组件的搭建,版本老是因为项目环境需要。