admin 管理员组

文章数量: 887016

文章目录

    • 一、基础环境&插件安装(root)
    • 二、创建启动脚本,后续使用
    • 三、安装JDK(root)
    • 四、安装Hadoop
    • 五、安装 rsync(root)
    • 六、网络配置(4台服务器,root)
    • 七、rsync脚本配置(root)
    • 八、免密登录配置(4台服务器)
    • 九、zk集群搭建(10、11、12)
    • 十、hadoop集群配置(4台服务器)
    • 十一、hive搭建(10)
    • 十二、hbase集群配置(10)
    • 十三、启动方式
    • 十四、相关节点主备切换
    • 十五、yarn相关指令介绍
    • 十六、相关问题整合

ps:如果没有标注root的,全部使用hadoop用户进行安装

一、基础环境&插件安装(root)

  1. 可以直接下载我这边上传的相关包,包括搭建过程中的一些缺失包、在线yum源的一些tpm包以及ranger编译后的包。hadoop的一些基础包这边就不上传了。比如hadoop包,因为太大了,这边有提供了下载地址,可自行下载。

  2. 创建文件夹并上传需要的rpm包:mkdir /opt/rpm

  3. 安装:rpm -Uvh --force --nodeps *.rpm

  4. 所有的rpm包都是后续yum源下载的包,如果有遗漏的,可以直接使用yum源下载,如果是无网络线上环境可以参照https://blog.csdn/weixin_40496191/article/details/124508488进行无网络rpm安装

  5. 关闭防火墙

    1)systemctl stop firewalld

    2)systemctl disable firewalld.service

  6. 新建用户:useradd hadoop

  7. 设置密码:passwd hadoop -->ffcsict123

  8. 切换hadoop用户

  9. 在/home/hadoop 目录下创建 module 和 software 文件夹(software 用于存放软件安装包,而 module 用于存放解压后的文件包)

    1)mkdir /home/hadoop/module

    2)mkdir /home/hadoop/software

  10. 修改 module、software 文件夹的所属主和所属组均为 hadoop用户

chown hadoop:hadoop /home/hadoop/module
chown hadoop:hadoop /home/hadoop/software
  1. 查看 module、software 文件夹的所有者和所属组:ll

二、创建启动脚本,后续使用

  1. journalnode脚本:vi /home/hadoop/journalnode.sh

    chmod u+x /home/hadoop/journalnode.sh

    if [ $# -lt 1 ] 
    then 
        echo "No Args Input..." 
        exit ; 
    fi 
     
    case $1 in 
    "start") 
            echo " =================== 启动 journalnode 集群 ===================" 
    
            echo " --------------- 启动 node10 ---------------" 
            	ssh node10 "/home/hadoop/module/hadoop-3.2.2/sbin/hadoop-daemon.sh start journalnode" 
            echo " --------------- 启动 node11 ---------------"
    	    	ssh node11 "/home/hadoop/module/hadoop-3.2.2/sbin/hadoop-daemon.sh start journalnode" 
            echo " --------------- 启动 node12 ---------------" 
            	ssh node12 "/home/hadoop/module/hadoop-3.2.2/sbin/hadoop-daemon.sh start journalnode" 
    ;; 
    "stop") 
            echo " =================== 关闭 journalnode 集群 ===================" 
    
            echo " --------------- 关闭 node10 ---------------" 
            	ssh node10 "/home/hadoop/module/hadoop-3.2.2/sbin/hadoop-daemon.sh stop journalnode" 
            echo " --------------- 关闭 node11 ---------------"
    	    	ssh node11 "/home/hadoop/module/hadoop-3.2.2/sbin/hadoop-daemon.sh stop journalnode" 
            echo " --------------- 关闭 node12 ---------------" 
            	ssh node12 "/home/hadoop/module/hadoop-3.2.2/sbin/hadoop-daemon.sh stop journalnode" 
    ;; 
    *) 
        echo "Input Args Error..." 
    ;; 
    esac
    
  2. hadoop脚本:vi /home/hadoop/hadoop.sh

    chmod u+x /home/hadoop/hadoop.sh

    #!/bin/bash 
    if [ $# -lt 1 ] 
    then 
        echo "No Args Input..." 
        exit ; 
    fi 
     
    case $1 in 
    "start") 
            echo " =================== 启动 hadoop 集群 ===================" 
    
            echo " --------------- 启动 hdfs ---------------" 
            ssh node10 "/home/hadoop/module/hadoop-3.2.2/sbin/start-dfs.sh" 
            echo " --------------- 启动 yarn ---------------"
    	    ssh node11 "/home/hadoop/module/hadoop-3.2.2/sbin/start-yarn.sh" 
            echo " --------------- 启动 historyserver ---------------" 
            ssh node10 "/home/hadoop/module/hadoop-3.2.2/bin/mapred --daemon start historyserver" 
    ;; 
    "stop") 
            echo " =================== 关闭 hadoop 集群 ===================" 
     
            echo " --------------- 关闭 historyserver ---------------" 
            ssh node10 "/home/hadoop/module/hadoop-3.2.2/bin/mapred --daemon stop historyserver" 
            echo " --------------- 关闭 yarn ---------------" 
            ssh node11 "/home/hadoop/module/hadoop-3.2.2/sbin/stop-yarn.sh" 
            echo " --------------- 关闭 hdfs ---------------" 
            ssh node10 "/home/hadoop/module/hadoop-3.2.2/sbin/stop-dfs.sh" 
    ;; 
    *) 
        echo "Input Args Error..." 
    ;; 
    esac
    
  3. zookeeper脚本:vi /home/hadoop/zookeeper.sh

    chmod u+x /home/hadoop/zookeeper.sh

    #!/bin/bash 
    if [ $# -lt 1 ] 
    then 
        echo "No Args Input..." 
        exit ; 
    fi 
     
    case $1 in 
    "start") 
            echo " =================== 启动 node10 ===================" 
        	ssh node10 "/home/hadoop/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start" 
       	    echo " =================== 启动 node11 ===================" 
        	ssh node11 "/home/hadoop/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start" 
           	echo " =================== 启动 node12 ===================" 
        	ssh node12 "/home/hadoop/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start" 
    ;; 
    "stop") 
            echo " =================== 关闭 node10 ===================" 
        	ssh node10 "/home/hadoop/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh stop" 
       	    echo " =================== 关闭 node11 ===================" 
        	ssh node11 "/home/hadoop/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh stop" 
           	echo " =================== 关闭 node12 ===================" 
        	ssh node12 "/home/hadoop/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh stop" 
    ;; 
    *) 
        echo "Input Args Error..." 
    ;; 
    esac
    
  4. hbase脚本:vi /home/hadoop/hbase.sh

    chmod u+x /home/hadoop/hbase.sh

    #!/bin/bash
    if [ $# -lt 1 ]
    then
        echo "No Args Input..."
        exit ;
    fi
    
    case $1 in
    "start")
            echo " =================== 启动hbaes集群 ==================="
            cd /home/hadoop/hbase/hbase-2.1.0/bin
                    ./start-hbase.sh
    ;;
    "stop")
            echo " =================== 关闭hbase集群 ===================" 
                     cd /home/hadoop/hbase/hbase-2.1.0/bin
                    ./stop-hbase.sh
    ;;
    *)
        echo "Input Args Error..."
    ;;
    esac
    

