1、配置ip映射,修改/etc/hosts文件
192.168.153.129 hadoop1
192.168.153.130 hadoop2
192.168.153.136 hadoop3
2、配置zookeeper集群(数量必须是奇数,起码要3台)
(1)在/zookeeper-3.5.3-beta/conf/添加一个zoo.cfg配置文件
cp -r zoo_sample.cfg zoo.cfg
(2)修改配置文件zoo.cfg
先创建文件夹
mkdir /usr/local/zookeeper-3.5.3-beta/data
修改配置文件zoo.cfg
dataDir=/usr/local/zookeeper-3.5.3-beta/data
在最后一行添加上:
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
(3)在/usr/local/zookeeper-3.5.3-beta/data创建一个myid文件,里面内容是server.N中的N
touch myid
echo "1">myid
把配置好额zk复制到其他节点
scp -r /usr/local/zookeeper-3.5.3-beta/ root@hadoop2:/usr/local
scp -r /usr/local/zookeeper-3.5.3-beta/ root@hadoop3:/usr/local
注:在其他节点上一定要修改myid的内容
在hadoop2应该把myid的内容改成2
在hadoop3应该把myid的内容改成3
(4)启动zookeeper集群
三台机器上分别启动zookeeper,启动和关闭命令如下
/usr/local/zookeeper-3.5.3-beta/bin/zkServer.sh start
/usr/local/zookeeper-3.5.3-beta/bin/zkServer.sh stop
查看启动状态
/usr/local/zookeeper-3.5.3-beta/bin/zkServer.sh status
3、配置java环境,因为hadoop是java开发的,还要配置hadoop环境变量
解压jdk1.8
解压hadoop2.9.0
修改vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_131
export JAVA_BIN=/usr/local/jdk1.8.0_131/bin
export PATH=$PATH:$JAVA_BIN
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/usr/local/hadoop-2.9.0
export PATH=$PATH:$HADOOP_HOME/bin
4、配置hadoop的xml,再分别运行JournalNode,再格式化HDFS
hadoop-2.9.0/etc/hadoop目录下是hadoop的配置文件
(1)配置hadoop-env.sh,修改JAVA_HOME
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/local/jdk1.8.0_131
(2)配置slaves文件,增加slave节点
hadoop1
hadoop2
hadoop3
(3)配置core-site.xml文件
<configuration>
<!-- 指定默认的HDFS的路径。当有多个HDFS集群同事工作时,集群名称在这里指定!该值来自于hdfs-site.xml中的配置 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 这里的路径默认是NameNode、DataNode、JournalNode等存放数据的公共目录。用户也可以自己单独指定这三类节点的目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-2.9.0/tmp</value>
</property>
<!-- zookeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>
(4)配置hdfs-site.xml
<configuration>
<!-- 指定DataNode存储block的副本数量。默认值是3个,我们现在有4个DataNode,该值不大于4即可。 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--使用federation时,HDFS集群别名。名字可以随便起,多个集群时互不重复即可-->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- 指定该集群的namenode的机器 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- 指定hadoop1的rpc地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hadoop1:9000</value>
</property>
<!-- 指定hadoop1的http地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop1:50070</value>
</property>
<!-- 指定hadoop2的rpc地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop2:9000</value>
</property>
<!-- 指定hadoop2的http地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop2:50070</value>
</property>
<!-- 指定该集群的两个namenode共享edits文件目录时,使用的journalnode集群信息 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/ns1</value>
</property>
<!-- 指定该集群是否启动自动故障恢复,即当NameNode出故障时,是否自动切换到另一台NameNode -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop-2.9.0/journaldata</value>
</property>
<!--指定该集群出故障时,那个实现类负责执行故障切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--client的failover代理配置-->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--一旦需要NameNode切换,使用ssh方式进行操作-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--如果使用ssh进行故障切换,使用ssh通信时用的密钥存储的位置-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--connect-timeout连接超时-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
(5)配置mapred-site.xml
<configuration>
<!--指定运行mapreduce的环境是yarn,与hadoop截然不同的地方 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(6)配置yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 启动HA搞可用性 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定resourcemanager的名字 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 使用了2个resourcemanager,分别指定resourcemanager的地址 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定ResourceManager1的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>rabbit1</value>
</property>
<!-- 指定ResourceManager2的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>rabbit2</value>
</property>
<!-- 指定ZooKeeper机器 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>rabbit1:2181,rabbit2:2181,rabbit3:2181</value>
</property>
<!-- 默认 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
(7)把配置好的hadoop文件复制到另外的slave机器上
scp -r hadoop-2.9.0 root@hadoop2:/usr/local
(8)启动journalnode日记节点(分别在hadoop1、hadoop2、hadoop3上执行)
/usr/local/hadoop-2.9.0/sbin/hadoop-daemon.sh start journalnode
启动节点,运行jps命令检验hadoop1、hadoop2、hadoop3上是否多了journalNode进程
(9)格式化HDFS(在hadoop1上执行即可)
在hadoop1的/usr/local/hadoop-2.9.0/bin执行命令:
hdfs namenode -format
注:
1) 执行格式化时,留意格式化过程中的报错,如果8485端口连不上,hadoop1、hadoop2、hadoop3防火墙都要打开8485端口
2)zookeeper必须正常集群运行
3)用jps查看hadoop1、hadoop2、hadoop3上面的journalNode都要正常运行
4)etc/hosts里面的主机映射名称不能带“.”、“/”、“_”等特殊符号,因为我刚开始是定义hadoop_1的别名,dns映射是没问题,但是hadoop的配置文件中是不能带这些特殊符号的。所以后面我改过来后,一切正常,能正常格式化HDFS
(10)格式化成功后会根据core-site.xml中的hadoop.tmp.dir路径生成文件,这里本人配置的是/usr/local/hadoop-2.9.0/tmp,把hadoop-2.9.0/tmp复制到hadoop2的hadoop-2.9.0下
scp -r /usr/local/hadoop-2.9.0/tmp/ root@hadoop2:/usr/local/hadoop-2.9.0
也可以在hadoop2上执行命令
hdfs namenode -bootstrap Standby
因为hadoop1、hadoop2是主备namenode节点,所以应该不需要复制到hadoop3上
(11)格式化ZKFC(在hadoop1上执行即可)
hdfs zkfc -formatZK
(12)启动HDFS(在hadoop1上执行)
启动HDFS命令:sbin/start-dfs.sh
sbin/start-dfs.sh
(13)启动YARN(在hadoop1上执行)
sbin/start-yarn.sh
(14)查看HDFS、RM
查看HDFS:http://hadoop1:50070/
查看RM:http://hadoop1:8088/
记得开放相应防火墙端口
5、访问hdfs
hadoop-2.9.0/bin的hadoop可以操作hdfs
(1)查看HDFS
hadoop fs -ls hdfs://hadoop1:9000/
或者
hadoop fs -ls /
(2)向HDFS上传一个文件
hadoop fs -put /etc/profile /
如果上传时报错Operation category READ is not supported in state standby,则标识namenode目前是standby状态,要修改为active状态才能正常工作
hadoop1和hadoop2上的namenode,必须要有一个是active状态,才能正常工作,如果两个都是standby状态,则无法操作hdfs。在http://hadoop1:50070/查看节点状态
执行以下语句改变namenode节点状态为active
hdfs haadmin -transitionToActive --forcemanual nn1
nn1是hdfs-site.xml配置中hadoop1的namenode
(3)再次查看HDFS
hadoop fs -ls /
(4)关掉处于active状态的NameNode节点
如果hadoop1上的namenode处于active状态,尝试关掉namenode
直接kill -9 关掉NameNode进程
或者
./hadoop-daemon stop namenode
hadoop2上的namenode节点会从standby变成active
注:这里本人刚开始关掉namenode,另外的namenode没有自动切换成active,原因是服务器间没有设置ssh免密码登录,设置成功后即可,可参考本人的另外一个帖子
ssh免密码登录:http://blog.youkuaiyun.com/fuck487/article/details/79361197
6、修改hdfs权限,并且开启所有节点的datanode的端口50010
修改hdfs的权限
sudo bin/hadoop dfs -chmod -R 755 /
然后尝试上传文件
hadoop fs -put /etc/profile /
报错
[root@hadoop1 bin]# hadoop fs -put /etc/profile /
18/03/19 19:19:17 INFO hdfs.DataStreamer: Exception in createBlockOutputStream
java.io.IOException: Got error, status=ERROR, status message , ack with firstBadLink as 192.168.183.130:50010
at org.apache.hadoop.hdfs.protocol.datatransfer.DataTransferProtoUtil.checkBlockOpStatus(DataTransferProtoUtil.java:118)
at org.apache.hadoop.hdfs.DataStreamer.createBlockOutputStream(DataStreamer.java:1751)
at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1655)
at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:710)
18/03/19 19:19:17 WARN hdfs.DataStreamer: Abandoning BP-2019524836-127.0.0.1-1521440751666:blk_1073741828_1004
18/03/19 19:19:17 WARN hdfs.DataStreamer: Excluding datanode DatanodeInfoWithStorage[192.168.183.130:50010,DS-0478fb46-44da-40d9-8994-d7b34276ab18,DISK]
18/03/19 19:19:17 INFO hdfs.DataStreamer: Exception in createBlockOutputStream
java.io.IOException: Got error, status=ERROR, status message , ack with firstBadLink as 192.168.183.129:50010
at org.apache.hadoop.hdfs.protocol.datatransfer.DataTransferProtoUtil.checkBlockOpStatus(DataTransferProtoUtil.java:118)
at org.apache.hadoop.hdfs.DataStreamer.createBlockOutputStream(DataStreamer.java:1751)
at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1655)
at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:710)
18/03/19 19:19:17 WARN hdfs.DataStreamer: Abandoning BP-2019524836-127.0.0.1-1521440751666:blk_1073741829_1005
18/03/19 19:19:17 WARN hdfs.DataStreamer: Excluding datanode DatanodeInfoWithStorage[192.168.183.129:50010,DS-89c3cdf0-6cab-4149-a412-38368942ff77,DISK]
这是因为其他节点的datanode没开启,datanode有开启但是50010端口没开,把全部节点的50010端口开启即可