HDFS HA 高可用搭建

HDFS HA 搭建

一、搭建高可用集群

NameNode-1NameNode-2DataNodeZookeeperZKFCJouralNode
Node01*****
Node02*****
Node03***

PS:HDFS HA基于MySQL和 Zookeeper使用 。

如果未安装:
链接: MySQL安装 :. https://blog.csdn.net/weixin_43660536/article/details/118033294
链接: ZooKeeper安装:. https://blog.csdn.net/weixin_43660536/article/details/118369963

1、准备安装环境

  • [root@node01 ~]# tar -zxvf hadoop-3.1.2.tar.gz
    [root@node01 ~]# mv hadoop-3.1.2 /opt/yjx/
    [root@node01 ~]# cd /opt/yjx/hadoop-3.1.2/etc/hadoop/
    

2、修改集群环境

  • [root@node01 hadoop]# vim hadoop-env.sh

    • ##直接在文件的最后添加
      export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64
      export HDFS_NAMENODE_USER=root
      export HDFS_DATANODE_USER=root
      export HDFS_ZKFC_USER=root
      export HDFS_JOURNALNODE_USER=root
      export YARN_RESOURCEMANAGER_USER=root
      export YARN_NODEMANAGER_USER=root
      

3、修改配置文件

  • [root@node01 hadoop]# vim core-site.xml

    • <property>
      <name>fs.defaultFS</name>
      <value>hdfs://hdfs-yjx</value>
      </property>
      <property>
      <name>hadoop.tmp.dir</name>
      <value>/var/yjx/hadoop/ha</value>
      </property>
      <property>
      <name>hadoop.http.staticuser.user</name>
      <value>root</value>
      </property>
      <property>
      <name>ha.zookeeper.quorum</name>
      <value>node01:2181,node02:2181,node03:2181</value>
      </property>
      
  • [root@node01 hadoop]# vim hdfs-site.xml

    • <property>
      <name>dfs.nameservices</name>
      <value>hdfs-yjx</value>
      </property>
      <property>
      <name>dfs.ha.namenodes.hdfs-yjx</name>
      <value>nn1,nn2</value>
      </property>
      <property>
      <name>dfs.namenode.rpc-address.hdfs-yjx.nn1</name>
      <value>node01:8020</value>
      </property>
      <property>
      <name>dfs.namenode.rpc-address.hdfs-yjx.nn2</name>
      <value>node02:8020</value>
      </property>
      <property>
      <name>dfs.namenode.http-address.hdfs-yjx.nn1</name>
      <value>node01:9870</value>
      </property>
      <property>
      <name>dfs.namenode.http-address.hdfs-yjx.nn2</name>
      <value>node02:9870</value>
      </property>
      <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://node01:8485;node02:8485;node03:8485/hdfs-yjx</value>
      </property>
      <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/var/yjx/hadoop/ha/qjm</value>
      </property>
      <property>
      <name>dfs.client.failover.proxy.provider.hdfs-yjx</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      </property>
      <property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
      <value>shell(true)</value>
      </property>
      <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/root/.ssh/id_rsa</value>
      </property>
      <property>
      <name>dfs.ha.automatic-failover.enabled</name>
      <value>true</value>
      </property>
      <property>
      <name>dfs.replication</name>
      <value>2</value>
      </property>
      
  • [root@node01 hadoop]# vim workers

    • node01
      node02
      node03
      

4、拷贝分发软件

  • 将配置好的软件分发到其他主机

    • [root@node02 ~]# scp -r root@node01:/opt/yjx/hadoop-3.1.2 /opt/yjx/
      [root@node03 ~]# scp -r root@node01:/opt/yjx/hadoop-3.1.2 /opt/yjx/
      

5、修改环境变量

  • [root@node01 hadoop]# vim /etc/profile

    • export HADOOP_HOME=/opt/yjx/hadoop-3.1.2
      export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
      
  • 将环境变量拷贝到其他主机

    • [root@node01 yjx]# scp /etc/profile root@node02:/etc/profile
      [root@node01 yjx]# scp /etc/profile root@node03:/etc/profile
      
  • 重新加载三台服务器的环境变量

    • 【123】# source /etc/profile
      

6、首先启动Zookeeper

  • 【123】zkServer.sh start
  • 【123】zkServer.sh status

7、启动JournalNode

  • 【123】 hdfs --daemon start journalnode
  • 在这里插入图片描述

8、格式化NameNode

  • [root@node01 yjx]# hdfs namenode -format
  • [root@node01 yjx]# hdfs --daemon start namenode
  • [root@node02 yjx]# hdfs namenode -bootstrapStandby
  • [root@node01 yjx]# hdfs zkfc -formatZK
  • [root@node01 yjx]# start-dfs.sh