三、安装JDK(root)

  1. 上传jdk-8u291-linux-x64.tar.gz包到linux服务

  2. 解压jdk:tar -xvf jdk-8u291-linux-x64.tar.gz

  3. 配置jdk环境变量:vi /etc/profile,在最后加上以下几行

    JAVA_HOME=/opt/jdk/jdk1.8.0_291
    PATH=$PATH:$JAVA_HOME/bin
    CLASSPATH=:$JAVA_HOME/lib
    export JAVA_HOME PATH CLASSPATH
    
  4. 重新导入环境变量配置:source /etc/profile

  5. 检查JDK是否安装成功,能看到相关版本信息即安装成功:java -version

四、安装Hadoop

  1. 下载hadoop-3.2.2.tar.gz:http://archive.apache/dist/hadoop/core/

  2. 上传至/home/hadoop/module

  3. 解压:tar -xvf hadoop-3.2.2.tar.gz

  4. 配置hadoop环境变量(使用root用户修改):vi /etc/profile,在最后加上以下几行

    export HADOOP_HOME=/home/hadoop/module/hadoop-3.2.2
    export PATH=$PATH:$HADOOP_HOME/bin
    export PATH=$PATH:$HADOOP_HOME/sbin
    export HADOOP_CLASSPATH=`hadoop classpath`
    
  5. 重新导入环境变量配置(使用root、hadoop分别刷新):source /etc/profile

  6. 查看版本,看看是否成功:hadoop version

五、安装 rsync(root)

  1. 安装:忽略,第一步已经rpm安装

  2. 启动 rsync 并设置开机自启:

    systemctl start rsyncd.service
    systemctl enable rsyncd.service
    
  3. 修改配置文件:vi /etc/rsyncd.conf

    # 运行RSYNC守护进程的用户
    uid = hadoop
    # 运行RSYNC守护进程的组
    gid = hadoop
    #不使用chroot
    use chroot = no
    # 最大连接数为4
    max connections = 4
    # CentOS7中yum安装不需指定pid file 否则报错
    # pid file = /var/run/rsyncd.pid
    # 指定锁文件
    lock file=/var/run/rsyncd.lock
    # 指定日志文件
    log file = /var/log/rsyncd.log
    exclude = lost+found/
    transfer logging = yes
    # 超时时间
    timeout = 900
    # 同步时跳过没有权限的目录
    ignore nonreadable = yes
    # 传输时不压缩的文件
    dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
    
  4. 重启rsync: systemctl restart rsyncd.service

六、网络配置(4台服务器,root)

  1. 克隆三台机子

  2. 主机名和IP分配(根据自己的需求分配)

    主机名node10node11node12node13
    IP地址192.168.248.10192.168.248.11192.168.248.12192.168.248.13
  3. 修改 UUID 和 IP地址:vi /etc/sysconfig/network-scripts/ifcfg-ens33

    ps:可通过uuidgen获取UUID

    TYPE=Ethernet
    PROXY_METHOD=none
    BROWSER_ONLY=yes
    NAME=ens33
    UUID=91f1d9bd-946d-42da-a54f-76ac44cc965c
    DEVICE=ens33
    ONBOOT=yes
    IPADDR=192.168.248.10
    GATEWAY=192.168.248.254
    NETMAST=255.255.255.0
    DNS1=8.8.8.8
    ZONE=public
    
  4. 修改主机名:vi /etc/hostname(每台都要)

  5. 修改主机名称映射文件(hosts):vi /etc/hosts

    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.248.10 node10
    192.168.248.11 node11
    192.168.248.12 node12
    192.168.248.13 node13
    
  6. 重置网络:service network restart

七、rsync脚本配置(root)

  1. mkdir /home/hadoop/rsync

  2. vi /home/hadoop/rsync/xsync

    if [ $# -lt 1 ]
    then
        echo Not Enough Arguement!
        exit;
    fi
    
    #2. 遍历集群所有机器
    for host in node10 node11 node12 node13
    do
        echo ====================  $host  ====================
        #3. 遍历所有目录,逐个发送
        for file in $@
        do
            #4. 判断文件是否存在
            if [ -e $file ]
                then
                    #5. 获取父目录
                    pdir=$(cd -P $(dirname $file); pwd)
                    #6. 获取当前文件的名称
                    fname=$(basename $file)
                    ssh $host "mkdir -p $pdir"
                    rsync -av $pdir/$fname $host:$pdir
                else
                    echo $file does not exists!
            fi
        done
    done
    
    
  3. 赋予xsync脚本可执行权限:chmod u+x /home/hadoop/rsync/xsync

  4. 测试xsync:/home/hadoop/rsync/xsync /home/hadoop/rsync

八、免密登录配置(4台服务器)

  1. 生成公钥和私钥:ssh-keygen -t rsa

    直接一直回车即可

  2. 将公钥拷贝至本机以及其他节点中

    ffcsict123

    1)ssh-copy-id node10

    2)ssh-copy-id node11

    3)ssh-copy-id node12

    4)ssh-copy-id node13

  3. 测试:ssh node12

