• 大数据基础---HDFS-HA搭建


    一.简述

    上一篇了解了Zookeeper和HDFS的一些概念,今天就带大家从头到尾搭建一下,其中遇到的一些坑也顺便记录下。

    1.1 搭建的拓扑图如下:

    1.2 部署环境:Centos3.1,java1.8.0 ,Hadoop3.2,Zookeeper3.5.5

    Linux环境搭建我这里就不介绍了,请自行百度(PS:需要注意的一点是,最后一步硬盘大小最好改大一些,比如60G)。

    1.3 搭建Linux的时候可能会遇到这么几个问题:

    首先安装系统的时候不要选择精简版,这样会有很多软件不全,尽量去选择全一些的版本,比如我选择的Infrastucture Server,然后全勾上了,这样虽然占用空间大了些,但是省去了后续安装很多组件的烦恼。

    二.正文

    小技巧:在搭建之前先说个小技巧,我们搭建的时候可以先在一台虚拟机上部署,然后通过克隆到其它机器,修改部分该修改的参数就行了,这样就方便了环境的频繁部署。

    2.1 配置环境

    2.1.1 设置固定ip

     1.进入到 /etc/sysconfig/network-scripts

     2.点击Vmware上面的编辑->虚拟网络编辑器 点开NAT设置,里面可以看到网关IP

     3.编辑ifcfg配置文件,修改固定ip,网关地址,DNS映射,子网掩码等

      vim  ifcfg-eno16777736

      

    TYPE=Ethernet    

    #标记显示固定ip

    BOOTPROTO=static  
    DEFROUTE=yes
    PEERDNS=yes
    PEERROUTES=yes
    IPV4_FAILURE_FATAL=no
    IPV6INIT=yes
    IPV6_AUTOCONF=yes
    IPV6_DEFROUTE=yes
    IPV6_PEERDNS=yes
    IPV6_PEERROUTES=yes
    IPV6_FAILURE_FATAL=no

    NAME=eno16777736
    DEVICE=eno16777736
    ONBOOT=yes

    #ip地址,这个以tuge1举例,我设定的为100,后面的tuge2,tuge3,tuge4可以分别设置为101,102,103
    IPADDR=192.168.40.100

    #网关地址,这个根据上面第二步可以获得
    GATEWAY=192.168.40.2
    NETMASK=255.255.255.0

    #DNS地址
    DNS1=114.114.114.114
    DNS2=8.8.8.8

    4.重启服务:service network restart 

    2.1.2 配置hadoop环境

     1.打开tuge1,在/opt/  下面创建一个文件夹hadoop

       cd /opt/

       mkdir hadoop

     2.进入到hadoop,在官网找到对应的hadoop版本进行下载,然后对文件进行解压

     cd  hadoop

     wget  http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz

     tar -xvf  hadoop-3.2.0.tar.gz

    2.1.3 配置java环境

     3.然后回到/opt/下面创建一个java文件

     cd /opt/

     mkdir java

     4.进入到java,通过ftp将jdk上传到此目录,并进行解压

     cd java            

     tar -xvf jdk-8u221-linux-x64.tar.gz

    2.1.4 配置Zookeeper环境

     1.进入到 /opt/下面创建zookeeper文件夹

     cd /opt/

     mkdir zookeeper

     2.进入到zookeeper文件夹,下载zookeeper,然后对文件进行解压

     cd  zookeeper

     wget  http://mirror.bit.edu.cn/apache/zookeeper/stable/apache-zookeeper-3.5.5-bin.tar.gz

     tar -xvf apache-zookeeper-3.5.5-bin.tar.gz

    2.1.5 将配置写入配置文件

    打开/etc/profile 配置Hadoop和Java环境

     vim /etc/profile

     export JAVA_HOME=/opt/java/jdk1.8.0_221

     export HADOOP_HDFS_HOME=/opt/hadoop/hadoop-3.2.0

     export HADOOP_CONF_DIR=/opt/hadoop/hadoop-3.2.0/etc/hadoop

     export HADOOP_HOME=/opt/hadoop/hadoop-3.2.0

     export ZK_HOME=/opt/zookeeper/apache-zookeeper-3.5.5-bin

     PATH=$JAVA_HOME/bin:$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$ZK_HOME/bin

     CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar

     export PATH  CLASSPATH

    配置好后,使用source /etc/profile 重新加载配置文件。

    2.1.6 验证环境配置

    java --version

    hadoop version

    10.将上面配置好的tuge1克隆到tuge2,tuge3,tuge4,并修改对应的ip为101,102,103

    有关Linux克隆自行百度

    2.1.7 修改主机别名

    vim /etc/hostname 修改为tuge1

    PS:其它服务器照着配置即可

    2.1.8 修改host文件添加映射别名

     vim /etc/hosts 添加

    192.168.40.100 tuge1

    192.168.40.101 tuge2

    192.168.40.102 tuge3

    192.168.40.103 tuge4

    2.2 搭建HDFS-Zookeeper

     上面配置好环境后,接下来就是搭建HDFS了。这个可以参照官网一步一步来:

      2.2.1 安装SSH

      yum install openssh-server

      2.2.2 配置免密登陆

     cd /.ssh

    ssh-keygen -t rsa

    ssh-copy-id  localhost

    (以上配置四台都执行,然后都能免密访问了)

    在tuge1和tuge2服务器之间也设置互相免密,这样方便以后使用journalnode同步

    另外把tuge1的密钥分发到tuge2,tuge3,tuge4上面,方便tuge1对所有机器的控制

     2.2.3 配置namenode节点为tuge1,tuge2,并设置遇到故障自动切换

     编辑hadoop配置文件:

    cd /opt/hadoop/hadoop-3.2.0/etc/hadoop

    vim hdfs-site.xml

    ---------------------------------------------

    <configuration>
    <property>
    <!-- DataNode副本数,伪分布模式配置为1 -->
    <name>dfs.replication</name>
    <value>2</value>
    </property>
    <property>
    <name>dfs.http.address</name>
    <value>0.0.0.0:50070</value>
    </property>
    <!-- 启用webhdfs -->
    <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
    </property>

    <!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致
    dfs.ha.namenodes.[nameservice id]为在nameservice中的每一个NameNode设置唯一标示符。
    配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为所有的NameNode。
    例如,如果使用"node1"作为nameservice ID,并且使用"nn1"和"nn2"作为NameNodes标示符
    -->

    <property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
    </property>

    <!-- tuge1下面有一个NameNode,tuge2下面有一个NameNode,分别是nn1,nn2 -->
    <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
    </property>

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

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

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

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

    <!-- 指定NameNode的edits元数据的共享存储位置。也就是JournalNode列表
    该url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId
    journalId推荐使用nameservice,默认端口号是:8485 -->
    <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://tuge2:8485;tuge3:8485;tuge4:8485/mycluster</value>
    </property>

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

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

    <!-- 确定处于Active的Node -->
    <property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
    </property>
    <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
    <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id__rsa</value>
    </property>
    </configuration>

    ---------------------------------------------

    cd /opt/hadoop

    vim core.site.xml

     -----------------------------------------

    <configuration>
    <property>
    <!-- 元数据文件存放位置,真正使用的时候会被加载到内容中 -->
    <name>hadoop.tmp.dir</name>
    <value>/opt/hadoop/hadoop-3.2.0/ha</value>
    </property>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
    </property>

    <property>
    <name>ha.zookeeper.quorum</name>
    <value>tuge1:2181,tuge2:2181,tuge3:2181,tuge4:2181</value>
    </property>
    </configuration>

    ------------------------------------------

    PS:不要忘了,在一台机器上配置即可,然后分发到其它机器就行了

    2.2.4 指定DataNode在tuge3和tuge4上

     cd /opt/hadoop/hadoop-3.2.0/etc/hadoop

     在workers文件里面指定DataNode

     vim workers

    ------------------------

     tuge3

     tuge4

    --------------------------

    PS:弄完了分发到其它机器即可 

    2.2.5 指定zookeeper在tuge1,tuge2,tuge3和tuge4上

    cd /opt/zookeeper/apache-zookeeper-3.5.5-bin/conf

    将zoo_sample.cfg复制一份重命名为zoo.cfg 

    cp zoo_sample.cfg zoo.cfg

    vim zoo.cfg

    -------------------------------------

    dataDir=/opt/zookeeper/apache-zookeeper-3.5.5-bin/zkData

    server.1=tuge1:2888:3888
    server.2=tuge2:2888:3888
    server.3=tuge3:2888:3888
    server.4=tuge4:2888:3888

    ------------------------------------

    PS:弄完了,进行分发

    2.2.6 创建myid文件,指定每台机器的zookeeper ID

    cd /opt/zookeeper/apache-zookeeper-3.5.5-bin/

    mkdir zkData --其它服务器也相应创建下

    touch myid

    vim myid  --如果是tuge1就写1,tuge2就写2

    ---------------------------

    1  

    ---------------

    PS:分发myid到其它机器,并修改数字

     2.2.7 格式化NameNode

    在格式化之间,要先开启journalnode

    hadoop-daemon.sh start journalnode

    并且要关闭防火墙

    查看防火墙状态: systemctl status firewalld.service

    执行关闭命令: systemctl stop firewalld.service

    再次执行查看防火墙命令:systemctl status firewalld.service

    执行开机禁用防火墙自启命令  : systemctl disable firewalld.service

    做完以上步骤后在以下文件添加点内容:

    在start-dfs.sh和stop-dfs.sh文件里面添加

    ---------------------------------------------

    HDFS_DATANODE_USER=root
    HADOOP_SECURE_DN_USER=hdfs 
    HDFS_NAMENODE_USER=root 
    HDFS_SECONDARYNAMENODE_USER=root
    HDFS_JOURNALNODE_USER=root
    HDFS_ZKFC_USER=root

    在$HADOOP_HOME/etc/hadoop/hadoop-env.sh下面添加
    export HDFS_NAMENODE_USER=root
    export HDFS_DATANODE_USER=root
    export HDFS_SECONDARYNAMENODE_USER=root
    export YARN_RESOURCEMANAGER_USER=root
    export YARN_NODEMANAGER_USER=root
    export HDFS_JOURNALNODE_USER=root
    export HDFS_ZKFC_USER=root
    export JAVA_HOME=/opt/java/jdk1.8.0_221

    -----------------------------------------------

    添加完后分发。

    然后选择任意一台NameNode开始格式化

    hdfs namenode -format

    格式化完成后,在另一台同步元数据

    hdfs namenode -bootstrapStandby

    2.2.8 格式化Zookeeper

    首先启动Zookeeper (下面两个命令tuge1,tuge2,tuge3,tuge4都执行一遍)

    cd /opt/zookeeper/apache-zookeeper-3.5.5-bin/bin

    ./zkServer.sh start

    查看Zookeeper启动状态

    ./zkServer.sh status

    使用jps查看所有java进程

    开始格式化

    hdfs zkfc -formatZK

    好了,经过无数采坑,按照上面步骤终于搭建完了,最终贴下效果图:

    运行命令:

    cd /opt/hadoop/hadoop-3.2.0/sbin

    ./start-dfs.sh

     

    浏览效果:

     

    学习官网: http://hadoop.apache.org/ 

    系列传送门

  • 相关阅读:
    php中session的运行机制
    Mysql5.5修改字符集
    java中用StringBuffer写文件换行
    DatabaseMetaData 获取mysql表和字段注释
    DatabaseMetaData 获取oracle字段注释
    常用的easyui使用方法
    定位div滚动条
    easyui edatagrid 触发编辑行回掉onEdit
    java 读取类内容给指定的方法追加内容
    JS中文转换(UTF-8),中文乱码解决办法,url传递中文乱码解决
  • 原文地址:https://www.cnblogs.com/shun7man/p/11525836.html
Copyright © 2020-2023  润新知