9、关闭集群

  • [root@node01 ~]# stop-dfs.sh

    • Stopping namenodes on [node01]
      Last login: Fri Oct 30 22:06:20 CST 2020 on pts/0
      node01: Warning: Permanently added 'node01,192.168.88.101' (ECDSA) to the list of known hosts.
      Stopping datanodes
      Last login: Fri Oct 30 22:16:34 CST 2020 on pts/0
      node03: Warning: Permanently added 'node03,192.168.88.103' (ECDSA) to the list of known hosts.
      node02: Warning: Permanently added 'node02,192.168.88.102' (ECDSA) to the list of known hosts.
      node01: Warning: Permanently added 'node01,192.168.88.101' (ECDSA) to the list of known hosts.
      Stopping secondary namenodes [node02]
      Last login: Fri Oct 30 22:16:35 CST 2020 on pts/0
      node02: Warning: Permanently added 'node02,192.168.88.102' (ECDSA) to the list of known hosts.
      
  • 关机拍摄快照

    • [123]# shutdown -h now

10、重启测试集群

启动:

  • 【123】zkServer.sh start
  • [root@node01 yjx]# start-dfs.sh

测试

  • http://node01:9870
  • http://node02:9870
  • [root@node01 ~]# hdfs dfs -mkdir -p /yjx
  • [root@node01 ~]# hdfs dfs -put zookeeper-3.4.5.tar.gz /yjx/
  • [root@node01 ~]# hdfs dfs -D dfs.blocksize=1048576 -put zookeeper-3.4.5.tar.gz /yjx/

二、访问Hadoop集群

1、Java访问

  • window系统的环境变量配置

    • 解压hadoop-3.1.2.tar.gz,将解压后的文件夹存放到自己软件目录

      • 例如:D:\software\hadoop-3.1.2
    • 解压winutils-master.zip,找到3.1.2版本

      • 将所有的文件覆盖到D:\software\hadoop-3.1.2\bin目录
    • 将winutils.exe和hadoop.dll文件拷贝到 C:\Windows\System32目录下

  • 环境变量

    • 将Hadoop添加到环境变量

      • HADOOP_HOME–>D:\software\hadoop-3.1.2
      • HADOOP_USER_NAME–>root
      • Path --> %HADOOP_HOME%\bin;%HADOOP_HOME%\sbin;
    • JDK的版本也设置的和服务器版本一致

    • 修改当前Window的hosts文件

      • C:\Windows\System32\drivers\etc\hosts
      • 192.168.88.101 node01
        192.168.88.102 node02
        192.168.88.103 node03
    • 拷贝Hadoop的配置文件

      • core-site.xml
      • hdfs-site.xml
      • mapred-site.xml
      • yarn-site.xml
    • 打开Idead,创建一个普通的Maven项目

      • 添加pom.xml

      • <properties>
        	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        	<maven.compiler.source>1.8</maven.compiler.source>
        	<maven.compiler.target>1.8</maven.compiler.target>
        	<!-- Hadoop版本控制 -->
        	<hadoop.version>3.1.2</hadoop.version>
        	<!-- commons-io版本控制 -->
        	<commons-io.version>2.4</commons-io.version>
        </properties>
        
        <dependencies>
        	<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
        	<dependency>
        		<groupId>org.apache.hadoop</groupId>
        		<artifactId>hadoop-common</artifactId>
        		<version>${hadoop.version}</version>
        	</dependency>
        	<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
        	<dependency>
        		<groupId>org.apache.hadoop</groupId>
        		<artifactId>hadoop-hdfs</artifactId>
        		<version>${hadoop.version}</version>
        	</dependency>
        	<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
        	<dependency>
        		<groupId>org.apache.hadoop</groupId>
        		<artifactId>hadoop-client</artifactId>
        		<version>${hadoop.version}</version>
        	</dependency>
        	<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-common -->
        	<dependency>
        		<groupId>org.apache.hadoop</groupId>
        		<artifactId>hadoop-mapreduce-client-common</artifactId>
        		<version>${hadoop.version}</version>
        	</dependency>
        	<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
        	<dependency>
        		<groupId>org.apache.hadoop</groupId>
        		<artifactId>hadoop-mapreduce-client-core</artifactId>
        		<version>${hadoop.version}</version>
        	</dependency>
        	<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-jobclient-->
        	<dependency>
        		<groupId>org.apache.hadoop</groupId>
        		<artifactId>hadoop-mapreduce-client-jobclient</artifactId>
        		<version>${hadoop.version}</version>
        	</dependency>
        	<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        	<dependency>
        		<groupId>commons-io</groupId>
        		<artifactId>commons-io</artifactId>
        		<version>${commons-io.version}</version>
        	</dependency>
        	<dependency>
        		<groupId>com.janeluo</groupId>
        		<artifactId>ikanalyzer</artifactId>
        		<version>2012_u6</version>
        	</dependency>
        </dependencies>
        
      • package com.yjx;
        
        import org.apache.hadoop.conf.Configuration;
        import org.apache.hadoop.fs.BlockLocation;
        import org.apache.hadoop.fs.FileSystem;
        import org.apache.hadoop.fs.Path;
        
        import java.io.IOException;
        import java.util.Arrays;
        
        public class Hello01HDfs {
        
            /**
             * 文件信息
             *
             * @throws IOException
             */
            private static void pathInfo() throws IOException {
                //加载配置文件
                Configuration configuration = new Configuration(true);
                //获取文件系统
                FileSystem fileSystem = FileSystem.get(configuration);
                //创建路径的Path对象
                Path path = new Path("/yjx/hadoop-3.1.2.tar.gz");
                boolean flag = fileSystem.exists(path);
                System.out.println(fileSystem.getDefaultBlockSize(path) / 1024 / 1024);
                System.out.println(fileSystem.getDefaultReplication(path));
                BlockLocation[] bls = fileSystem.getFileBlockLocations(path, 0, 10);
                for (BlockLocation blockLocation : bls) {
                    System.out.println("HelloHdfs.hello(============================1)");
                    System.out.println(blockLocation.getLength());
                    System.out.println(blockLocation.getOffset());
                    System.out.println(Arrays.toString(blockLocation.getHosts()));
                    System.out.println(Arrays.toString(blockLocation.getNames()));
                    System.out.println(blockLocation.toString());
                    System.out.println("HelloHdfs.hello(============================2)");
                }
            }
        
            /**
             * 文件上傳和下載
             *
             * @throws IOException
             */
            private static void upload_download() throws IOException {
                //加载配置文件
                Configuration configuration = new Configuration(true);
              //获取文件系统
                FileSystem fileSystem = FileSystem.get(configuration);
                //文件上傳
                //        Path srcPath = new Path("D:\\apache-tomcat-8.5.47-windows-x64.zip");
                //        Path destPath = new Path("/yjx/");
                //        fileSystem.copyFromLocalFile(srcPath, destPath);
                //文件下載
                Path localPath = new Path("D:\\");
                Path hdfsPath = new Path("/yjx/apache-tomcat-8.5.47-windows-x64.zip");
                fileSystem.copyToLocalFile(hdfsPath, localPath);
            }
        
        }
        
        

