返回总目录页

hadoop部署2

 

完全分布式部署介绍

学习目标

完全分部式是真正利用多台Linux主机来进行部署Hadoop,对Linux机器集群进行规划,使得Hadoop各个模块分别
部署在不同的多台机器上。
能够了解完全分布式部署场景

二、NameNode HA+完全分布式部署

学习目标

能够了解HA+完成分布式部署场景
能够对HA+完全分布式部署架构规划
能够对HA+完全分布式部署进行配置
预备知识

1)什么是HA?

HA的意思是High Availability高可用,指当当前工作中的机器宕机后,会自动处理这个异常,并将工作无缝地转移到
其他备用机器上去,以来保证服务的高可用。
HA方式安装部署才是最常见的生产环境上的安装部署方式。Hadoop HA是Hadoop 2.x中新添加的特性,包括
NameNode HA 和 ResourceManager HA。因为DataNode和NodeManager本身就是被设计为高可用的,所以不用
对他们进行特殊的高可用处理。

2)NameNode HA切换实现方法

Hadoop2.X对NameNode进行一个抽象:NameService 一个NameService下面有两个NameNode,分别处于Active
和Standby状态。
通过Zookeeper进行协调选举,确保只有一个活跃的NameNode。
一旦主(Active)宕掉,standby会切换成Active。
作为一个ZK集群的客户端,用来监控NN的状态信息。每个运行NN的节点必须要运行一个zkfc。

zkfc提供以下功能:

Health monitoring

zkfc定期对本地的NN发起health-check的命令,如果NN正确返回,那么这个NN被认为是OK的。否则被认为是失效
节点。

ZooKeeper session management

当本地NN是健康的时候,zkfc将会在zk中持有一个session。如果本地NN又正好是active的,那么zkfc还有持有一
个"ephemeral"的节点作为锁,一旦本地NN失效了,那么这个节点将会被自动删除。

ZooKeeper-based election

如果本地NN是健康的,并且zkfc发现没有其他的NN持有那个独占锁。那么他将试图去获取该锁,一旦成功,那么它
就需要执行Failover,然后成为active的NN节点。Failover的过程是:第一步,对之前的NN执行fence,如果需要的
话。第二步,将本地NN转换到active状态。

3)NameNode HA数据共享方法

Namenode主要维护两个文件,一个是fsimage,一个是editlog。
fsimage保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息。对于文件来说包括了数
据块描述信息、修改时间、访问时间等;对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组)
等。
editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作
都会被记录到editlog中。
上面在Active Namenode与StandBy Namenode之间的绿色区域就是JournalNode,当然数量不一定只有1个,作用
相当于NFS共享文件系统,Active Namenode往里写editlog数据,StandBy再从里面读取数据进行同步。
两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的
NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取
JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,
命名空间状态已经完全同步了。
集群启动时,可以同时启动2个NameNode。这些NameNode只有一个是active的,另一个属于standby状态。
active状态意味着提供服务,standby状态意味着处于休眠状态,只进行数据同步,时刻准备着提供服务
部署规划

 

 

实施

1)系统时间同步
[root@localhost ~]#ntpdate time1.aliyun.com
12)设置主机IP及名称解析
把/etc/hosts文件复制到所有集群主机
[root@localhost ~]#vim /etc/hosts
192.168.208.5 hd1
192.168.208.10 hd2
192.168.208.20 hd3
192.168.208.30 hd4
192.168.208.40 hd5
192.168.208.50 hd6
3)关闭防火墙及Selinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
4)部署JDK
[root@localhost ~]#firefox http://download.oracle.com
[root@localhost ~]#tar xf jdk-8u191-linux-x64.tar.gz -C /usr/local
[root@localhost ~]#mv /usr/local/jdk1.8 /usr/local/jdk
5)SSH免密登录
把密钥复制到所有主机(我这里是hd1操作,然后只从hd1复制到其它五个节点了)
[root@localhost ~]#ssh-keygen -t rsa -f /root/.ssh/id_rsa -P ''
[root@localhost ~]#cd /root/.ssh
[root@localhost ~]#cp id_rsa.pub authorized_keys
[root@localhost ~]#for i in hd2 hd3 hd4 hd5 hd6;do scp -r /root/.ssh $i:/root;done
也可以循环传输
6)zookeeper部署
6.0)zookeeper作用
ZooKeeper 是为分布式应用程序提供高性能协调服务的工具集合,译名为“动物园管理员”。
分布式应用程序可以基于它实现配置维护、命名服务、分布式同步、组服务等。
是 Hadoop集群管理的一个必不可少的模块,它主要用来解决分布式应用中经常遇到的数据管理问题,如集群管理、
统一命名服务、分布式配置管理、分布式消息队列、分布式锁、分布式协调等。
在ZooKeeper集群当中,集群中的服务器角色有两种Leader和Learner,Learner角色又分为Observer和Follower
Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协
议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。
当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Follower完成了和leader
的状态同步以后,恢复模式就结束了。状态同步保证了leader和Follower具有相同的系统状态。
如下图所示:
该ZooKeeper集群当中一共有5台服务器,有两种角色Leader和Follwer,5台服务器连通在一起,客户端又分别连在
不同的ZK服务器上。
如果当数据通过客户端1,在左边第一台Follower服务器上做了一次数据变更,它会把这个数据的变化同步到其他所
有的服务器,同步结束之后,那么其他的客户端都会获得这个数据的变化。
Zookeeper是一个由多个server组成的集群,一个leader,多个follower,每个server保存一份数据副本,全局数据
一致、分布式读写,更新请求转发,由leader实施。

