Hadoop 部署安装与可用性测试教程

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

对于hadoop的安装配置,是从配置环境开始
之前做好工作的铺垫是nna,nns,dn1,dn2,dn3 上成功安装java8版本,dn1,dn2,dn3 上成功安装zookeeper。

配置:
hadoop根目录:/usr/local/share/hadoop
启动hadoop:任意路径 执行 start-all.sh
关闭hadoop:任意路径执行 stop-all.sh
环境变量配置文件:/etc/profile

1 安装包下载解压

-1 下载hadoop安装包

Wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.1.2/hadoop-3.1.2.tar.gz
  • 2 解压压缩包
tar -xzvf hadoop-3.1.2.tar.gz
#解压到在/usr/local/share文件夹下

2 配置hadoop环境变量

hadoop采用的是3.1.3版本,在部署Hadoop集群时,需要进行核心文件的配置,主要是配置core-sitr.xml hdfs-site.xml mapped-site.xml yarn-site.xml hadoop-env.sh yarn-env.sh

我们将hadoop集群所需要的环境变量配置到/etc/profile文件中,配置环境变量的命令是

添加hadoop集群环境变量
export HADOOP_HOME = /usr/local/share/hadoop
export PATH:$HADOOP  HOME

环境在部署成功后,还要输入命令使环境变量生效,不然是没有价值的,也不能起作用

使刚才的环境变量生效
source /etc/profile

如果需要验证hadoop变量是否配置成功,可以在终端输入如下命令

在终端显示环境变量
echo  $HADOOP  HOME

如果在终端可以显示对应的配置路径信息,则可以认定hadoop环境变量配置成功

3 核心文件的配置

接下来要配置的xml文件在etc/profile 里面,详细地址看图(在这里,也就是在二层hadoop里面)
在这里插入图片描述

  • core-site.xml(配置Service的url地址,Hadoop集群临时目录等信息)

在配置hadoop的临时目录,分布式文件系统服务地址,序列文件缓冲区大小等属性值时,可以通过core-site.xml文件进行设置,详细配置内容如图

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!-- 
                        指定分布式文件存储系统(HDFS)的NameService为cluster1,是NameNode的URI 
                                        -->
  <property>
      <name>fs.defaultFS</name>
          <value>hdfs://cluster1</value>
            </property>
              <!--
                                                                                                用于序列文件缓冲区的大小。这个缓冲区的大小可能是硬件页面大小的倍数,它决定了在读写操作期间缓冲
了多少数据
                                                                                                                                                        -->
  <property>
      <name>io.file.buffer.size</name>
          <value>131072</value>
            </property>
              <!-- 指定hadoop临时目录 -->
  <property>
      <name>hadoop.tmp.dir</name>
          <value>/usr/local/share/tmp</value>
            </property>
              <!--指定可以在任何IP访问 -->
  <property>
      <name>hadoop.proxyuser.hadoop.hosts</name>
          <value>*</value>
            </property>
              <!--指定所有用户可以访问 -->
  <property>
      <name>hadoop.proxyuser.hadoop.groups</name>
          <value>*</value>
            </property>
              <!-- 指定ZooKeeper地址 -->
  <property>
      <name>ha.zookeeper.quorum</name>
          <value>dn1:2181,dn2:2181,dn3:2181</value>
            </property>
            </configuration>

  • hdfs-site.xml(配置Hadoop集群的HDFS别名、通信地址、端口等信息)

在配置Hadoop集群的分布式系统文件别名、通信地址、端口信息、以及访问集群健康状态、文件存储详情页面地址等属性时,可以通过配置hdfs-site.xml文件来进行设置,详细内容见下面代码

       </property>
        <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>
                        qjournal://dn1:8485;dn2:8485;dn3:8485/cluster1
                </value>
        </property>
        <!-- 配置失败自动切换实现方式 -->
        <property>
                <name>dfs.client.failover.proxy.provider.cluster1</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>/home/hadoop/.ssh/id_rsa</value>
        </property>
        <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/usr/local/share/tmp/journal</value>
        </property>
        <!--指定支持高可用自动切换机制 -->
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>
        <!--指定NameNode名称空间的存储地址 -->
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>/usr/local/share/dfs/name</value>
        </property>
        <!--指定DataNode数据存储地址 -->
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>/usr/local/share/dfs/data</value>
        </property>
        <!-- 指定数据冗余份数 -->
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>
        <!-- 指定可以通过Web访问HDFS目录 -->
        <property>
                <name>dfs.webhdfs.enabled</name>
                <value>true</value>
        </property>
        <!-- 保证数据恢复,通过0.0.0.0来保证既可以内网地址访问,也可以外网地址访问 -->
        <property>
                <name>dfs.journalnode.http-address</name>
                <value>0.0.0.0:8480</value>
        </property>
        <property>
                <name>dfs.journalnode.rpc-address</name>
                <value>0.0.0.0:8485</value>
        </property>
        <!-- 通过ZKFailoverController来实现自动故障切换 -->
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>dn1:2181,dn2:2181,dn3:2181</value>
        </property>
