一、QJM剖析
jn进程组成的集群:
任意时刻只能有一个nn active写,nn standby读
2n+1台:7台 保证写的机器:n/2+1 = 4台
3台 保证写的机器:n/2+1 = 2台
二、SSH互相信任关系和hosts文件配置
- 详细部署请参考此篇博客:
https://blog.csdn.net/zhikanjiani/article/details/89205904
三、JDK部署
1、下载,解压缩(注意解压时候的用户和用户组),配置环境变量。
2、 mkdir /usr/java 指定目录是因为CDH来影响的。
在hadoop001机器下可以把app目录下的软件都传输到hadoop002目录下,测试,速度贼快。
[hadoop@hadoop001 app]$ scp * hadoop002:/home/hadoop/app
jdk部署在 /usr/java 目录下
su - root tar -xzvf /home/hadoop/app/jdk-8u45-linux-x64.gz -C /usr/java/
1、为什么要部署在/usr/java目录下,因为cdh会进行影响,cdh默认目录就是/usr/java
2、jdk解压后权限修正
3台机器同时部署
四、防火墙
命令:
1、service iptables status
2、service iptables -L //查看防火墙规则
3、service iptables -F //清空防火墙规则
五、Zookeeper部署及定位
5.1 Zookeeper下文件配置
hadoop三台机器怎么统一进行解压:
-
打开SecureCRT,View --> Command (Chat) Window,右下角会出现一个Send Commands to All Sessions.
-
3台机器统一进行解压,配置软连接?
ls -n /home/hadoop/app/zookeeper-3.4.6 /home/hadoop/app/zookeeper
第一步:
cd conf //进入到ZOOKEEPER_HOME下的conf目录
cp zoo_sample.cfg zoo.cfg //拷贝一份zoo.cfg配置文件
vi zoo.cfg //编辑这个配置文件
第二步:修改zoo.cfg的dataDir目录:
zoo.cfg文本中dataDir默认存储在 /tmp下,问题是/tmp目录下每30天会进行删除,所以需要更换路径,更换后路径:dataDir=/home/hadoop/app/zookeeper/data
第三步:在zoo.cfg文本末尾加入如下:
server.1=hadoop001:2888:3888 //server.1意识是id号,后面跟着的是服务组件的通信端口
server.2=hadoop002:2888:3888
server.3=hadoop003:2888:3888
第四步:
在$ZOOKEEPER_HOME/data目录下新建一个myid文件,touch /data/myid;把数字1写进去,echo 1 > data/myid;注意有一个坑,把1写进去后要注意编辑的时候1后面不能有空格。
第五步:
传输zoo.cfg配置文件到第二台机器:scp conf/zoo.cfg hadoop002:/home/hadoop/app/zookeeper-3.4.6/conf
传输zoo.cfg配置文件到第三台机器:scp conf/zoo.cfg hadoop003:/home/hadoop/app/zookeeper-3.4.6/conf/
传输$ZOOKEEPER_HOME/data目录下的内容到第二台机器(文件夹使用-r):scp -r data hadoop002:/home/hadoop/app/zookeeper-3.4.6/
传输data目录下的内容到第三台机器:scp -r data hadoop003:/home/hadoop/app/zookeeper-3.4.6/
分别在3台机器上进行校验,进入到这个目录:/home/hadoop/app/zookeeper/data,touch myid;echo 1 >myid
echo 2 >myid
echo 3 > myid(“3“与“>”号之间有一个空格。不然会无法写入)
5.2 Zookeeper启动
1、开始启动Zookeeper,在bin目录下输入:./zkServer.sh start,再去使用命令:./zkServer.sh status,查看zookeeper节点的状态,发现都还是没有启动成功的。
如下图:hadoop001机器没有启动成功
瞎逼啥也没搞,J总在此处去检查了如下信息:
1、ps -ef|grep zookeeper 进程是否启动,我是有进程存在的
2、检查$ZOOKEEPER_HOME/data目录下的myid文件是否准确
3、又去当前用户环境变量中配置了ZOOKEEPER的环境变量
于是我也再次查看zookeeper节点的状态信息:
- ./zkServer.sh status 正常显示为一个leader,两个follower。
可以看是如下图,ZOOKEEPR进程启动(进程名为QuorumPeerMain),并且状态正确。
1、hadoop001节点:
2、hadoop002节点:
3、hadoop003节点:
5.3 shell脚本的debug模式
注意:大数据的组件启动都是通过shell脚本,可以观察shell脚本。
实验目的:把JAVA_HOME、ZOOKEEPER_HOME目录在环境变量中删除,再去shell中debug看过程信息。
1、如何打开shell脚本的debug模式:
#!/usr/bin/env bash ==>
#!/bin/bash -x //加上 -x,保存好后再去运行./zkServer.sh start命令```
2、然而并不能看懂,注意shell脚本的nohup命令,
- nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper."
集群部署有了PDF文档大家都会,难点是遇到问题咋处理?
整理:debug模式开启,完整的之心脚本,打出++号的日志,+号是执行命令,which java 找不到;_ZOO_DAEMON_OUT=指定输出目录;
六、hdfs&yarn HA部署及案例
第一步:解压hadoop2.6.0-cdh5.7.0
1、三台机器一起解压,配置软连接,并且配置环境变量
- ln -s /home/hadoop/app/hadoop-2.6.0-cdh5.7.0 /home/hadoop/app/hadoop
第二步配置core-site.xml文件:
1、因为我们已经做好了ssh的信任关系,
存放的是Hadoop集群的配置文件:
链接:https://pan.baidu.com/s/1zRDqYfDYqAtfci517PNoKQ
提取码:5g1g
2、打开上面的集群配置文件下的core-site.xml,在三台机器节点下共同创建临时目录:mkdir -p /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/tmp
3、核心点:注意这个参数:hadoop.proxyuser.hadoop.hosts,意思是hadoop的进程允许哪些用户来访问;代表hadoop进程运行的用户;修改 ==> hadoop.proxyuser.root.hosts ,这样的话就要以root用户去启动。
4、如下的配置指的是支持的压缩方式
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec
</value>
</property>
第三步:配置hdfs-site.xml
三台机器统一去创建这个目录:
- 1、mkdir -p /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/data/dfs/name(namenode 存放name table(fsimage)本地目录)
- 2、mkdir -p /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/data/dfs/data(datanode存放block本地目录)
- 3、mkdir -p /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/data/dfs/jn
第四步:scp命令把配置文件传到hadoop002、hadoop003
- scp core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml slaves hadoop002:/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop
- scp core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml slaves hadoop003:/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop
第五步:选择第一台机器格式化namenode:
- hadoop namenode -format(此命令使用前需要配置hadoop的环境变量)
第六步:格式化报错,查看报错信息发现需要先启动journalnode
- 使用命令:hadoop-daemon.sh start journalnode,jps命令查看到如下进程就说明journalnode进程已经启动;三台机器都要启动jounalnode,27025 JournalNode(pid + 进程)
第七步:格式化namenode完成后,把$HADOOP_HOME/data目录下的文件传输至hadoop002(因为只有两个NameNode,所以从第一台传输到第二台就够了)
- scp -r data/ hadoop002:/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/data
第八步:选择一台机器启动zkfc
- hdfs zkfc -formatZK
- 因为我已经部署过一次了,没有推到重来,这个节点暂时没有格式化成功。
- 格式化zkfc进程的原因,它是一个单独的进程,和ZK进行通信它会找自己的目录。
第九步:$HADOOP_HOME/etc/hadoop下的hadoop-env.sh
第八步的时候出现的问题(core-site.xml中g5和g6同时存在):
J总在core-site中配置的namespace名字没有统一:如何铲掉重做?
1、停止进程,输入如下命令:cd zookeeper --> bin/zkCli.sh --> ls / --> ls /hadoop-ha
2、删除/hadoop-ha,rmr /hadoop-ha (相当于把底层配置的元数据删掉)
3、ps -ef|grep hadoop,把journalnode给kill掉,再查看ps -ef|grep hadoop,杀掉进程
做了这几步就删掉了底层的元数据,journalnode进程杀掉了;
4、rm -rf $HADOOP_HOME/data/*
5、 rm -f core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml (三台机器上都执行这个操作)
6、再确认下,core-site.xml中有没有g5,继续上传,然后重复第四步。
可以扩展到ZOOKEEPER:
问题:
1、杀进程
2、zk中的元数据清空(最关键的一步,ZK目录清空)
3、NameNode、Journalnode、DataNode文件夹数据目录清空
有一个进程ZookeeperMain是zookeeper客户端。
6.1 开始启动HDFS集群
1、启动集群:start-dfs.sh
进程数目对比查看是否准确:
如上图出现的问题:
- 发现hadoop002机器上的namenode未启动,不知咋滴就好了;使用过:hadoop-daemon.sh start namenode,反正就好了;纠正,使用SECURECRT连接本地虚拟机,NameNode其实并没有启动成功,不知为何hadoop002的ip其实是hadoop001机器的ip。
- 原因找到了,格式化hadoop001机器下的NameNode节点后,没有把data目录下的文件传到hadoop002机器下。经过测试重新scp -r传输过去,再次启动就没问题了。
6.2 开始启动YARN
- start-yarn.sh,此命令是启动YARN,启动了第一台机器的resourcemanager,三台机器的nodeManager;
- 第二台机器的HA需要手动启动,hadoop-daemon.sh start resourcemanager
第二步:手动启动hadoop002机器上的ResourceManager,我们jps发现ResourceManager进程已经启动了但是报了一个错:could not find or load main class resourcemanager
承接第二步:又被带沟里了,启动ResourceManager的命令应该是:yarn-daemon.sh start resourcemanager;但是很神奇的是我们使用hadoop-daemon.sh start resourcemanager启动照样有进程能启动。
6.3 测试集群能否正常运行
1、hdfs dfs -ls / 这个命令和hdfs dfs -ls hdfs://ruozeG6/查看得到的效果是一样的。
2、是云主机的话,在安全列表,配置规则把端口号放开。
注意一个映射关系ip和机器名的映射:
C:\Windows\System32\drivers\etc\hosts
6.4 集群UI界面解读
hadoopUI界面:
完美:
解读:
1、命名空间是ruozeclusterg6
2、jounalnode的状态
3、Browse Directory查看文件
扩充:一份文件100M,有三个副本,300M.
YARN的UI界面:
- 需要注意的是:windows本地的hosts文件没有配置hostname+ip的映射。C:\Windows\System32\drivers\etc\hosts
6.5 jobhistory服务
注意:有一个jobhistory的服务,mapreduce的一些job通过这个服务可以查看所有历史的,在yarn上查看是有个数限制的。
如何启动: cd /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/sbin
- ./mr-jobhistory-daemon.sh start historyserver
如何通过pid查看端口号:
- netstat -nlp | grep 4382
云主机在做任何东西都是内网,我们需要和它交互都是走的外网。
测试jobhistory服务:
1、命令:./mr-jobhistory-daemon.sh start historyserver
2、通过pid查看端口号,发现jobhistory的端口号是19888
- hadoop001:19888发现进入了jobhistory页面
3、直接去$HADOOP_HOME/examples/lib下面没有找到测试jar,于是使用find命令:
- find ./ -name “example.jar”
- 执行一个命令计算圆周率:hadoop jar ./share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 5 10
4、状态都会在jobhistory的UI界面上展示:yarn重启之后记录就会被刷掉但是有了jobhistory之后,这些job就会被保存。
为什么这个任务提示失败,暂未找到原因?
J总上课演示的原因是因为cdh集成的hadoop版本不支持snappy压缩。
七、debug yarn job
如何找错误:在yarn的UI界面点击applications,点击logs,搜索error。
就能知道的是:Container launch failed for container_1567401320694_0001_01_000005 : org.apache.hadoop.yarn.exceptions.YarnException: Unauthorized request to start container.
如何查看hadoop支持的压缩方式:hadoop checknative,
八、排查SNN启动原因
九、作业
1、hadoop集群部署
2、整理如何定位问题
3、编译支持压缩的hadoop,伪分布式做就行