Hadoop大数据平台高可用的实现

1 Hadoop简介

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算

Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心

(1)HDFS:对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件等。但是 HDFS 的架构是基于一组特定的节点构建的,这是由它自身的特点决定的。这些节点包括 NameNode在 HDFS 内部提供元数据服务;DataNode为 HDFS 提供存储块。

存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。这与传统的 RAID 架构大不相同。块的大小(1.x版本默认为 64MB,2.x版本默认为128MB)和复制的块数量在创建文件时由客户机决定。NameNode 可以控制所有文件操作。HDFS 内部的所有通信都基于标准的 TCP/IP 协议 。

(2)DataNode:是在 HDFS实例中的单独机器上运行的软件。Hadoop 集群包含一个 NameNode 和大量 DataNode。DataNode 通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。Hadoop 的一个假设是:机架内部节点之间的传输速度快于机架间节点的传输速度。

DataNode 响应来自 HDFS 客户机的读写请求。它们还响应来自 NameNode 的创建、删除和复制块的命令。NameNode 依赖来自每个 DataNode 的定期心跳(heartbeat)消息。每条消息都包含一个块报告,NameNode 可以根据这个报告验证块映射和其他文件系统元数据。如果 DataNode 不能发送心跳消息,NameNode 将采取修复措施,重新复制在该节点上丢失的块。

文件操作

HDFS 的主要目的是支持以流的形式访问写入的大型文件。如果客户机想将文件写到 HDFS 上,首先需要将该文件缓存到本地的临时存储。如果缓存的数据大于所需的 HDFS 块大小,创建文件的请求将发送给 NameNode。NameNode 将以 DataNode 标识和目标块响应客户机。同时也通知将要保存文件块副本的 DataNode。当客户机开始将临时文件发送给第一个 DataNode 时,将立即通过管道方式将块内容转发给副本 DataNode。客户机也负责创建保存在相同 HDFS名称空间中的校验和(checksum)文件。在最后的文件块发送之后,NameNode 将文件创建提交到它的持久化元数据存储(在 EditLog 和 FsImage 文件)
在这里插入图片描述

2 Hadoop的搭建

官网:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html

2.1 Hadoop的搭建

(1)安装hadoop和java环境

tar zxf hadoop-3.2.1.tar.gz
tar zxf jdk-8u181-linux-x64.tar.gz
ln -s jdk1.8.0_181/  java  ## 软链接
ln -s hadoop-3.2.1   hadoop

在这里插入图片描述
(2) 创建hadoop用户

useradd -u 1001 hadoop
echo westos| passwd --stdin hadoop

(3)编辑hadoop的环境变量配置文件:

cd   /home/hadoop/hadoop/etc/hadoop
vim hadoop-env.sh

在这里插入图片描述
(4)测试