Leader主要有三个功能

1. 恢复数据;
2. 维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;
3. Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进
行不同的处理。

Follower主要有四个功能

1. 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
2. 接收Leader消息并进行处理;
3. 接收Client的请求,如果为写请求,发送给Leader进行投票;
4. 返回Client结果。
zookeeper部署至hdfs集群的datanode节点,此案例共3台。

6.1)获取软件包

[root@localhost ~]#wget https://www-eu.apache.org/dist/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz

后三台部署zookeeper

 

6.2)部署软件包

每台服务器myid不同,需要分别修改,例如server.1对应的myid内容为1,server.2对应的myid内容为2,
server.3对应的myid为3。
2888端口:follower连接到leader机器的端口
3888端口:leader选举端口
[root@localhost ~]#tar xf zookeeper-3.4.13.tar.gz -C /usr/local
[root@localhost ~]#mv /usr/local/zookeeper-3.4.13 /usr/local/zookeeper
[root@localhost ~]#mv /usr/local/zookeeper/conf/zoo.sample.cfg /usr/local/zookeeper/conf/zoo.cfg
[root@localhost ~]#vim /usr/local/zookeeper/conf/zoo.cfg
dataDir=/opt/data

server.1=hd4:2888:3888
server.2=hd5:2888:3888
server.3=hd6:2888:3888
 
[root@localhost ~]#mkdir /opt/data
[root@localhost ~]#echo 1 > /opt/data/myid

6.3)添加环境变量

[root@localhost ~]#vim /etc/profile.d/hadoop.sh
export JAVA_HOME=/usr/local/jdk
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=${JAVA_HOME}/bin:${ZOOKEEPER_HOME}/bin:$PATH
[root@localhost ~]# source /etc/profile
在3台datanode节点上全部添加(后面三台,三台zookeeper节点,环境变量还可以加到这个目录下面的啊)

6.4)验证zookeeper

需要把以上文件拷贝至3台datanode,然后全部执行开启命令
[root@localhost ~]#zkServer.sh start
[root@localhost ~]#zkServer.sh status
[root@localhost ~]#zkServer.sh stop

由下图可知,dataDir才是真的指定myid的目录的。可能是版本不同的原因吧

 

 

测试成功.myid不知道是否需要填写不同的值,还是都是1就可以

10.0.0.17 hd4 follower  myid是1
10.0.0.18 hd5 follower  myid是2
10.0.0.19 hd6 leader  myid是3

7)hadoop软件包获取

[root@localhost ~]#wget  http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz
[root@localhost ~]#tar xf hadoop-2.8.5.tar.gz -C /opt

8)完全分布式(HA)配置文件修改

8.1)hadoop-env.sh

修改hadoop-env.sh 25行,mapred-env.sh 16行,yarn-env.sh 23行,针对hadoop-2.8.5版本
[root@localhost ~]#vim hadoop-env.sh
export JAVA_HOME=/usr/local/jdk

8.2)core-site.xml

/opt/data/tmp不存在,会自动创建
[root@localhost ~]#vim core-site.xml

<!-- 指定hdfs的nameservice为ns1 -->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://ns1</value>
</property>

<!-- 指定hadoop临时目录 -->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/data/tmp</value>
</property>

<!-- 指定zookeeper地址 -->
<property>
  <name>ha.zookeeper.quorum</name>
  <value>hd4:2181,hd5:2181,hd6:2181</value>
</property>

环境基本一致,所以不需要修改,直接复制上去

8.3)hdfs-site.xml

nameserver是ns1,ns1下有两个namenode:nn1,nn2;指定nn1和nn2的地址,元数据的存放位置等