2、Idea访问

  • 将HadoopIntellijPlugin-1.0.zip文件放到Idea的插件目录

    • D:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\plugins
  • 打开Idea添加插件,然后重启Idea

    • 在这里插入图片描述

    • 在这里插入图片描述

  • 配置HDFS

    • 在这里插入图片描述

附录:配置文件详解

1、core-site.xml

core-site.xml配置文件的作用:
    用于定义系统级别的参数,如HDFS URL、Hadoop的临时目录以及用于rack-aware集群中的配置文件的配置等,此中的参数定义会覆盖core-default.xml文件中的默认配置。

fs.defaultFS 参数的作用:
    #声明namenode的地址,相当于声明hdfs文件系统。我们可以指定某个ip地址,在ha模式中我们通常指定hdfs集群的逻辑名称

hadoop.tmp.dir 参数的作用:
    #声明hadoop工作目录的地址。

hadoop.http.staticuser.user 参数的作用:
    #在网页界面访问数据使用的用户名。默认值是一个不真实存在的用户,此用户权限很小,不能访问不同用户的数据。这保证了数据安全。也可以设置为hdfs和hadoop等具有较高权限的用户,但会导致能够登陆网页界面的人能看到其它用户数据。实际设置请综合考虑。如无特殊需求。使用默认值就好.

ha.zookeeper.quorum 参数的作用:
    #指定zookeeper集群的地址,让zookeeper帮我们管理hdfs集群。

2、hdfs-site.xml

hdfs-site.xml 配置文件的作用:
    #HDFS的相关设定,如文件副本的个数、块大小及是否使用强制权限等,此中的参数定义会覆盖hdfs-default.xml文件中的默认配置.

dfs.replication 参数的作用:
    #为了数据可用性及冗余的目的,HDFS会在多个节点上保存同一个数据块的多个副本,其默认为3个。而只有一个节点的伪分布式环境中其仅用
保存一个副本即可,这可以通过dfs.replication属性进行定义。它是一个软件级备份。

dfs.nameservices 参数的作用:
    #指定一个逻辑名称,该名称会自动去帮我们找打真实NameNode节点,这和咱们的keepalive的VIP有点类似!这个名称咱们可以自定义!但是我们正在引用时千万别引用错了!

dfs.ha.namenodes.yinzhengjie-hdfs 参数的作用:
    #看到没,上面我们定义了dfs.nameservices的名称,现在我们就用到了,我们把定义的逻辑名称指向了各个namenode的别名

