一、创建集群需要的虚拟机,这里我创建5台,系统版本centos7.x
|
IP地址
|
主机名
|
安装软件 |
进程(部署的服务)
|
| 192.168.137.101 |
hadoop1
|
jdk1.8,hadoop3.2.0,zookeeper3.4.14
|
namenode,ZKFC,Resourcemanager |
|
192.168.137.102
|
Hadoop2
|
jdk1.8,hadoop3.2.0,zookeeper3.4.14
|
namenode,ZKFC,Resourcemanager
|
|
192.168.137.103
|
hadoop3
|
jdk1.8,hadoop3.2.0,zookeeper3.4.14
|
datanode,zookeeper, nodemanager,journalnode
|
|
192.168.137.104
|
hadoop4
|
jdk1.8,hadoop3.2.0,zookeeper3.4.14
|
datanode,zookeeper, nodemanager,journalnode
|
|
192.168.137.105
|
hadoop5
|
jdk1.8,hadoop3.2.0,zookeeper3.4.14
|
datanode,zookeeper, nodemanager,journalnode
|
二、关闭防火墙,systemctl stop firewalld.service
设置开机不启动:chkconfig firewalld off ,查看是否生效:systemctl list-unit-files|grep firewalld
三、设置主机名:hostnamectl set-hostname hadoop1(每台设置相应的主机名)
四、编辑主机名映射对应
vim /etc/hosts
五、安装centos常用的命令工具包(如果已经安装,无需再次安装)
1、yum install -y psmisc 安装killall命令
2、yum install -y lrzsz 安装sz(下载)和rz(上传)命
3、yum install -y net-tools 安装 ifconfig 命令
4、yum install -y vim* 安装vim
5、yum install -y unzip 安装unzip命令
6、yum install -y net-tools 安装netstat命令
7、yum install -y lsof 安装lsof安装 是一个列出当前系统打开文件的工具
8、yum install sshd 安装ssh服务
9、yum install -y wget 安装wget
六、把第四步骤编辑的主机名文件hosts,scp到其余四台主机上(hadoop2,hadoop3,hadoop4,hadoop5)
scp /etc/hosts 192.168.137.102:/etc/
七、设置五台虚拟服务器的时间同步
1、 安装时间工具包ntp
yum install ntp
2、设置与指定时间服务器同步
ntpdate cn.pool.ntp.org
3、、修改配置文件,使该NTP服务器在不联网的情况下,使用本服务器的时间作为同步时间
vim /etc/ntp.conf
把如下四行代码注释掉
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
在下面再添加两行
server 127.127.0.1
fudge 127.127.0.1 stratum 10
六、创建hadoop用户hadoop(我这里直接使用root用户)
useradd hadoop 并设置密码 password hadoop
七、设置免密码登录
1、在五台机器上都输入ssh-keygen –t rsa,然后一直按回车
2、将每台的秘钥分别拷贝到其余四台上
ssh-copy-id hadoop2
3、把自己本机的秘钥写入自己的authorized_keys文件中,实现本机免秘钥登录本机
cat .ssh/id_rsa.pub >> .ssh/authorized_keys(启动hadoop,需要对本机进行免密登录)
八、安装jdk
1、解压jdk文件
tar xvf jdk-8u91-linux-x64.gz
2、设置环境变量
vim /etc/profile
最后添加下面几行:
export JAVA_HOME=/root/jdk8
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH
3、加载测试jdk环境
source /etc/profile
java -version
4、把jdk 和 /etc/profile 文件拷贝到其余四台上面
scp /etc/profile hadoop2:/etc/
scp jdk8 hadoop2:/root/
九、进入hadoop5,安装配置zookeeper
1、解压zookeeper
tar xf zookeeper-3.4.14.tar.gz
2、配置zookeeper
cd /root/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
添加下面几项
server.1=hadoop3:2888:3888
server.2=hadoop4:2888:3888
server.3=hadoop5:2888:3888
修改数据目录
dataDir=/root/zookeeper/zkdata
3、拷贝zookeeper到其余两台(hadoop3 ,hadoop4)
scp -r zookeeper hadoop3:/root/
4、启动zookeeper
bin/zkServer.sh start
十、安装配置HADOOP
1、解压hadoop
[root@hadoop1 ~]# tar xf hadoop-3.2.0.tar.gz
2、把解压的hadoop移动到安装目录/usr/local下面
[root@hadoop1 ~]# tar hadoop-3.2.0 /usr/local/
3、配置环境变量
vim /etc/profile
添加以下几行
export HADOOP_HOME=/usr/local/hadoop-3.2.0
export PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
4、修改配置文件
进入到配置文件目录
cd /usr/local/hadoop-3.2.0/etc/hadoop/
hadoop-env.sh mapred-env.sh yarn-env.sh 这三个文件添加JAVA环境变量
export JAVA_HOME=/root/jdk8
5、修改core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://nd</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-3.2.0/data/tmp</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop3:2181,hadoop4:2181,hadoop5:2181</value>
</property>
</configuration>
6、修改 hdfs-site.xml文件
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.nameservices</name> ----》NameNode集群组
<value>nd</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value> -----》128M
</property>
<property>
<name>dfs.ha.namenodes.nd</name> ------》NameNode集群的服务器定义
<value>hadoop1,hadoop2</value>
</property>
<!-- hadoop1的RPC通信地址,hadoop1所在地址 -->
<property>
<name>dfs.namenode.rpc-address.nd.hadoop1</name>
<value>hadoop1:8020</value>
</property>
<!-- hadoop1的http通信地址,外部访问地址 -->
<property>
<name>dfs.namenode.http-address.nd.hadoop1</name>
<value>hadoop1:50070</value>
</property>
<!-- hadoop2的RPC通信地址,hadoop2所在地址 -->
<property>
<name>dfs.namenode.rpc-address.nd.hadoop2</name>
<value>hadoop2:8020</value>
</property>
<!-- nn2的http通信地址,外部访问地址 -->
<property>
<name>dfs.namenode.http-address.nd.hadoop2</name>
<value>hadoop2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop3:8485;hadoop4:8485;hadoop5:8485/nd</value>
</property>
<!--指定datanode目录存放位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop-3.2.0/hdata</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop-3.2.0/data/journal</value>
</property>
<!--客户端通过代理访问namenode,访问文件系统,HDFS 客户端与Active 节点通信的Java 类,使用其确定Active 节点是否活跃 -->
<property>
<name>dfs.client.failover.proxy.provider.nd</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--这是配置自动切换的方法,有多种使用方法,具体可以看官网,在文末会给地址,这里是远程登录杀死的方法 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 这个是使用sshfence隔离机制时才需要配置ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间,这个属性同上,如果你是用脚本的方法切换,这个应该是可以不配置的 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!-- 这个是开启自动故障转移,如果你没有自动故障转移,这个可以先不配 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
7、修改 mapred-site.xml(hadoop2 修改mapred-site.xml.template名称为mapred-site.xml并修改,hadoop3直接修改)
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
</configuration>
8、修改yarn-site.xml文件
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- Site specific YARN configuration properties -->
<!--启用resourcemanager ha-->
<!--是否开启RM ha,默认是开启的-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--声明两台resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>rmcluster</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>hadoop1,hadoop2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.hadoop1</name>
<value>hadoop1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.hadoop2</name>
<value>hadoop2</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.hadoop1</name>
<value>hadoop1:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.hadoop2</name>
<value>hadoop2:8088</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop3:2181,hadoop4:2181,hadoop5:2181</value>
</property>
<!--启用自动恢复,当任务进行一半,rm坏掉,就要启动自动恢复,默认是false-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的状态信息存储在zookeeper集群,默认是存放在FileSystem里面。-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.ha.id</name> -----》定义HA集群服务器ID ,定义本机,另外一台定义修改成本机的ip或者主机名
<value>hadoop1</value>
</property>
<!--解决MapReduce运行遇到的 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster错误-->
<property>
<name>yarn.application.classpath</name>
<value>/usr/local/hadoop-3.2.0/etc/hadoop:/usr/local/hadoop-3.2.0/share/hadoop/common/lib/*:/usr/local/hadoop-3.2.0/share/hadoop/common/*:/usr/local/hadoop-3.2.0/share/hadoop/hdfs:/usr/local/hadoop-3.2.0/share/hadoop/hdfs/lib/*:/usr/local/hadoop-3.2.0/share/hadoop/hdfs/*:/usr/local/hadoop-3.2.0/share/hadoop/mapreduce/lib/*:/usr/local/hadoop-3.2.0/share/hadoop/mapreduce/*:/usr/local/hadoop-3.2.0/share/hadoop/yarn:/usr/local/hadoop-3.2.0/share/hadoop/yarn/lib/*:/usr/local/hadoop-3.2.0/share/hadoop/yarn/*</value>
</property>
</configuration>
9、配置workers(hadoop3之前是slaves)
把datanode和nodemanager的节点主机名添加到workers文件中
10、把hadoop文件夹拷贝到其余四台虚拟机服务器上
scp -r /usr/local/hadoop-3.2.0/ hadoop2:/usr/local/
scp -r /usr/local/hadoop-3.2.0/ hadoop3:/usr/local/
scp -r /usr/local/hadoop-3.2.0/ hadoop4:/usr/local/
scp -r /usr/local/hadoop-3.2.0/ hadoop5:/usr/local/
11、在hadoop2上面,yarn-site.xml文件中,添加以下内容
<property>
<name>yarn.resourcemanager.ha.id</name> -----》定义HA集群服务器ID ,定义本机,另外一台定义修改成本机的ip或者主机名
<value>hadoop2</value>
</property>
12、在hadoop1,Hadoop2,hadoop3上启动zookeeper
/root/zookeeper/bin/zkServer.sh start,看到以下信息,表示启动成功
13、在hadoop1,hadoop2,hadoop3上启动journalnode
[root@hadoop5 bin]# /usr/local/hadoop-3.2.0/sbin/hadoop-daemon.sh start journalnode
14、在hadoop1 上格式化namenode
[root@hadoop1 hadoop]# /usr/local/hadoop-3.2.0/bin/hdfs namenode -format
15、启动namenode
[root@hadoop1 hadoop]# /usr/local/hadoop-3.2.0/sbin/hadoop-daemon.sh start namenode
16、在hadoop2上面同步hadoop1的元数据
[root@hadoop2 ~]# /usr/local/hadoop-3.2.0/bin/hdfs namenode -bootstrapStandby
17、在hadoop2上面启动namenode
[root@hadoop2 ~]#/usr/local/hadoop-3.2.0/sbin/hadoop-daemon.sh start namenode
此时通过50070端口进入web浏览器页面,两个namenode都standby状态
这里可以先强制手动是其中一个节点变为active
[root@hadoop1 hadoop]# /usr/local/hadoop-3.2.0/bin/hdfs haadmin -transitionToActive -forcemanual hadoop2
可以看到下面的两个状态为hadoop1 为standby,hadoop2为active
手动故障转移已经完成,接下来配置自动故障转移
18、 先把整个集群关闭,zookeeper不关,包括hadoop1,hadoop2的namenode和hadoop3,hadoop4,hadoop5的journalnode
在hadoop1 上面执行以下命令,格式化ZKFC
[root@hadoop1 hadoop]# /usr/local/hadoop-3.2.0/bin/hdfs zkfc -formatZK
在hadoop3 上登录zookeeper
[root@hadoop3 ~]# /root/zookeeper/bin/zkCli.sh
输入ls / ,发现多了一个hadoop-ha节点,这是配置应该没有问题
19、启动集群
/usr/local/hadoop-3.2.0/sbin/start-dfs.sh
这个时候,hadoop1,hadoop2上面有两个服务进程,namenode以及zkfc
hadoop3,hadoop4,hadoop5上面有datanode,journalnode,zookeeper三个服务进程
这个时候通过50070 访问web页面,一个是standby状态,一个是active状态,测试kill掉那个active状态的namenode进程,
查看另外一个standby的状态是否变为active, 变为active说明namenode自动切换成功。
20、 启动yarn,测试resourcemanager ha ,hadoop1输入 /usr/local/hadoop-3.2.0/sbin/start-yarn.sh
hadoop2上面执行
[root@hadoop2 ~]# /usr/local/hadoop-3.2.0/sbin/yarn-daemon.sh start resourcemanager
在web 端输入hadoop2:8088自动跳转hadoop1:8088
Kill hadoop1 resourcemanager进程 hadoop2自动变为active
21、在hadoop1启动historyserver
/usr/local/hadoop-3.2.0/sbin/mr-jobhistory-daemon.sh start historyserver
通过Hadoop1:19888访问
22、功能测试
查看hadoop文件
[root@hadoop1 ~]# hadoop fs -ls /
新建目录文件夹
[root@hadoop1 ~]# hadoop dfs -mkdir /input
删除文件夹
上传文件
[root@hadoop1 ~]# hadoop fs -put worldcount.txt /input
测试MapReduce
[root@hadoop1 hadoop]#hadoop jar /usr/local/hadoop-3.2.0/share/hadoop/mapreduce/hadoop-mapreduce-examples- 3.2.0.jar wordcount /input/worldcount.txt /root/output
查看输出文件
运行MapReduce遇到的问题:
解决方案:输入hadoop classpath
然后 这些输出 直接 粘贴到 yarn 的配置文件里 yarn-site.xml的属性 <name>yarn.application.classpath</name>
<property>
<name>yarn.application.classpath</name>
<value>/usr/local/hadoop-3.2.0/etc/hadoop:/usr/local/hadoop-3.2.0/share/hadoop/common/lib/*:/usr/local/hadoop-3.2.0/share/hadoop/common/*:/usr/local/hadoop-3.2.0/share/hadoop/hdfs:/usr/local/hadoop-3.2.0/share/hadoop/hdfs/lib/*:/usr/local/hadoop-3.2.0/share/hadoop/hdfs/*:/usr/local/hadoop-3.2.0/share/hadoop/mapreduce/lib/*:/usr/local/hadoop-3.2.0/share/hadoop/mapreduce/*:/usr/local/hadoop-3.2.0/share/hadoop/yarn:/usr/local/hadoop-3.2.0/share/hadoop/yarn/lib/*:/usr/local/hadoop-3.2.0/share/hadoop/yarn/*</value>
</property>
浙公网安备 33010602011771号