</configuration>
  • mapred-site.xml(计算框架资源管理名称、历史任务访问地址等信息)
    在配置hadoop计算任务托管的框架名称、历史任务访问地址等信息时,可以通过mapred-site.xml文件进行配置,详细配置内容见下面代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!--
                        计算任务托管的资源框架名称
                                        -->
  <property>
      <name>mapreduce.framework.name</name>
          <value>yarn</value>
            </property>
              <!-- 
                                                                                                配置 MapReduce JobHistory Server 地址,默认端口10020 
                                                                                                                                                        -->
  <property>
      <name>mapreduce.jobhistory.address</name>
          <value>0.0.0.0:10020</value>
            </property>
              <!-- 
                                                                                                配置 MapReduce JobHistory Server Web 地址,默认端口19888 
                                                                                                                                                        -->
  <property>
      <name>mapreduce.jobhistory.webapp.address</name>
          <value>nna:19888</value>
            </property>
<property>
    <name>yarn.app.mapreduce.am.resource.mb</name>
        <value>512</value>
        </property>
<property>
  <name>mapreduce.map.memory.mb</name>
  <value>512</value>
</property>
<property>
  <name>mapreduce.map.java.opts</name>
  <value>-Xmx512M</value>
</property>
<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>512</value>
</property>
<property>
  <name>mapreduce.reduce.java.opts</name>
  <value>-Xmx512M</value>
</property>
<property>
  <name>mapred.child.java.opts</name>
  <value>-Xmx512M</value>
</property>
</configuration>

  • yarn-site.xml(配置资源管理器的相关内容)
    hadoop的资源管理可以通过YARN来完成资源相关分配、作业的调度与监控及数据的共享等。完成相关配置可以通过yarn-site.xml进行设置,详细配置内容见下面代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <!-- RM(Resource Manager)失联后重新链接的时间 -->
  <property>
    <name>yarn.resourcemanager.connect.retry-interval.ms</name>
    <value>2000</value>
  </property>
  <!-- 开启Resource Manager HA,默认为false -->
  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <!-- 配置Resource Manager -->
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>dn1:2181,dn2:2181,dn3:2181</value>
  </property>
  <!-- 开启故障自动切换 -->
  <property>
    <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
  <!-- rm1配置开始 -->
  <!-- 配置Resource Manager主机别名rm1角色为NameNode Active-->
  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>nna</value>
  </property>
  <!-- 配置Resource Manager主机别名rm1角色为NameNode Standby-->
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>nns</value>
  </property>
  <!-- 在nna上配置rm1,在nns上配置rm2,将配置好的文件远程复制到其它机器上,但在yarn的另一个机器上
一定要修改-->
  <property>
    <name>yarn.resourcemanager.ha.id</name>
    <value>rm1</value>
  </property>
  <!-- 开启自动恢复功能 -->
  <property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
  </property>
  <!-- 配置与zookeeper的连接地址 -->
  <property>
    <name>yarn.resourcemanager.zk-state-store.address</name>
    <value>dn1:2181,dn2:2181,dn3:2181</value>
  </property>
  <!--用于持久化RM(Resource Manager简称)状态存储,基于Zookeeper实现 -->
  <property>
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  </property>
  <!-- Zookeeper地址用于RM(Resource Manager)实现状态存储,以及HA的设置-->
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>dn1:2181,dn2:2181,dn3:2181</value>
  </property>
  <!-- 集群ID标识 -->
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>cluster1-yarn</value>
  </property>
  <!-- schelduler失联等待连接时间 -->
  <property>
    <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
    <value>5000</value>
    </property>
  <!-- 配置rm1,其应用访问管理接口 -->
  <property>
    <name>yarn.resourcemanager.address.rm1</name>
    <value>nna:8132</value>
  </property>
  <!-- 调度接口地址 -->
  <property>
    <name>yarn.resourcemanager.scheduler.address.rm1</name>
    <value>nna:8130</value>
  </property>
  <!-- RM的Web访问地址 -->
  <property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>nna:8188</value>
  </property>
  <property>
    <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
    <value>nna:8131</value>
  </property>
  <!-- RM管理员接口地址 -->
  <property>
    <name>yarn.resourcemanager.admin.address.rm1</name>
    <value>nna:8033</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.admin.address.rm1</name>
    <value>nna:23142</value>
  </property>
  <!-- rm1配置结束 -->
  <!-- rm2配置开始 -->
  <!-- 配置rm2,与rm1配置一致,只是将nna节点名称换成nns节点名称 -->
  <property>
    <name>yarn.resourcemanager.address.rm2</name>
    <value>nns:8132</value>
  </property>
  <property>
    <name>yarn.resourcemanager.scheduler.address.rm2</name>
    <value>nns:8130</value>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>nns:8188</value>
  </property>
  <property>
    <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
    <value>nns:8131</value>
  </property>
  <property>
    <name>yarn.resourcemanager.admin.address.rm2</name>
    <value>nns:8033</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.admin.address.rm2</name>
    <value>nns:23142</value>
  </property>
  <!-- rm2配置结束 -->
  <!-- NM(NodeManager得简称)的附属服务,需要设置成mapreduce_shuffle才能运行MapReduce任务 -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>                                             
  • fair-scheduler.xml(hadoop FairScheduler调度策略配置文件)
    需要注意的是,在Hadoop社区版中,如果配置FairScheduler调度策略,需要重新修改hadoop调度策略的原代码,我们是直接从网上下载的可用jar包。
    如果使用FairScheduler作为调度策略,需要编辑该文件,详细代码内容见下方
