环境准备
- 安装Java环境,zookeeper环境,修改/etc/hosts文件
node1 ip地址1
node2 ip地址2
node3 ip地址3
node4 ip地址4
- 关闭防火墙,关闭selinux,并确定防火墙状态,打开selinux文件,修改SELINUX=disabled
systemctl stop firewalld
systemctl disabled firewalld
systemctl status firewalld
vim /etc/sysconfig/selinux #打开文件
- 配置ssh免密登录
生产秘钥:
ssh-keygen
生成之后会在/root/文件夹下生产一个.ssh文件夹,打开该文件夹,将id_rsa.pub文件里面的内容写入authorized_keys(自己创建) cat id_rsa.pub >> authorized_keys
authorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥
id_rsa : 生成的私钥文件
id_rsa.pub : 生成的公钥文件
know_hosts : 已知的主机公钥清单
如果希望ssh公钥生效需满足至少下面两个条件:
1) .ssh目录的权限必须是700
2) .ssh/authorized_keys文件权限必须是600
将四个主机生产的公钥内容全写入一个 authorized_keys文件,然后辅助改文件
scp authorized_keys root@ip:/root/.ssh/
验证测试 ssh node1/2/3/4
- 同步服务器时间
安装
- 获取安装包
下载安装包:http://hadoop.apache.org/
链接: https://pan.baidu.com/s/1iZ0zU_bzMt_F2KJyoge45Q
提取码: naf9
- 上传解压文件
创建hadoop目录:解压文件
- 修改配置文件
配置环境变量
export JAVA_HOME=/home/huangjie/java/jdk1.8.0_211
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
export ZOOKEEPER_HOME=/home/huangjie/zookeeper/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_HOME/bin
export HADOOP_HOME=/home/huangjie/hadoop/hadoop-2.8.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
修改hadoop-env.sh文件讲JAVA_HOME设置问本地java环境
修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为node1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:9000</value>
</property>
<!-- 指定hadoop临时目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/huangjie/hadoop/data/hadoopdata</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>192.168.17.128:2181,192.168.17.129:2181,192.168.17.130:2181</value>
</property>
<!-- hadoop链接zookeeper的超时时长设置 -->
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>1000</value>
<description>ms</description>
</property>
</configuration>
修改hdfs-site.xml
<configuration>
<!-- 指定副本数 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 配置namenode和datanode的工作目录-数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/huangjie/hadoop/data/hadoopdata/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/huangjie/hadoop/data/hadoopdata/dfs/data</value>
</property>
<!-- 启用webhdfs -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!--指定hdfs的nameservice为myha01,需要和core-site.xml中的保持一致
dfs.ha.namenodes.[nameservice id]为在nameservice中的每一个NameNode设置唯一标示符。
配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为所有的NameNode。
例如,如果使用"myha01"作为nameservice ID,并且使用"nn1"和"nn2"作为NameNodes标示符
-->
<property>
<name>dfs.nameservices</name>
<value>myha01</value>
</property>
<!-- myha01下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.myha01</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 这里端口要和core-site.xml中fs.defaultFS保持一致 -->
<property>
<name>dfs.namenode.rpc-address.myha01.nn1</name>
<value>node1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.myha01.nn1</name>
<value>node1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.myha01.nn2</name>
<value>node2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.myha01.nn2</name>
<value>node2:50070</value>
</property>
<!-- 指定NameNode的edits元数据的共享存储位置。也就是JournalNode列表
该url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId
journalId推荐使用nameservice,默认端口号是:8485 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/myha01</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.myha01</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
<value>60000</value>
</property>
</configuration>
修改mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定mapreduce jobhistory地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<!-- 任务历史服务器的web地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
</configuration>
修改yarn-site.xml
<configuration>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node4</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 制定resourcemanager的状态信息存储在zookeeper集群上 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
修改slaves(hadoop安装目录下的/etc/hadoop/slaves)
node1
node2
node3
node4 #主机名 用于启动相应的datanode
- 将hadoop安装包分发到其他集群节点
source /etc/profile 使环境变量生效
初始化
1、启动zookeeper。(逐个启动)
zkServer.sh start
jps 查看是否有QuorumPeerMain进程
启动完毕之后查看zk状态zkServer.sh status
2、在配置的各个journalnode节点启动该进程
hadoop-daemon.sh start journalnode (出现JournalNode进程)
3、格式化namenode
hadoop namenode -format
多次格式化之后将会出现多个节点datanode未启动的问题。原因:各个节点的datanode 的urrent/VERSION中的clusterID不同所导致,每次format namenode之后要拷贝/home/huangjie/hadoop/data/hadoopdata/dfs/name(指定name目录)/current下VERSION中的clusterID到其他的节点
4、要把在node1节点上生成的元数据 给复制到 另一个namenode(node2)节点上
scp -r data/ root@192.168.17.129:/home/huangjie/hadoop/
5、格式化zkfc(只在namenode节点进行)
hdfs zkfc -formatZK
启动集群
1、启动hdfs
start-dfs.sh
可以从启动输出日志里面看到启动了哪些进程
Starting namenodes on [node1 node2]
node1: starting namenode, logging to ...
node2: starting namenode, logging to ...
node3: starting datanode, logging to ...
node4: starting datanode, logging to ...
node2: starting datanode, logging to ...
node1: starting datanode, logging to ...
Starting journal nodes [ndoe1 node2 node3]
node3: journalnode running as process 16712. Stop it first.
node2: journalnode running as process 3049. Stop it first.
node1: journalnode running as process 2739. Stop it first.
Starting ZK Failover Controllers on NN hosts [hadoop1 hadoop2]
node2: starting zkfc, logging to ...
node1: starting zkfc, logging to ...
查看各节点进程是否正常,相应的进程还在(未成功启动可进入相应的日志文件查看错误信息)
2、启动YARN
在主备 resourcemanager 中随便选择一台进行启动
start-yarn.sh(NodeManager进程)
若备用节点的 resourcemanager 没有启动起来,则手动启动起来,在node3上进行手动启动
yarn-daemon.sh start resourcemanager(ResourceManager进程)
3、启动 mapreduce 任务历史服务器
mr-jobhistory-daemon.sh start historyserver(JobHistoryServer进程)
4、查看各主节点的状态
HDFS
hdfs haadmin -getServiceState nn1/2 (standy或active)
YARN
yarn rmadmin -getServiceState rm1/2 (standy或active)
5、web界面进行查看
node1:50070
YARN node3:8088/cluster
MapReduce历史服务器web界面
查看 java 进程端口
netstat -lpten | grep java
检查所有节点的/etc/hosts配置是否正确
如果9000端口前面的IP地址是127.0.0.1的话,那可能是/etc/hosts文件中为配置有问题。如果/etc/hosts出现127.0.0.1 localhost.localdomain localhost,那么启动hadoop集群后,使用netstat命令查看端口监听情况的话,会发现9000端口前的IP地址变成了127.0.0.1,而不是master对应的IP地址(此案例为192.168.91.130),从而导致从节点访问master:9000被拒绝,但master本机可以正常使用hadoop命令 .注释掉127.0.0.1 和::1的两行
大牛博客:https://www.cnblogs.com/qingyunzong/category/1169344.html