dfs.namenode.rpc-address.yinzhengjie-hdfs.namenode1 参数的作用:
    #定义远程主机调用的服务器地址。

dfs.namenode.http-address.yinzhengjie-hdfs.namenode1 参数的作用:
    #上面我们定义了集群的逻辑名称,也定义节点的逻辑名称,但是真正的ip地址我们始终没有指定,因此我们这一步骤就是指定dfs.namenode.rpc-address.yinzhengjie-hdfs.namenode1对应的IP地址。当然你写主机名称也是可以的,只不过嘛你得在/etc/hosts文件做映射或者配置DNS中有对应的A记录哟!

dfs.namenode.shared.edits.dir 参数的作用:
    #配置JournalNode集群的地址。

dfs.client.failover.proxy.provider.yinzhengjie-hdfs 参数的作用:
    #配置故障转移的代理类,这是HDFS客户端找到active NameNode类名的一个代理类,如果你不配置这个项的话,那么客户端连接active namenode地址时会报错!实际上故障转移就是通过这个代理类来实现的,我们只需要默认官网的配置即可!不需要手动修改!

dfs.ha.fencing.methods 参数的作用:
    #指定ha出现故障时的隔离方法!

dfs.ha.fencing.ssh.private-key-files 参数的作用:
    #指定隔离主机的私钥PATH。

dfs.journalnode.edits.dir 参数的作用:
    #指定JN节点存放编辑日志的目录。

dfs.ha.automatic-failover.enabled 参数的作用:
    #开启自动故障转移功能.
– dfs.name.dir

– NameNode 元数据存放位置

– 默认值:使用core-site.xml中的hadoop.tmp.dir/dfs/name

– dfs.block.size

– 对于新文件切分的大小,单位byte。默认是64M,建议是128M。每一个节点都要指定,包括客户端。

– 默认值:67108864

– dfs.data.dir

– DataNode在本地磁盘存放block的位置,可以是以逗号分隔的目录列表,DataNode循环向磁盘中写入数据,每个DataNode可单独指定与其它DataNode不一样

– 默认值:${hadoop.tmp.dir}/dfs/data

– dfs.namenode.handler.count

– NameNode用来处理来自DataNode的RPC请求的线程数量 

– 建议设置为DataNode数量的10%,一般在10~200个之间 

– 如设置太小,DataNode在传输数据的时候日志中会报告“connecton refused"信息 

– 在NameNode上设定

– 默认值:10

– dfs.datanode.handler.count

– DataNode用来连接NameNode的RPC请求的线程数量

– 取决于系统的繁忙程度 

– 设置太小会导致性能下降甚至报错

– 在DataNode上设定

– 默认值:3

– dfs.datanode.max.xcievers

– DataNode可以同时处理的数据传输连接数 

– 默认值:256

– 建议值:4096

– dfs.permissions

– 如果是true则检查权限,否则不检查(每一个人都可以存取文件) 

– 于NameNode上设定

– 默认值:true

– dfs.datanode.du.reserved

– 在每个卷上面HDFS不能使用的空间大小 

– 在每个DataNode上面设定

– 默认值:0

– 建议为10737418240,即10G。需要结合MapReduce场景设置。 

– dfs.datanode.failed.volumes.tolerated

– DataNode可以容忍损块的磁盘数量,超过这个数量DataNode将会离线,所有在这个节点上面的block将会被重新复制 

– 默认是0,但是在有多块磁盘的时候一般会增大这个值

– dfs.replication

– 在文件被写入的时候,每一块将要被复制多少份 

– 默认是3份。建议3份 

– 在客户端上设定 

通常也需要在DataNode上设定

 

2、HDFS core-site.xml 参数配置

– fs.default.name

– 文件系统的名字。通常是NameNode的hostname与port

– 需要在每一个需要访问集群的机器上指定,包括集群中的节点 

– 例如:hdfs://<your_namenode>:9000/

– fs.checkpoint.dir

– 以逗号分隔的文件夹列表,SecondNameNode用来存储checkpoint image文件 

– 如果多于一个文件夹,那么都会被写入数据 

– 需要在SecondNameNode上设定

– 默认值:${hadoop.tmp.dir}/dfs/namesecondary

– hadoop.tmp.dir

– HDFS与本地磁盘的临时文件 

默认是/tmp/hadoop-${user.name}.需要在所有的节点中设定

– fs.trash.interval

– 当一个文件被删掉后,它会被放到用户目录的.Trash目录下,而不是立即删掉 

– 经过此参数设置的分钟数之后,再删掉数据 

– 默认是0,禁用此功能,建议1440(一天)

– io.file.buffer.size

– 设定在读写数据时的缓存大小,应该为硬件分页大小的2倍 

– 默认是4096,建议为65536 ( 64K)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值