九、zk集群搭建(10、11、12)

zookeeper下载:https://zookeeper.apache/releases.html#download

  1. 创建文件夹:mkdir /home/hadoop/zookeeper

  2. 进入目录:cd /home/hadoop/zookeeper

  3. 上传安装包:apache-zookeeper-3.6.3-bin.tar.gz

  4. 解压:tar -xvf apache-zookeeper-3.6.3-bin.tar.gz

  5. 创建zookeeper数据文件夹:mkdir /home/hadoop/zookeeper/tmp(自定义)

  6. 进入配置文件目录:cd /home/hadoop/zookeeper/apache-zookeeper-3.6.3-bin/conf

  7. 将“zoo_sample.cfg”重命名为“zoo.cfg”,并打开配置:mv zoo_sample.cfg zoo.cfg

    4.1 打开zoo.cfg,修改数据文件夹地址:dataDir=/home/hadoop/zookeeper/tmp

    4.2 打开zoo.cfg,如果需要变更zookeeper端口号,可修改:clientPort=端口号,默认2181

    4.3 打开zoo.cfg,修改8080端口:admin.serverPort=8888(无用端口)

    4.4 打开zoo.cfg,添加集群配置

    #ip+数据同步+通信端口,保证zookeeper、数据同步、通信端口三个端口不同
    server.1=0.0.0.0:2888:3888
    server.2=192.168.248.11:2888:3888
    server.3=192.168.248.12:2888:3888
    
    #ip+数据同步+通信端口,保证zookeeper、数据同步、通信端口三个端口不同
    server.1=192.168.248.10:2888:3888
    server.2=192.168.248.11:2888:3888
    server.3=192.168.248.12:2888:3888
    
  8. 修改配置文件:vi /home/hadoop/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkEnv.sh

    首行添加JAVA_HOME路径的申明

    JAVA_HOME=/opt/jdk/jdk1.8.0_291
    
  9. 进入zookeeper数据文件目录:cd /home/hadoop/zookeeper/tmp

  10. 新建myid并且写入对应的myid,myid为第7步对应的数字(server.数字)

服务器192.168.248.10:echo 1 > myid
服务器192.168.248.11:echo 2 > myid
服务器192.168.248.12:echo 3 > myid    
  1. 启动zookeeper脚本:cd /home/hadoop --> ./zookeeper.sh start

  2. 查看主从状态:/home/hadoop/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh status