[root@localhost ~]#vim hdfs-site.xml

<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
  <property>
  <name>dfs.nameservices</name>
  <value>ns1</value>
</property>

<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
  <property>
  <name>dfs.ha.namenodes.ns1</name>
  <value>nn1,nn2</value>
</property>

<!-- nn1的RPC通信地址 -->
<property>
  <name>dfs.namenode.rpc-address.ns1.nn1</name>
  <value>hd1:9000</value>
</property>

<!-- nn1的http通信地址 -->
<property>
  <name>dfs.namenode.http-address.ns1.nn1</name>
  <value>hd1:50070</value>
</property>

<!-- nn2的RPC通信地址 -->
<property>
  <name>dfs.namenode.rpc-address.ns1.nn2</name>
  <value>hd2:9000</value>
</property>

<!-- nn2的http通信地址 -->
<property>
  <name>dfs.namenode.http-address.ns1.nn2</name>
  <value>hd2:50070</value>
</property>

<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://hd4:8485;hd5:8485;hd6:8485/ns1</value>
</property>

<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/opt/data/journal</value>
</property>

<!-- 开启NameNode失败自动切换 -->
<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>

<!-- 配置失败自动切换实现方式 -->
<property>
  <name>dfs.client.failover.proxy.provider.ns1</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 配置隔离机制 -->
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>

<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/root/.ssh/id_rsa</value>
</property>

8.4)配置datanode节点记录文件 slaves

[root@localhost ~]#vim slaves
hd4
hd5
hd6

8.5)mapred-site.xml

[root@localhost ~]#cp /opt/hadoop285/etc/hadoop/mapred-site.xml.template /opt/hadoop285/etc/hadoop/mapred-site.xml
[root@localhost ~]#vim mapred-site.xml
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

8.6)yarn-site.xml

[root@localhost ~]#vim yarn-site.xml
<!-- 指定resourcemanager地址 -->
<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>hd3</value>
</property>
<!-- 指定nodemanager启动时加载server的方式为shuffle server --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>

9)复制修改后的hadoop目录到所有集群节点

[root@localhost ~]#scp -r hadoop hdX:/opt
[root@localhost ~]#scp /etc/profile.d/hadoop.sh hdX:/etc/profile.d/
[root@localhost ~]#source /etc/profile

 

 

10)在datanode节点(3台)启动zookeeper

[root@localhost ~]#zkServer.sh start

11)启动journalnode(在namenode上操作,例如hd1)

[root@localhost ~]#hadoop-daemons.sh start journalnode
分别到hd4、hd5、hd6节点上进行验证
[root@localhost ~]#jps

 

 

上面那个验证查看,没有启动成功的,上面是zk的。下面这个才是jn的

12)格式化hdfs文件系统(在namenode上操作,例如hd1)

[root@localhost ~]#hdfs namenode -format
1格式化完成后,请把/opt/data/tmp目录拷贝至hd2相应的位置,hd2将不再需要格式化,可以直接使用。
 
失败了。报错了
格式化失败:

[root@mcw04 ~]# hdfs namenode -format
23/03/11 10:13:01 INFO ipc.Client: Retrying connect to server: hd5/10.0.0.18:8485. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
23/03/11 10:13:01 INFO ipc.Client: Retrying connect to server: hd6/10.0.0.19:8485. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
23/03/11 10:13:01 INFO ipc.Client: Retrying connect to server: hd4/10.0.0.17:8485. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
23/03/11 10:13:02 INFO ipc.Client: Retrying connect to server: hd6/10.0.0.19:8485. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
23/03/11 10:13:10 WARN ipc.Client: Failed to connect to server: hd4/10.0.0.17:8485: retries get failed due to exceeded maximum allowed retries number: 10
java.net.ConnectException: Connection refused
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)

去三个节点上查端口没有开启
[root@mcw08 ~]# ss -lntup|grep 8485
[root@mcw08 ~]#


查看配置,这个端口是那个服务
hdfs-site.xml:

<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://hd4:8485;hd5:8485;hd6:8485/ns1</value>
</property>    
    
    