cd /home/hadoop/hadoop
mkdir input
cp etc/hadoop/*.xml input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'

在这里插入图片描述

2.2 单节点hadoop配置(伪分布式)

(1)编辑配置文件

cd hadoop/etc/hadoop
vim  workers 
localhost

(2)免密,hadoop是通过ssh的方式连接

ssh-keygen 
ssh-copy-id localhost

(3)分布式系统做格式化:bin/hdfs namenode -format
在这里插入图片描述(4)启动dfs(主节点是namenodes,从节点是datanodes)

cd hadoop/sbin

在这里插入图片描述

./start-dfs.sh

在这里插入图片描述

  • 查看进程: ps ax,分布式系统成功启动

在这里插入图片描述
(5)将java的jps二进制执行文件添加到环境变量中:vim .bash_profile

PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/hadoop/bin:$HOME/java/bin
  • 使更改的环境变量立刻生效:source .bash_profile
  • 使用jps查看HDFS是否启动

在这里插入图片描述

  • 显示文件系统的基本数据:hdfs dfsadmin -report

在这里插入图片描述(5)测试

hdfs dfs -mkdir -p /user/hadoop  ## 创建目录
hdfs dfs -put input  ## 从本地加载文件到HDFS

在这里插入图片描述

  • 查询是否拷贝成功:hdfs dfs -ls input

在这里插入图片描述

  • 开启一个9876的端口,可以访问

在这里插入图片描述
在这里插入图片描述

  • 在本机删除上相应的目录,并不会影响到已经上传到hdfs文件系统中文件
[hadoop@server1 hadoop]$ rm -rf input/  ## 删除inpute目录
[hadoop@server1 hadoop]$ rm -rf output  ## 删除output目录
[hadoop@server1 hadoop]$ hdfs dfs -ls input
Found 9 items
-rw-r--r--   1 hadoop supergroup       8260 2021-03-23 18:47 input/capacity-scheduler.xml
-rw-r--r--   1 hadoop supergroup        774 2021-03-23 18:47 input/core-site.xml
-rw-r--r--   1 hadoop supergroup      11392 2021-03-23 18:47 input/hadoop-policy.xml
-rw-r--r--   1 hadoop supergroup        775 2021-03-23 18:47 input/hdfs-site.xml
-rw-r--r--   1 hadoop supergroup        620 2021-03-23 18:47 input/httpfs-site.xml
-rw-r--r--   1 hadoop supergroup       3518 2021-03-23 18:47 input/kms-acls.xml
-rw-r--r--   1 hadoop supergroup        682 2021-03-23 18:47 input/kms-site.xml
-rw-r--r--   1 hadoop supergroup        758 2021-03-23 18:47 input/mapred-site.xml
-rw-r--r--   1 hadoop supergroup        690 2021-03-23 18:47 input/yarn-site.xml
  • 统计input目录中文件的单词数目,并输出到output目录:
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount  input output

在这里插入图片描述

  • 查看input的文件: hdfs dfs -ls input

在这里插入图片描述

  • 列出hdfs文件系统中的文件信息: hdfs dfs -ls

在这里插入图片描述

  • 读取hafs文件系统中outpu的所有文件信息:hdfs dfs -cat output/*

在这里插入图片描述

  • 查看hdfs文件系统中output目录的信息:hdfs dfs -get output

在这里插入图片描述

  • 在本地删除output目录后不会对hdfs文件系统中的output目录产生影响
rm -rf output/
hdfs dfs -ls output

在这里插入图片描述

在这里插入图片描述
(6)删除hdfs文件系统中的文件

在这里插入图片描述

  • 删除本地的output目录
rm -rf output/
  • 在浏览器端没有权限删除hdfs文件系统中的文件

在这里插入图片描述

[hadoop@server1 hadoop]$ hdfs dfs -ls output
Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2021-03-23 18:54 output/_SUCCESS
-rw-r--r--   1 hadoop supergroup       9351 2021-03-23 18:54 output/part-r-00000
[hadoop@server1 hadoop]$ hdfs dfs -rm -r output  ## 删除output目录中的所有文件
Deleted output
[hadoop@server1 hadoop]$ hdfs dfs -ls output
ls: `output': No such file or directory
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ hdfs dfs -ls ## 列出hdfs文件系统中的文件信息
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2021-03-23 18:47 input

在这里插入图片描述

2.3 完全分布式的HDFS

(1)nfs文件系统共享数据

  • 安装nfs(server1、server2、server3):
yum install nfs-utils -y yum install  nfs-utils -y

nfs服务端(server1):

vim /etc/exports
/home/hadoop *(rw,anonuid=1001,anongid=1001)  ## 将/home/zjy目录以读写的方式,同步给uid为1000和gid为1000的用户
  • 启动nfs服务:systemctl restart nfs

nfs客户端(server2、server3):

  • 创建hadoop用户
useradd -u 1001 hadoop
echo westos| passwd --stdin hadoop

挂载

showmount -e 172.25.12.1
mount 172.25.12.1:/home/hadoop/  /home/hadoop/  ## 挂载

在这里插入图片描述

(2)编辑配置文件:

cd hadoop/etc/hadoop/
vim core-site.xml
<configuration>
  <property>
        <name>fs.defaultFS</name>
        <value>hdfs://server1:9000</value>
    </property>
</configuration>
  • 修改work节点:vim workers
server2
server3
  • 编辑配置文件:vim hdfs-site.xml
<configuration>
  <property>
        <name>dfs.replication</name>
        <value>2</value>  ## 将副本数改为2
    </property>
</configuration>

(3)初始化:hdfs namenode -format

  • 执行dfs启动脚本: ./hadoop/sbin/start-dfs.sh

在这里插入图片描述

在这里插入图片描述
(4)测试

  • 上传文件:
cd   hadoop/etc/hadoop
hdfs dfs -put * input
hdfs dfs -ls
hdfs dfs -ls input

在这里插入图片描述

在这里插入图片描述

2.4 节点的扩容(server4)

(1)创建hadoop用户

useradd -u 1001 hadoop
echo westos| passwd --stdin hadoop

(2)安装nfs客户端:yum install nfs-utils -y

  • 挂载: mount 172.25.12.1:/home/hadoop/ /home/hadoop/

在这里插入图片描述
(3)编辑配置文件

  • 编辑work文件:
vim   hadoop/etc/hadoop/workers
server2
server3
server4  ## 添加

(4)启动datanode节点(server4):hdfs --daemon start datanode

在这里插入图片描述
(5)在浏览器端查看datanode节点添加成功
在这里插入图片描述

2.5 节点的缩容

(1)停止dfs服务:.hadoop/sbin/stop-dfs.sh
(2)编辑配置文件:vim hadoop/etc/hadoop/hdfs-site.xml

  <property>
     <name>dfs.hosts.exclude</name>
     <value>/home/hadoop/hadoop/etc/hadoop/dfs.exclude</value>
  </property>
  • 编辑配置文件:vim dfs.exclude
server4

(3) 启动dfs文件:.hadoop/sbin/start-dfs.sh
(4)在浏览器端查看
在这里插入图片描述

3 部署 HA 集群

3.1 Zookeeper 集群

主机名角色
server1namenode(主)
server2datanode(日志节点)
server3datanode(日志节点)
server4datanode(日志节点)
server5namenode(从)

server1~server4:

[hadoop@server1 hadoop]$ rm -fr /tmp/*

(1)创建虚拟机server5

  • 创建hadoop用户
useradd -u 1001 hadoop
echo westos| passwd --stdin hadoop
  • 安装nfs客户端:yum install nfs-utils -y
  • 挂载: mount 172.25.12.1:/home/hadoop/ /home/hadoop/

部署namenode的主从

(1)安装 zookeeper:

tar zxf zookeeper-3.4.9.tar.gz

(2)编辑配置文件

cd   zookeeper-3.4.9/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
## 2888是数据同步端口 3888是选举端口
server.1=172.25.12.2:2888:3888
server.2=172.25.12.3:2888:3888
server.3=172.25.12.4:2888:3888

(3)新建目录:mkdir /tmp/zookeeper(server2,server3,server4)

server2:echo 1 >  /tmp/zookeeper
server3:echo 2 >  /tmp/zookeeper
server4:echo 3 >  /tmp/zookeeper

(4)在各节点启动zookeeper服务:

cd zookeeper-3.4.9/bin
./zkServer.sh start
  • 查看zookeeper的状态:server3是leader,server2和server4为follower

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 Hadoop 配置

(1)编辑hadoop的配置文件

cd   hadoop/etc/hadoop
vim core-site.xml
<configuration>
  <property>
        <name>fs.defaultFS</name>
        <value>hdfs://masters</value>  ## # 指定 hdfs 的 namenode 为 masters 
    </property>
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>172.25.12.2:2181,172.25.12.3:2181,172.25.12.4:2181</value>  ## 指定 zookeeper 集群主机地址
  </property>
</configuration>
vim  hdfs-site.xml
<configuration>
  <property>
        <name>dfs.replication</name>
        <value>3</value> ## 副本的数量
    </property>

  <property>
    <name>dfs.nameservices</name>
    <value>masters</value>  ## # 指定 hdfs 的 namenode 为 masters 和core-site.xml保持一致
  </property>
  <property>
      <name>dfs.ha.namenodes.masters</name>
      <value>h1,h2</value> ## masters 下面有两个 namenode 节点,分别是 h1 和 h2
  </property>
  <property>
     <name>dfs.namenode.rpc-address.masters.h1</name>
     <value>172.25.12.1:9000</value>  ## 指定 h1 节点的 rpc 通信地址
  </property>
  <property>
     <name>dfs.namenode.http-address.masters.h1</name>
     <value>172.25.12.1:9870</value>  ##指定 h1 节点的 http 通信地址
  </property>
  <property>
     <name>dfs.namenode.rpc-address.masters.h2</name>
     <value>172.25.12.5:9000</value> ##  指定 h2节点的 rpc 通信地址
  </property>
  <property>
     <name>dfs.namenode.http-address.masters.h2</name>
     <value>172.25.12.5:9870</value>  ##指定 h2节点的 http 通信地址
  </property>
  <property>
     <name>dfs.namenode.shared.edits.dir</name>
     <value>qjournal://172.25.12.2:8485;172.25.12.3:8485;172.25.12.4:8485/masters</value>  ## # 指定 NameNode 元数据在 JournalNode 上的存放位置
  </property>
  <property>
     <name>dfs.journalnode.edits.dir</name>
     <value>/tmp/journaldata</value>  ## 指定 JournalNode 在本地磁盘存放数据的位置
  </property>
  <property>
      <name>dfs.ha.automatic-failover.enabled</name> ##开启NameNode失败自动切换
      <value>true</value>
  </property>
  <property>
     <name>dfs.client.failover.proxy.provider.masters</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>
  <property>## 使用 sshfence 隔离机制时需要 ssh 免密码
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/hadoop/.ssh/id_rsa</value>
  </property>
  <property> ## 配置 sshfence 隔离机制超时时间
      <name>dfs.ha.fencing.ssh.connect-timeout</name>
      <value>30000</value>
  </property>
</configuration>

启动 hdfs 集群(按顺序启动)

(1) 在三个 DN 上依次启动 zookeeper 集群

cd  zookeeper-3.4.9
bin/zkServer.sh start

在这里插入图片描述
(2) 在三个 DN 上依次启动 journalnode(第一次启动 hdfs 必须先启动 journalnode)

 hdfs --daemon start journalnode

在这里插入图片描述

(3)格式化 HDFS 集群

hdfs namenode -format

Namenode 数据默认存放在/tmp,需要把数据拷贝到 h2

 scp -r /tmp/hadoop-hadoop 172.25.12.5:/tmp

(4) 格式化 zookeeper (只需在 h1 上执行即可)

hdfs zkfc -formatZK

(5)启动 hdfs 集群(只需在 h1 上执行即可)

cd  hadoop/sbin
./start-dfs.sh

(6) 查看各节点状态
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • hapood的master’节点在server1上
cd  zookeeper-3.4.9/bin
./zkCli.sh -server 127.0.0.1:2181

在这里插入图片描述

[zk: 127.0.0.1:2181(CONNECTED) 1] get /hadoop-ha/masters/ActiveBreadCrumb

mastersh1server1 �F(>
cZxid = 0x200000013
ctime = Wed Mar 24 05:46:30 CST 2021
mZxid = 0x200000021
mtime = Wed Mar 24 06:45:20 CST 2021
pZxid = 0x200000013
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 28
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 2]

(7)在浏览器端查看server1和server4的dfs的状态
在这里插入图片描述
在这里插入图片描述

  • 停止server1节点的namenode服务

在这里插入图片描述

  • 此时hapood的master转移到server5上
zookeeper-3.4.9/bin
./zkCli.sh -server 127.0.0.1:2181
get /hadoop-ha/masters/ActiveBreadCrumb

在这里插入图片描述

在这里插入图片描述

  • 启动server1上的namenode服务:sbin/hadoop-daemon.sh start namenode,master回到server1上

在这里插入图片描述

yarn 的高可用

(1)编辑配置文件

cd hadoop/etc/hadoop/
vim mapred-site.xml
<configuration>
  <property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value> 
  </property>
</configuration>

vim yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
     <name>yarn.resourcemanager.ha.enabled</name>
     <value>true</value> ## 激活 RM 高可用
  </property>
  <property>
     <name>yarn.resourcemanager.cluster-id</name>
     <value>RM_CLUSTER</value> ## 指定 RM 的集群 id
  </property>
  <property>
     <name>yarn.resourcemanager.ha.rm-ids</name>
     <value>rm1,rm2</value>  ## 定义RM的节点
  </property>
  <property>
     <name>yarn.resourcemanager.hostname.rm1</name>
     <value>172.25.12.1</value>  ## 指定 RM1 的地址
  </property>
  <property>
     <name>yarn.resourcemanager.hostname.rm2</name>
     <value>172.25.12.5</value> ## 指定 RM2 的地址
  </property>
  <property>
     <name>yarn.resourcemanager.recovery.enabled</name>
     <value>true</value> ## 激活 RM 自动恢复
  </property>
  <property>
      <name>yarn.resourcemanager.store.class</name>
  ## 配置 RM 状态信息存储方式,有 MemStore 和 ZKStore    
     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  </property>
  <property>
     <name>yarn.resourcemanager.zk-address</name>
     ## 配置为zookeeper存储时,指定zookeeper集群的地址
     <value>172.25.12.2:2181,172.25.12.3:2181,172.25.12.4:2181</value>
  </property>
</configuration>

(2)启动yarn服务

 cd hadoop/sbin/
./start-yarn.sh

在这里插入图片描述

yarn --daemon start resourcemanager

在这里插入图片描述

(3)在浏览器端测试
在这里插入图片描述

  • 停止server1的 resourcemanager

在这里插入图片描述

在这里插入图片描述

  • hadoop服务迁移到server5

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值