十、hadoop集群配置(4台服务器)

  1. 节点功能

    ps:NameNode、SecondaryNameNod和ResourceManage很耗内存资源,建议不要配置在同一节点上

    node10node11node12node13
    HDFSNameNodeNameNodeDataNodeDataNode
    YARNResourceManagerResourceManagerNodeManagerNodeManager
    hbaseHMasterHMaster、HRegionServerHRegionServerHRegionServer
    hivehive
    mysqlmysql
    zookeeperzookeeperzookeeperzookeeper
  2. 修改核心配置文件:vi /home/hadoop/module/hadoop-3.2.2/etc/hadoop/core-site.xml

    在中间添加配置

    <!-- 指定 NameNode 的地址 --> 
    <property> 
        <name>fs.defaultFS</name> 
        <value>hdfs://mycluster</value> 
    </property> 
    
    <!-- 指定 hadoop 数据的存储目录 --> 
    <property> 
        <name>hadoop.tmp.dir</name> 
        <value>/home/hadoop/module/hadoop-3.2.2/data</value> 
    </property> 
    
    <!-- 配置 HDFS 网页登录使用的静态用户为 hadoop --> 
    <property> 
        <name>hadoop.http.staticuser.user</name> 
        <value>hadoop</value> 
    </property>
    <!-- 考虑配置,整合hive 用户代理设置 --> 
    <property>
        <name>hadoop.proxyuser.hadoop.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.hadoop.groups</name>
        <value>*</value>
    </property>
    <property>               
        <name>ha.zookeeper.quorum</name>       
        <value>node10:2181,node11:2181,node12:2181</value>   
     </property>    
     <property>              
        <name>ha.zookeeper.session-timeout.ms</name>      
        <value>10000</value>  
     </property>
    
  3. 修改HDFS配置文件:vi /home/hadoop/module/hadoop-3.2.2/etc/hadoop/hdfs-site.xml

    在标签中添加配置

      
        <!-- 副本数dfs.replication默认值3,可不配置 --> 
        <property>               
        	<name>dfs.replication</name>       
        	<value>3</value>    
        </property>  
        
        <!-- 节点数据存储地址 --> 
        <property>                
        	<name>dfs.namenode.name.dir</name>        
        	<value>/home/hadoop/module/hadoop-3.2.2/namenode/data</value>    
        </property>    
        <property>                
        	<name>dfs.datanode.data.dir</name>        
        	<value>/home/hadoop/module/hadoop-3.2.2/datanode/data</value>    
        </property>  
        
        <!-- 主备配置 --> 
        <!-- 为namenode集群定义一个services name --> 
        <property>                
        	<name>dfs.nameservices</name>        
        	<value>mycluster</value>    
        </property>    
        <!-- 声明集群有几个namenode节点 -->
        <property>                
        	<name>dfs.ha.namenodes.mycluster</name>        
        	<value>nn1,nn2</value>    
        </property>
        <!-- 指定 RPC通信地址 的地址 --> 
        <property>                
        	<name>dfs.namenode.rpc-address.mycluster.nn1</name>       
        	<value>node10:8020</value>   
        </property>
        <!-- 指定 RPC通信地址 的地址 --> 
        <property>                
            <name>dfs.namenode.rpc-address.mycluster.nn2</name>        
            <value>node11:8020</value>    
        </property>  
        <!-- http通信地址 web端访问地址 --> 
        <property>                
                <name>dfs.namenode.http-address.mycluster.nn1</name>        
                <value>node10:50070</value> 
        </property> 
        <!-- http通信地址 web 端访问地址 --> 
        <property>                
                <name>dfs.namenode.http-address.mycluster.nn2</name>      
                <value>node11:50070</value>   
         </property>  
                    
         <!-- 声明journalnode集群服务器 -->
         <property>                
                <name>dfs.namenode.shared.edits.dir</name> 
                <value>qjournal://node10:8485;node11:8485;node12:8485/mycluster</value>   
    	 </property>   
         <!-- 声明journalnode服务器数据存储目录 -->
         <property>              
                <name>dfs.journalnode.edits.dir</name>        
                <value>/home/hadoop/module/hadoop-3.2.2/journalnode/data</value>  
         </property>
         <!-- 开启NameNode失败自动切换 -->
         <property>               
                <name>dfs.ha.automatic-failover.enabled</name>     
                <value>true</value>    
         </property>
         <!-- 隔离:同一时刻只能有一台服务器对外响应 -->
    	<property>
            <name>dfs.ha.fencing.methods</name>
            <value>
                sshfence
                shell(/bin/true)
            </value>
        </property>
    
         <!-- 配置失败自动切换实现方式,通过ConfiguredFailoverProxyProvider这个类实现自动切换 -->
         <property>              
                <name>dfs.client.failover.proxy.provider.mycluster</name>    
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>   
         </property>          
             
         <!-- 指定上述选项ssh通讯使用的密钥文件在系统中的位置。 -->
         <property>              
                <name>dfs.ha.fencing.ssh.private-key-files</name>       
                <value>/root/.ssh/id_rsa</value>    
          </property>  
          <!-- 配置sshfence隔离机制超时时间(active坏了之后,standby如果没有在30秒之内未连接上,那么standby将变成active) -->
          <property>               
                <name>dfs.ha.fencing.ssh.connect-timeout</name>       
                <value>30000</value>    
         </property> 
             
         <!-- 开启hdfs允许创建目录的权限,配置hdfs-site.xml -->
         <property>
       	 	<name>dfs.permissions.enabled</name>
       	 	<value>false</value>
    	</property>
        <!-- 使用host+hostName的配置方式 -->       
    	<property>
    		<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
    		<value>false</value>
    	</property>
    
  4. 修改YARN配置文件:vi /home/hadoop/module/hadoop-3.2.2/etc/hadoop/yarn-site.xml

    根据虚拟机内存进行设置,参照:https://blog.csdn/u010452388/article/details/98234147

    在标签中添加配置

     <!-- 指定yarn占电脑资源,默认88g --> 
     <property>
      <name>yarn.nodemanager.resource.cpu-vcores</name>
      <value>12</value>
    </property>
    <property>
      <name>yarn.nodemanager.resource.memory-mb</name>
      <value>10240</value>
    </property>
    
     <property>
        <name>yarn.log.server.url</name>
        <value>http://node10:19888/jobhistory/logs</value>
    </property>
        <!-- 指定 MR 走 shuffle --> 
        <property>                
        	<name>yarn.nodemanager.aux-services</name>        
        	<value>mapreduce_shuffle</value>    
    	</property>  
        <!-- 开启日志聚集功能 --> 
        <property>               
        	<name>yarn.log-aggregation-enable</name>        
        	<value>true</value>    
        </property> 
        <!-- 设置日志保留时间为 7--> 
        <property>                
        	<name>yarn.log-aggregation.retain-seconds</name>        
        	<value>86400</value>   
        </property> 
        
        <!-- 主备配置 --> 
        <!-- 启用resourcemanager ha -->
        <property>                
        	<name>yarn.resourcemanager.ha.enabled</name>        
        	<value>true</value>    
        </property>    
        <property>                
        	<name>yarn.resourcemanager.cluster-id</name>        
        	<value>my-yarn-cluster</value>    
        </property>   
        <!-- 声明两台resourcemanager的地址 -->
        <property>                
        	<name>yarn.resourcemanager.ha.rm-ids</name>        
        	<value>rm1,rm2</value>    
        </property>    
        <property>                
        	<name>yarn.resourcemanager.hostname.rm1</name>        
        	<value>node10</value>    
        </property>    
        <property>                
        	<name>yarn.resourcemanager.hostname.rm2</name>        
        	<value>node11</value>    
        </property>    
        <property>                
        	<name>yarn.resourcemanager.webapp.address.rm1</name>        
        	<value>node10:8088</value>    
        </property>    
        <property>                
            <name>yarn.resourcemanager.webapp.address.rm2</name>        
            <value>node11:8088</value>    
        </property> 
        <!-- 指定zookeeper集群的地址 -->
        <property>                
            <name>yarn.resourcemanager.zk-address</name>        
            <value>node10:2181,node11:2181,node12:2181</value>    
        </property>
        <!-- 启用自动恢复 -->
        <property>                
            <name>yarn.resourcemanager.recovery.enabled</name>        
            <value>true</value>    
        </property> 
        <!-- 指定resourcemanager的状态信息存储在zookeeper集群 -->
        <property>                
        	<name>yarn.resourcemanager.store.class</name>   
            <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>    
        </property>
                
                
        <property>
            <name>yarn.scheduler.maximum-allocation-mb</name>
            <value>2048</value>
        </property>
        <property>
            <name>yarn.scheduler.minimum-allocation-mb</name>
            <value>2048</value>
        </property>
        <property>
            <name>yarn.nodemanager.vmem-pmem-ratio</name>
            <value>2.1</value>
        </property>
        <property>
            <name>mapred.child.java.opts</name>
            <value>-Xmx1024m</value>
        </property>
                 
      <property>
        <name>yarn.resourcemanager.address.rm1</name>
        <value>node10:8032</value>
      </property>
      <property>
        <name>yarn.resourcemanager.scheduler.address.rm1</name>
        <value>node10:8030</value>
      </property>
      <property>
        <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
        <value>node10:8031</value>
      </property>
      <property>
        <name>yarn.resourcemanager.admin.address.rm1</name>
        <value>node10:8033</value>
      </property>
      <property>
        <name>yarn.nodemanager.address.rm1</name>
        <value>node10:8041</value>
      </property>
      <property>
        <name>yarn.resourcemanager.address.rm2</name>
        <value>node11:8032</value>
      </property>
      <property>
        <name>yarn.resourcemanager.scheduler.address.rm2</name>
        <value>node11:8030</value>
      </property>
      <property>
        <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
        <value>node11:8031</value>
      </property>
      <property>
        <name>yarn.resourcemanager.admin.address.rm2</name>
        <value>node11:8033</value>
      </property>
      <property>
        <name>yarn.nodemanager.address.rm2</name>
        <value>node11:8041</value>
      </property>
      <property>
        <name>yarn.nodemanager.localizer.address</name>
        <value>0.0.0.0:8040</value>
      </property>
      <property>
        <description>NM Webapp address.</description>
        <name>yarn.nodemanager.webapp.address</name>
        <value>0.0.0.0:8042</value>
      </property>
    <property>
        <name>yarn.nodemanager.address</name>
        <value>${yarn.resourcemanager.hostname}:8041</value>
    </property>
        <!-- vulue主要看HADOOP_CLASSPATH这个环境变量的输出值 -->      
        <property>
            <name>yarn.application.classpath</name>
            <value>/home/hadoop/module/hadoop-3.2.2/etc/hadoop:/home/hadoop/module/hadoop-3.2.2/share/hadoop/common/lib/*:/home/hadoop/module/hadoop-3.2.2/share/hadoop/common/*:/home/hadoop/module/hadoop-3.2.2/share/hadoop/hdfs:/home/hadoop/module/hadoop-3.2.2/share/hadoop/hdfs/lib/*:/home/hadoop/module/hadoop-3.2.2/share/hadoop/hdfs/*:/home/hadoop/module/hadoop-3.2.2/share/hadoop/mapreduce/lib/*:/home/hadoop/module/hadoop-3.2.2/share/hadoop/mapreduce/*:/home/hadoop/module/hadoop-3.2.2/share/hadoop/yarn:/home/hadoop/module/hadoop-3.2.2/share/hadoop/yarn/lib/*:/home/hadoop/module/hadoop-3.2.2/share/hadoop/yarn/*</value>
        </property>  
    
    
    
  5. 修改MapReduce配置文件:vi /home/hadoop/module/hadoop-3.2.2/etc/hadoop/mapred-site.xml

    在标签中添加如下配置

    <!-- 指定 MapReduce 程序运行在 Yarn--> 
    <property> 
        <name>mapreduce.framework.name</name> 
        <value>yarn</value> 
    </property>
    <!-- 历史服务器端地址 --> 
    <property> 
        <name>mapreduce.jobhistory.address</name> 
        <value>node10:10020</value> 
    </property> 
    
    <!-- 历史服务器 web 端地址 --> 
    <property> 
        <name>mapreduce.jobhistory.webapp.address</name> 
        <value>node10:19888</value> 
    </property>
    
  6. 修改workers配置文件,指定从节点信息:vi /home/hadoop/module/hadoop-3.2.2/etc/hadoop/workers

    ps:文件中添加的内容结尾不能有空格,文件中也不能有空行

    node12
    node13
    
  7. 创建pid目录:mkdir /home/hadoop/module/hadoop-3.2.2/pids

  8. 添加用户配置:vi /home/hadoop/module/hadoop-3.2.2/etc/hadoop/hadoop-env.sh,在最后添加

    export HDFS_NAMENODE_USER=hadoop 
    export HDFS_DATANODE_USER=hadoop 
    export HDFS_SECONDARYNAMENODE_USER=hadoop 
    export YARN_RESOURCEMANAGER_USER=hadoop 
    export YARN_NODEMANAGER_USER=hadoop 
    export JAVA_HOME=/opt/jdk/jdk1.8.0_291 
    export HADOOP_PID_DIR=/home/hadoop/module/hadoop-3.2.2/pids
    #以下内容暂时忽略,不用添加    
    #HDFS_DATANODE_SECURE_USER=hdfs
    #HADOOP_SECURE_DN_USER=yarn
    
  9. vi /home/hadoop/module/hadoop-3.2.2/etc/hadoop/yarn-env.sh

     export YARN_PID_DIR=/home/hadoop/module/hadoop-3.2.2/pids
    
  10. vi /home/hadoop/module/hadoop-3.2.2/sbin/start-dfs.sh和stop-dfs.sh,在头部添加以下内容

HDFS_ZKFC_USER=hadoop
HDFS_JOURNALNODE_USER=hadoop
HDFS_NAMENODE_USER=hadoop
HDFS_SECONDARYNAMENODE_USER=hadoop
HDFS_DATANODE_USER=hadoop
HDFS_DATANODE_SECURE_USER=hadoop
#HADOOP_SECURE_DN_USER=hadoop
  1. vi /home/hadoop/module/hadoop-3.2.2/sbin/start-yarn.sh和stop-yarn.sh,在头部添加以下内容

    #HADOOP_SECURE_DN_USER=hadoop
    HDFS_DATANODE_SECURE_USER=hadoop
    YARN_NODEMANAGER_USER=hadoop
    YARN_RESOURCEMANAGER_USER=hadoop
    
  2. 分发到其他节点:xsync /home/hadoop/module/hadoop-3.2.2/etc/hadoop/

  3. 进入路径:cd /home/hadoop

  4. 启动Journalnode脚本:./journalnode.sh start

  5. 初始化NameNode(删除所有节点的/home/hadoop/module/hadoop-3.2.2/data和logs目录)

    1)cd /home/hadoop/module/hadoop-3.2.2/

    2)hdfs namenode -format

  6. 将初始化生成的数据拷贝到node11节点(dfs.namenode.name.dir属性):/home/hadoop/module/hadoop-3.2.2/namenode

    ps:如果是用root用户拷贝的,需要重新赋权 chown -R hadoop:hadoop /home/hadoop

    scp /opt/kerberos/$account.keytab root@node13:/opt/kerberos

  7. 在任意一台 NameNode 上使用以下命令来初始化 ZooKeeper 中的 HA 状态:hdfs zkfc -formatZK

  8. 创建文件夹:mkdir /tmp/logs

  9. 启动hadoop脚本:cd /home/hadoop -->./hadoop.sh start

  10. 赋权其他用户都能读: chmod -R 755 /home/hadoop/ 、chmod -R 700 ~/.ssh/

  11. 遇到一些yarn切换active错误,如果是测试环境,可以考虑将tmp底下的yarn相关文件夹删除,重启即可

十一、hive搭建(10)

  1. 切换路径:cd /home/hadoop/module

  2. 下载hive:wget https://mirrors.tuna.tsinghua.edu/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz --no-check-certificate

  3. 解压并且重命名:tar -zxvf apache-hive-3.1.2-bin.tar.gz -> mv apache-hive-3.1.2-bin hive

  4. 配置环境变量:vi /etc/profile ,最后一行后面加上以下内容

    #添加下面两行
    export HIVE_HOME=/home/hadoop/module/hive
    export PATH=$PATH:$HIVE_HOME/bin
    

    重置环境变量:source /etc/profile

  5. 将hadoop的lib中高版本的 /home/hadoop/module/hadoop-3.2.2/share/hadoop/common/lib/guava-27.0-jre.jar包复制到/home/hadoop/module/hive/lib下,并删除hive下的低版本guava包

    cp /home/hadoop/module/hadoop-3.2.2/share/hadoop/common/lib/guava-27.0-jre.jar  /home/hadoop/module/hive/lib
    rm  /home/hadoop/module/hive/lib/guava-19.0.jar 
    
  6. 安装mysql(在node12安装,建议跟后面的ranger安装在同一台服务器):https://blog.csdn/weixin_40496191/article/details/124358743

  7. 切回hadoop用户

  8. 拷贝core-site文件:cp /home/hadoop/module/hadoop-3.2.2/etc/hadoop/core-site.xml /home/hadoop/module/hive/conf

  9. 添加Hive核心配置,选择远程MySQL模式:vi /home/hadoop/module/hive/conf/hive-site.xml

    <configuration>
    <!-- mysql的主机地址 -->
    <property>
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:mysql://node10:3306/hivedb?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&amp;useSSL=false&amp;serverTimezone=GMT</value>
    </property>
    
    <!-- 固定写法,mysql驱动类的位置 -->
    <property>
            <name>javax.jdo.option.ConnectionDriverName</name>
            <value>com.mysql.cj.jdbc.Driver</value>
    </property>
    
    <!-- 修改为你自己的Mysql账号 -->
    <property>
            <name>javax.jdo.option.ConnectionUserName</name>
            <value>root</value>
    </property>
    
    <!-- 修改为你自己的Mysql密码 -->
    <property>
            <name>javax.jdo.option.ConnectionPassword</name>
            <value>ffcsict123</value>
    </property>
    
    <!-- 忽略HIVE 元数据库版本的校验,如果非要校验就得进入MYSQL升级版本 -->
    <property>
            <name>hive.metastore.schema.verification</name>
            <value>false</value>
    </property>
        
    <!-- 配置MetaStore端口 -->
    <property>
        	<name>hive.metastore.port</name>
        	<value>9083</value>
        	<description>Hive metastore listener port</description>
    </property>
        
    <!-- 显示当前使用的数据库 -->    
    <property> 
         <name>hive.cli.print.current.db</name>
         <value>true</value>
    </property>
    
    <!-- 显示当前表的列名 -->    
    <property> 
             <name>hive.cli.print.header</name>
             <value>true</value>
    </property>
    
    <!-- 配置hiveserver2的端口 -->
    <property>
             <name>hive.server2.thrift.port</name>
             <value>10000</value>
    </property>
    
    <!-- 绑定到的TCP接口 -->
    <property>
    	<name>hive.server2.thrift.bind.host</name>
    	<value>node10</value>
    </property>
    
    <!--设置用户名和密码-->
    <property>
    	<name>hive.jdbc_passwd.auth.root</name>
    	<value>ffcsict123</value>
        <description/>
    </property>  
    <!--支持事务和行级更新-->   
    <property>
        <name>hive.support.concurrency</name>
        <value>true</value>
    </property>
        
    <!--启用分桶设置-->   
    <property>
        <name>hive.enforce.bucketing</name>
        <value>true</value>
    </property>
    <!--分区模式设置,动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区。nonstrict模式:表示允许所有的分区字段都可以使用动态分区。-->   
    <property>
        <name>hive.exec.dynamic.partition.mode</name>
        <value>nonstrict</value>
    </property>
        
    <!--hive的锁管理器,不能从一个非ACID会话向ACID表中读写数据-->   
    <property>
        <name>hive.txn.manager</name>
        <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
    </property>
    <!--是否在metastore实例上运行initiator和cleaner进程。-->   
    <property>
        <name>hive.compactor.initiator.on</name>
        <value>true</value>
    </property>
    <!--每个MetastoreWorker的数量-->   
    <property>
        <name>hive.compactor.worker.threads</name>
        <value>1</value>
    </property>
    <!--HIve中日志存放位置-->   
    <property>
        <name>hive.querylog.location</name>
        <value>/home/hadoop/module/hive/tmp/querylog</value>
    </property>
    <!--HDFS路径,用于存储不同 map/reduce 阶段的执行计划和这些阶段的中间输出结果。 -->   
    <property>
        <name>hive.exec.local.scratchdir</name>
        <value>/home/hadoop/module/hive/tmp/scratchdir</value>
    </property>
    <!--远程资源下载的临时目录-->   
    <property>
        <name>hive.downloaded.resources.dir</name>
        <value>/home/hadoop/module/hive/tmp/resources</value>
    </property>
    </configuration>
    
  10. 上传MySQL的驱动包到/home/hadoop/module/hive/lib目录:mysql-connector-java-8.0.17.jar

  11. 在MySQL上创建Hive的元数据存储库:create database hivedb;

  12. 执行Hive的初始化工作

cd /home/hadoop/module/hive/bin
./schematool -initSchema -dbType mysql
  1. 初始化完成后,在MySQLhivedb数据库中查看是否初始化成功:show tables;

  2. 修改mysql的相关编码,主要是防止后续hive建表注释乱码的问题

    #修改字段注释字符集
    ALTER TABLE COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
    #修改表注释字符集
    ALTER TABLE TABLE_PARAMS modify column PARAM_VALUE varchar(20000) character set utf8;
    #修改分区参数,支持分区建用中文表示
    ALTER TABLE PARTITION_PARAMS modify column PARAM_VALUE varchar(20000) character set utf8;
    ALTER TABLE PARTITION_KEYS modify column PKEY_COMMENT varchar(20000) character set utf8;
    #修改索引名注释,支持中文注释
    ALTER TABLE INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
    #修改视图,支持视图中文
    ALTER TABLE TBLS modify COLUMN VIEW_EXPANDED_TEXT mediumtext CHARACTER SET utf8;
    ALTER TABLE TBLS modify COLUMN VIEW_ORIGINAL_TEXT mediumtext CHARACTER SET utf8;
    
  3. 在hadoop的active节点赋权

    hadoop fs -chmod 777 /
    hadoop fs -chown -R root:root  /tmp
    

    ps1:需要使用hadoop用户赋权

  4. 如果后面hive主备切换,查询报错不支持standby节点,则需要修改数据库数据
    1)hive数据库的dbs表的DB_LOCATION_URI字段配置:hdfs://mycluster/user/hive/warehouse(类似)
    2)hive数据库的sds表的LOCATION字段配置:hdfs://mycluster/user/hive/warehouse/student(类似)

  5. 使用beeline连接测试

    1)首先启动hiveserver2服务

    cd /home/hadoop/module/hive
    nohup ./bin/hiveserver2>> hiveserver2.log 2>&1 &
    #该服务暂时不启动,因为metastore和mysql在同一台服务,网络互通,不需要开启该服务
    hive --service metastore > metastore.log 2>&1 &
    

    ps1:需要在active节点操作,如果10不是就需要把active转移过来

    #查看节点
    hdfs haadmin -getServiceState nn1
    #转移节点
    hdfs haadmin -failover nn2 nn1
    #再次查看
    hdfs haadmin -getServiceState nn1 ##结果显示active即可
    

    ps2:启动很慢,需耐心等待10000端口起来

    2)hiveserver2服务启动后,使用beeline客户端访问hiveserver2服务

    cd /home/hadoop/module/hive
    # 进入beeline客户端
    bin/beeline
    # 执行连接hiveserver2操作
    !connect jdbc:hive2://node10:10000/default
    
    #测试
    create table student(id int,name String);
    show tables;
    insert into student values('4', 'abc222');
    select * from student;
    
    # 或者
    bin/beeline -u jdbc:hive2://node10:10000/default -n root -p ffcsict123
    

    3)hive默认使用的是yarn的default,如果想要切换其他队列,则可以执行以下几种命令(根据版本了,3.1.2的执行第一种)

    set mapred.job.queue.name=yarnuser1;
    SET mapreduce.job.queuename=yarnuser1;
    set mapred.queue.names=yarnuser1;
    

十二、hbase集群配置(10)

  1. 创建文件夹:mkdir /home/hadoop/hbase

  2. 进入文件夹:cd /home/hadoop/hbase

  3. 下载并传hbase包:https://archive.apache/dist/hbase/2.3.5/

  4. 解压:tar -xvf hbase-2.1.0-bin.tar.gz

  5. 修改配置文件:vi /home/hadoop/hbase/hbase-2.1.0/conf/hbase-env.sh

    export JAVA_HOME=/opt/jdk/jdk1.8.0_291
    export HADOOP_HOME=/home/hadoop/module/hadoop-3.2.2
    export HBASE_LOG_DIR=/home/hadoop/hbase/logs
    export HBASE_MANAGES_ZK=false
    export HBASE_CLASSPATH=/home/hadoop/module/hadoop-3.2.2/etc/hadoop
    export HBASE_PID_DIR=/home/hadoop/module/hadoop-3.2.2/pids 
        
    # 表示采用HBase自带的ZooKeeper管理,如果想用外部ZooKeeper管理HBase,可忽略本配置,该次配置使用自行安装的zk。
    # export HBASE_MANAGES_ZK=false
    
  6. vi /home/hadoop/hbase/hbase-2.1.0/conf/hbase-site.xml

    ps:记得清除原来的hbase.cluster.distributed配置

    <!--region server的共享目录,用来持久化HBase-->
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://mycluster/hbase</value>
    </property>
    <!--HBase端口-->    
    <property>
      <name>hbase.master.info.port</name>
      <value>16010</value>
    </property>
    <!--HBase的运行模式,false是单机模式,true是分布式模式。若为false,HBaseZookeeper会运行在同一个JVM里面-->
    <property>
      <name>hbase.cluster.distributed</name>
      <value>true</value>
    </property>
    <!--zookeeper集群的URL配置,多个host中间用逗号隔开-->
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>node10,node11,node12</value>
    </property>
        
        
        
        
    
    <!--本地文件系统的临时目录。可以修改到一个更为持久的目录上-->
    <property>
      <name>hbase.tmp.dir</name>
      <value>/home/hadoop/hbase/tmp</value>
    </property>
    <!--如果你打算在本地文件系统中跑hbase,请禁掉此项-->
    <property>
      <name>hbase.unsafe.stream.capability.enforce</name>
      <value>false</value>
    </property>
    
    
    <!--HBase在zookeeper上数据的根目录znode节点-->
    <property>
        <name>zookeeper.znode.parent</name>
        <value>/hbase</value>
    </property>
    <!--设置zookeeper通信端口,不配置也可以,zookeeper默认就是2181-->
    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
    </property>
    
  7. 配置从服务器:vi /home/hadoop/hbase/hbase-2.1.0/conf/regionservers

    node11
    node12
    node13
    
  8. 拷贝包:cp /home/hadoop/hbase/hbase-2.1.0/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar /home/hadoop/hbase/hbase-2.1.0/lib/

  9. 分发hbase配置:xsync /home/hadoop/hbase/hbase-2.1.0

  10. 启动hbase脚本:cd /home/hadoop --> ./hbase.sh start

    ps:启动节点必须是hadoop的active节点

    #查看节点
    hdfs haadmin -getServiceState nn1
    #转移节点
    hdfs haadmin -failover nn2 nn1
    #再次查看
    hdfs haadmin -getServiceState nn1 ##结果显示active即可
    
  11. 查看:jps

  12. 访问:http://192.168.248.10:16010/master-status

  13. 如果想要起多个hmaster,需要在另一个执行脚本即可:./hbase-daemon.sh start master

十三、启动方式

  1. 切换至脚本路径:cd /home/hadoop

  2. 启动zk:./zookeeper.sh start

  3. 启动journalnode:./journalnode.sh start

  4. 启动hadoop:./hadoop.sh start

  5. 启动hbase:./hbase.sh start

  6. 启动hive服务器:

    ##启动的节点必须是hadoop的active节点
    cd /home/hadoop/module/hive
    nohup ./bin/hiveserver2>> hiveserver2.log 2>&1 &
    

十四、相关节点主备切换

  1. 手动切换namenode的状态的三种方式

    ** 查看namenode节点的状态: hdfs haadmin -getServiceState nn1 nn2

    2.1 将 active 状态从 nn1节点切换到 nn2上:hdfs haadmin -failover nn1 nn2

    2.2 将 nn1 过渡到 Standby:hdfs haadmin -transitionToStandby --forcemanual nn1

    2.3 将 nn2过渡到 Active(不存在active时候):hdfs haadmin -transitionToActive --forceactive --forcemanual nn1

  2. 手动切换resourcemanager

    ** 查看resourcemanager 节点的状态: yarn rmadmin -getServiceState rm1

    2.1 将 rm1 过渡到 Standby:yarn rmadmin -transitionToStandby --forcemanual rm1

    2.2 将 rm2 过渡到 Active:yarn rmadmin -transitionToActive --forcemanual rm2

十五、yarn相关指令介绍

  1. 查看yarn正在运行的任务列表:yarn application -list
  2. kill掉yarn正在运行的任务: yarn application -kill application_id
  3. 查找yarn已经完成的任务列表:yarn application -appStates finished -list
  4. 查找yarn所有任务列表:yarn application -appStates ALL -list
  5. 查看日志详情:yarn logs -applicationId application_id

十六、相关问题整合

  1. 为什么需要metastore和hiveser

    1)hiveserver2 会启动一个hive服务端默认端口为:10000,可以通过beeline,jdbc,odbc的方式链接到hive。hiveserver2启动的时候会先检查有没有配置hive.metastore.uris,如果没有会先启动一个metastore服务(通过 Metastore服务连接MySQL获取元数据),然后在启动hiveserver2。如果有配置hive.metastore.uris。会连接到远程的metastore服务。

    2)Hive充当客户端(是HDFS的客户端也是Metastore的客户端,也是Hive的客户端),又充当服务端(因为有Metastore服务和Hiveserver2服务配置)。在实际生产环境下,可能有多台Hive客户端,MySQL的 IP地址对外不暴露,只暴露给其中一台,那么其他客户端就需要在暴露的那台机器上启动Metastore服务,其他Hive客户端连接这个Metastore服务,进而达到连接Mysql获取元数据的目的。

  2. 什么时候需要开启metastore和hiveserver2

    一般情况下,如果需要客户端去连接hive,则需要启动hiveserver2服务,开放10000端口。

    当hive客户端和MySQL数据库不是处于同一台服务器并且3306端口网络不通时,就需要在mysql服务器端开启metastore服务,并且开放出9083端口。3306端口网络不通的服务器可以通过配置hive-site.xml的metastore的url,间接连接mysql。

    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://node10:9083</value>
    </property>
    
  3. 遇到报错:org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create directory /tmp/hive. Name node is in safe mode.

    解决:启动hadoop集群时,集群会默认开启安全模式,检查结束后会自动关闭,请耐心等待。如需强制关闭,则执行hdfs dfsadmin -safemode leave ,关闭安全模式

    ps:如果还是不行,则执行hdfs dfsadmin -safemode forceExit

  4. Operation category READ is not supported in state standby. Visit https://s.apache/sbnn-error

    原因:所在节点namenode为standby

    解决:把当前节点切成active即可

  5. The minimum number of live datanodes is not required. Safe mode will be turned off automatically once the thresholds have been reached. NamenodeHostName:node10

    原因:节点处于安全模式,手动解除即可

    解决:hdfs dfsadmin -safemode leave

  6. org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block

    原因:存在损坏文件

    解决:如下

    查看受损block:hadoop fsck /hbase -list-corruptfileblocks  
        ---The filesystem under path '/hbase' has 54 CORRUPT files    CORRUPT说明文件受损
    删除损坏的block: hadoop fsck /hbase -delete
    
  7. Datanode denied communication with namenode because hostname cannot be resol

    原因:由于配置hadoop没有使用host+hostName的配置方式,导致了hadoop无法解析DataNode,对DataNode的注册失败。

    解决方案:

    <property>
    	<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
    	<value>false</value>
    </property>
    
  8. 服务器断电,导致数据同步异常,挂掉的服务器resourceManage无法切换到active

    删除tmp底下的hadoop-yarn-hadoop文件夹,重启集群

本文标签: 基础 Hadoop Hive zK HBase