停止这个服务,发现没有启动
[root@mcw04 ~]# hadoop-daemons.sh stop journalnode
hd6: no journalnode to stop
hd4: no journalnode to stop
hd5: no journalnode to stop
[root@mcw04 ~]# 
    
    
在hd1上启动这个服务
[root@mcw04 ~]# hadoop-daemons.sh start journalnode
hd6: starting journalnode, logging to /opt/hadoop/logs/hadoop-root-journalnode-mcw09.out
hd5: starting journalnode, logging to /opt/hadoop/logs/hadoop-root-journalnode-mcw08.out
hd4: starting journalnode, logging to /opt/hadoop/logs/hadoop-root-journalnode-mcw07.out
[root@mcw04 ~]#    
[root@mcw04 ~]# hadoop-daemons.sh start journalnode
hd4: journalnode running as process 17035. Stop it first.
hd6: journalnode running as process 16741. Stop it first.
hd5: journalnode running as process 17113. Stop it first.
[root@mcw04 ~]#     
    
    
在hd4-6的JournalNode节点上查看,服务已经启动
[root@mcw07 ~]# jps
16627 QuorumPeerMain
17140 Jps
17035 JournalNode
[root@mcw07 ~]# 


hd1这个namenode上格式化
[root@mcw04 ~]# hdfs namenode -format


将hd1格式化生成的目录传输到hd2,省去hd2格式化,两个namenode都有这个元数据了    
[root@mcw04 ~]# ls /opt/data/
tmp
[root@mcw04 ~]# ls /opt/data/tmp/
dfs
[root@mcw04 ~]# ls /opt/data/tmp/dfs/
name
[root@mcw04 ~]# ls /opt/data/tmp/dfs/name/
current
[root@mcw04 ~]# ls /opt/data/tmp/dfs/name/current/
fsimage_0000000000000000000  fsimage_0000000000000000000.md5  seen_txid  VERSION
[root@mcw04 ~]# 
[root@mcw04 ~]# scp -rp /opt/data hd2:/opt/
VERSION                                                                                                                                                                        100%  212   122.4KB/s   00:00    
seen_txid                                                                                                                                                                      100%    2     3.1KB/s   00:00    
fsimage_0000000000000000000.md5                                                                                                                                                100%   62   100.4KB/s   00:00    
fsimage_0000000000000000000                                                                                                                                                    100%  321   728.1KB/s   00:00    
[root@mcw04 ~]# 

13)格式化zk(namenode上操作,例如hd1)

[root@localhost ~]#hdfs zkfc -formatZK

14)启动hdfs(namenode上操作,例如hd1)

[root@localhost ~]#start-dfs.sh

查看各个节点服务启动情况

15)启动yarn(namenode上操作,例如想让hd2成为resourcemanager,需要在hd2上启动。)

[root@localhost ~]#start-yarn.sh

16)访问

NameNode1:http://hd1:50070 查看NameNode状态
NameNode2:http://hd2:50070 查看NameNode状态
NameNode3:http://hd3:8088 查看yarn状态

 

 第三个页面访问失败。hd1上启动的yarn,但是ResourceManager没有启动

 之前在hd1上执行开启yarn,但是ResourceManager没有启动,在hd1上先停止。然后在hd3也就是主机6上开启,然后就成功开启了但是ResourceManager和NodeManager。我们之前规划的就是主机6作为ResourceManager,因此,我们配置里面应该是也有体现的吧。

 再次访问,可以看到已经成功访问了

 

 页面查看

 

 =====

 

 点击链接的时候,是我笔记本上,没法解析。只能给自己笔记本添加一下解析才能访问了

 ===

 ===

 ====

 

 =======

 

 

 检测使用

 创建文件夹

 从这里创建失败,没有权限。可以去使用命令行创建。

 总结

 

 

hadoop大数据统计中的应用思路

 

日志本身输出是json,然后用flink解析json,变成table。,hadoop是存储层,你可以理解原始日志是ODS层,把原始数据发送到kafka,然后用flink去处理kafka的日志,写到hadoop,
.theme.i hot air balloon 98d92063a6。 你是读取Hadoop多个日志文件,然后根据逗号切割,将第一列数据分组统计每个出现的个数么,类似于这样?

一般来说 数据链路就是
原始日志>kakfa>程序解析>原始日志存储到hdfs
然后基于hdfs的数据计算后 > 落库hdfs > 同步mysql/gp 做报表展示

程序解析这里是flink。 sparkstreaming

大致的意思可能是:
程序解析后存储到hdfs,然后用Hadoop的计算功能统计结果,把统计结果写入到hdfs,然后程序从hdfs读取统计结果中需要的字段(可能不是所有字段数据)写入到数据库。有的时候,这个统计结果,可能会同步到多个数据库,给不同的平台使用吧

 

json 日志处理后:这样

 

 

 

 

 

 

 

 
 
posted @ 2023-03-10 23:36  马昌伟  阅读(45)  评论(0编辑  收藏  举报
博主链接地址:https://www.cnblogs.com/machangwei-8/