在这里插入代码片
  • hadoop-env.sh(hadoop集群启动脚本添加JAVA_HOME)

     #设置JAVA_HOME路径
      
      export JAVA_HOME = /usr/loacl/share/jdk
    
  • yarn-env.sh(资源管理器启动脚本添加JAVA_HOME)

    #设置JAVA_HOME路径
    
    export JAVA_HOME = /usr/loacl/share/jdk
  • 修改slaves文件(存放DataNode节点的文件)
    文件存在/usr/local/share/hadoop/etc/hadoop/slaves
    打开并添加如下内容:
    [root@nna hadoop]# vi /usr/local/share/hadoop/etc/hadoop/slaves
    #添加以下DataNode节点别名,一个节点别名占用一行,多个节点需换行追加
    
    dn1
    dn2
    dn3      

  • 将nna节点上的hadoop分发到其他节点上
    在完成上述文件的编辑后,将nna节点上的hadoop文件夹分发到其他的节点上,具体实现命令如下:
#使用scp,命令传输到其他节点
#scp用法:scp -r 本地目录 用户@#ip:/目录
scp -r /usr/local/share/hadoop root @nns://usr/local/share
scp -r /usr/local/share/hadoop root @dn1://usr/local/share
scp -r /usr/local/share/hadoop root @dn2://usr/local/share
scp -r /usr/local/share/hadoop root @dn3://usr/local/share

这里需要注意的是,完成各个节点的分发工作之后,要记得将nns节点的yarn-site.xml文件的yarn.resourcemanager.ha.id属性值修改为rm2,这个地方在文件的注释里是有提示的

-最后创建配置文件中需要的目录
具体实现命令如下

mkdir -p /usr/local/share/tmp
mkdir -p /usr/local/share/tmp/journal
mkdir -p /usr/local/share/dfs/name
mkdir -p /usr/local/share/dfs/data
mkdir -p /usr/local/share/yarn/local
mkdir -p /usr/local/share/log/yarn

4 效果验证

在完成hadoop核心文件的配置后,接着就可以去验证所配置的集群,其内容包括集群的启动、集群的可用性测试和集群的高可用性等。
-启动命令

  • (1)启动Zookeper集群服务(dn1,2,3)
    进入到部署的DataNode节点,分别启动Zookeper集群服务,具体实现命令如下:
zkServer.sh start

之后,通过zkServer.sh status来查看集群启动状态

共有三个DataNode节点,所以在启动完毕之后,会呈现一个leader和两个follower。
输入jps命令,终端会先启动zopkeeper服务进程。

  • (2)启动JournalNode进程(nna,nns,dn1,2,3)
    在NameNode节点,启动JournalNode服务进程(因为在格式化NameNode时,会去请求连接该服务进程)
    !!!这个地方不是或的关系,是且的关系,必须五个服务器全部启动才可以,不然后面的工作没办法进行,会报错
    具体操作命令如下:
#在NameNode节点上启动JournalNode进程
hadoop-daemons.sh start journalnode

#在DataNode节点上分别启动JournalNode进程
hadoop-daemon.sh start journalnode

在完成JournalNode服务启动后,可以在终端输入jps命令来查看,如果启动成功,终端会显示对应的服务进程(JournalNode)

  • (3)格式化NameNode节点(nna)
    在初次启动集群时,需要格式化NameNode节点,具体的操作命令如下:
#格式化NameNode节点
hdfs namenode -format
#这个初始化也并不是初次启动需要用,有时候会报未初始化的错误,这个时候格式化也能够解决问题


  • (4)注册ZNode(nna)
    向zookeeper注册ZNode,具体你操作命令如下:

#注册ZNode
hdfs zkfc -formatZK
  • (5)运行集群启动命令(nna)
    完成准备工作后,运行集群启动命令,具体操作指令如下:
#启动分布式文件系统(HDFS)
start-dfs.sh
#启动YARN服务进程
start-yarn.sh

出现问题:YARN_PROXYSERVER_USER,HDFS_ZKFC_USER没有被定义,
**解决方案:**在etc/profie中对未定义变量进行定义=root

加入下面两行代码:

export YARN_PROXYSERVER_USER=root
export HDFS_ZKFC_USER=root

配置之后进行source,
还在 打开找到hadoop/sbin文件夹,

对start-dfs.sh、stop-dfs.sh进行操作

在头部插入

#!/usr/bin/env bash
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

对start-yarn.shstop-yarn.sh 进行操作
在这两个文件的头部加入下面的代码

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

正常运行

在当前节点(nna)的终端上,输入jps命令查看相关的服务进程,
其中包含DFSZKFailoverontroller,NameNode和ResourceManager服务进程
!!!这个地方应该是三者服务都要有的,缺一不可,如果缺少证明前面操作有问题
!!!学会查看错误日志,发现问题的根源,错误从前往后改

在这里插入图片描述

  • (6)nns节点上同步nna节点上的元数据信息(nns)
    在nns节点上同步nna节点上的元数据信息,具体操作命令如下:
#同步nna节点元数据信息到nns节点
hdfs namenode -bootstrapStandby
  • (7)手动启动nns节点上的NameNode和ResourceManager服务进程(nns)
    切换到nns节点上并输入jpps命令查看相关的启动进程。
    如果发现只有DFSZKFailoverontroller,可以手动启动nns节点上的NameNode和ResourceManager服务进程
    具体操作命令如下:
#启动NameNode进程
hadoop-daemon.sh start namenode
#启动ResourceManager进程
yarn-daemon.sh start ResourceManager

#在nna节点上中配置的属性是rm1,那么在nns上的配置属性应该是rm2.这个地方一定不要忘记修改,忘记就会出错

出现问题:改动yarn-site.xml的那个rm2后,50070端口打不开
**解决方案:**只能在nna节点上start-all.sh,在nns上打开不行

**出现问题:**start-all/sh之后,没有出现resourcemanage进程
解决方案:
改fair-scheduler.xml
先找到路径,然后把yarn-site里面的调度策略配置文件的路径改掉
五个服务器都需要加

/usr/local/share/hadoop/share/hadoop/tools/sls/sample-conf/fair-scheduler.xml
  • (8)开启 查看任务运行明细和日志进程
    如果要查看任务运行明细和日志,需要开启proxyserver进程和historyserver进程
    具体操作命令如下:
#在NameNode节点开启这两个服务
yarn-daemon.sh start proxyserver
mr-jobhistory-daemon.sh start historyserver

**出现问题:**操作完之后jps检查进程,发现dn1,dn2,dn3上面没有datanode节点
解决方案手动开启: sbin/hadoop-daemon.sh start datanode

完成以上的所有步骤,整个hadoop集群即可开启成功。
可以通过浏览器来观察集群的一些信息(如各个节点的状态、分布式文件系统目录结构和版本号等)
访问地址如下:

#hadoop访问地址
http://nna:50070/
#yarn(资源管理调度)访问地址
http://nna:8188/

在这里插入图片描述

4 可用性测试

在完成hadoop集群启动后,可以通过jhadoop的一些基本命令来测试集群是否可用,如用put,get,rm等命令进行测试
具体操作命令如下:

#上传本地文件到分布式文件系中的tmp目录
hdfs dfs -put hello.txt /tmp

#下载分布式文件系统tmp目录下的hello.txt文件本地当前目录
hdfs dfs -get /tmp/hello.txt ./

#删除分布式文件系统中tmp目录下的hello.txt文件
hdfs dfs -rm -r /tmp/hello.txt

新建welcom.txt 文件 并编辑内容 如下:

在这里插入图片描述
新建成功,并成功上传到tmp文件夹中
在这里插入图片描述

为了避免混淆,把本地目录下的welcome.txt重命名为123.txt
并从远端下载下来welcome.txt
ls之后显示有welcome.txt,证明我们试验成功。
在这里插入图片描述

当执行删除命令时,最下面会提醒***文件已被删除,如下图这种就是删除成功
在这里插入图片描述

当我们再从远端下载时,下方显示No such file or directory,这证明上面的删除是有效的
在这里插入图片描述

至此,测试完毕,hadoop成功安装并正常运行!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值