Hadoop

作者: KS保 | 来源:发表于2024-02-27 16:28 被阅读0次

    一、Hadoop介绍

    1、Apache软件基金会的一款开源软件。用Java实现、开源。

    2、核心组件

    ①Hadoop HDFS(分布式文件存储系统):解决海量数据存储

    ②Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度

    ③Hadoop MapReduce(分布式计算框架):解决海量数据计算

    课程

    3、shell脚本一键启停

    ①HDFS集群:start-dfs.sh、stop-dfs.sh

    ②YARN集群:start-yarn.sh、stop-yarn.sh

    ③Hadoop集群(HDFS+YARN):start-all.sh、stop-all.sh

    脚本一键启动的前提:配置好机器之间的SSH免密登录和workers文件

    4、分布式文件存储系统

    ①分布式存储的优点:无限扩展支撑海量数据

    ②元数据记录的功能:快速定位文件位置便于查找

    ③文件分块存储的好处:针对块并行操作提高效率

    ④设置副本备份的作用:冗余存储保障数据安全

    二、Hadoop集群搭建

    准备好三台机器 node1、node2、node3

    Hadoop集群整体概述

    ①Hadoop集群包括两个集群:

    • HDFS集群(分布式存储)

      • 主角色:NameNode

      • 从角色:DataNode

      • 主角色辅助角色:SecondaryNameNode

    • YARN集群(资源管理、任务调度)

      • 主角色:ResourceManager

      • 从角色:NodeManager

    ②两个集群逻辑上分离、通常物理上在一起

    ③两个集群都是标准的主从架构集群

    1、集群角色规划

    注意:资源上有抢夺冲突的,尽量不要部署在一起;工作上需要互相配合的,尽量部署在一起。

    服务器 运行角色
    node1 namenode/datanode/resourcemanager/nodemanager
    node2 secondarynamenode/datanode/nodemanager
    node3 datanode/nodemanager

    2、服务器基础环境准备

    ①主机名(3台机器)

    [root@node1 server]# vim /etc/hostname
    [root@node1 server]# hostname
    node1.kyrie.cn
    

    ②Hosts映射(3台机器)

    [root@node1 server]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
    192.168.137.128 node1 node1.kyrie.cn
    192.168.137.129 node2 node2.kyrie.cn
    192.168.137.130 node3 node3.kyrie.cn
    

    ③防火墙关闭(3台机器)

    [root@node1 server]# systemctl stop firewalld.service  # 关闭防火墙
    [root@node1 server]# systemctl disable firewalld.service   # 禁止防火墙开启自启动
    

    ④ssh免密登录(node1执行->node1|node2|node3)

    [root@node1 server]# ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):回车 
    Enter passphrase (empty for no passphrase): 回车
    Enter same passphrase again: 回车
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:回车
    SHA256:5TM0waxZM1fF20Mpsk/BOShD0fqP8ySLPxGSHPYcZxg root@node1.kyrie.cn
    The key's randomart image is:
    +---[RSA 2048]----+
    |        .=+E=.ooo|
    |         =*B.O o.|
    |        o+%+* = o|
    |        oO * . o.|
    |        S * +   .|
    |           = .   |
    |           .+.   |
    |          .++.   |
    |         ..o+.   |
    +----[SHA256]-----+
    [root@node1 server]# 
    [root@node1 server]# ssh-copy-id node1
    [root@node1 server]# ssh-copy-id node2
    [root@node1 server]# ssh-copy-id node3
    

    ⑤集群时间同步(3台机器)

    [root@node1 server]# yum -y install ntpdate
    [root@node1 server]# ntpdate ntp4.aliyun.com
    

    3、集群搭建

    ①创建统一工作目录(3台机器)

    [root@node1 server]# mkdir -p /export/server/   # 软件安装路径
    [root@node1 server]# mkdir -p /export/data/  # 数据存储路径
    [root@node1 server]# mkdir -p /export/software/  # 安装包存放路径
    

    ②上传安装包、解压安装包

    JDK和Hadoop包的下载路径:链接

    • JDK 1.8安装(3台机器)
    [root@node1 export]# cd /export/server/  # 将安装包存放在该路径下
    [root@node1 server]# ls
    jdk-8u65-linux-x64.t.gz
    [root@node1 server]# tar -zxvf ./jdk-8u65-linux-x64.t.gz 
    [root@node1 server]# vim /etc/profile  # 配置环境变量
    unset i
    unset -f pathmunge
    # 在文件最后加入下面两条记录
    export JAVA_HOME=/export/server/jdk1.8.0_65
    export PATH=.:$PATH:$JAVA_HOME/bin:$PATH
    [root@node1 server]# source /etc/profile  # 重新加载环境变量文件
    [root@node1 server]# java- version  # 验证java是否安装成功
    openjdk version "1.8.0_262"
    OpenJDK Runtime Environment (build 1.8.0_262-b10)
    OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
    [root@node1 server]# 
    
    • 上传、解压Hadoop安装包(node1)
    [root@node1 export]# cd /export/server/
    [root@node1 server]# ls
    hadoop-3.1.3.tar.gz  jdk1.8.0_65  jdk-8u65-linux-x64.t.gz
    [root@node1 server]# tar -zxvf ./hadoop-3.1.3.tar.gz
    [root@node1 server]# mv ./hadoop-3.1.3 ./hadoop
    
    • 修改Hadoop配置文件

    所有的配置文件均在 /export/server/hadoop/etc/hadoop/ 目录下

    hadoop-env.sh

    # 文件最后添加
    export JAVA_HOME=/export/server/jdk1.8.0_65  # java安装路径
    
    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
    

    core-site.xml 核心模块配置

    <configuration>
    <property>
     <name>fs.defaultFS</name>
     <value>hdfs://node1:8020</value>
    </property>
    <property>
     <name>io.file.buffer.size</name>
     <value>131072</value>
    </property>
    <!-- 设置hadoop本地保存数据路径 -->
    <property>
     <name>hadoop.tmp.dir</name>
     <value>/export/data/hadoop</value>
    </property>
    <!-- 设置HDFS web UI用户身份 -->
    <property>
     <name>hadoop.http.staticuser.user</name>
     <value>root</value>
    </property>
    <!-- 整合hive用户代理设置 -->
    <property>
     <name>hadoop.proxyuser.root.hosts</name>
     <value>*</value>
    </property>
    <property>
     <name>hadoop.proxyuser.root.groups</name>
     <value>*</value>
    </property>
    <!-- 文件系统垃圾桶保存时间 -->
    <property>
     <name>fs.trash.interval</name>
     <value>1440</value>
    </property>
    </configuration>
    

    hdfs-site.xml hdfs文件系统模块配置

    <configuration>
    <!-- NameNode 存放的位置 -->  
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///export/data/hadoop/dfs/name</value>
    </property>  
    <!-- DataNode 存放的位置 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///export/data/hadoop/dfs/data</value>
    </property>
    <property>
              <name>dfs.namenode.secondary.http-address</name>
              <value>node2:9868</value>
     </property>
    </configuration>
    

    mapred-site.xml MapReduce模块配置

    <configuration>
    <!-- 设置MR程序默认运行模式:yarn集群模式 local本地模式 -->
    <property>
                   <name>mapreduce.framework.name</name>
                   <value>yarn</value>
    </property>
    <!-- MR程序历史服务地址 -->
    <property>
                   <name>mapreduce.jobhistory.address</name>
                   <value>node1:10020</value>
    </property>
    <!-- MR程序历史服务器web端地址 -->
    <property>
                   <name>mapreduce.jobhistory.webapp.address</name>
                   <value>node1:19888</value>
    </property>
    <property>
                   <name>yarn.app.mapreduce.am.env</name>
                   <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
                   <name>mapreduce.map.env</name>
                   <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
                   <name>mapreduce.reduce.env</name>
                   <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    </configuration>
    

    yarn-site.xml yarn模块配置

    <configuration>
    <!-- 设置YARN集群主角色运行机器位置-->
    <property>
                   <name>yarn.resourcemanager.hostname</name>
                   <value>node1</value>
    </property>
    <property>
                   <name>yarn.nodemanager.aux-services</name>
                   <value>mapreduce_shuffle</value>
    </property>
    <!-- 是否将对容器实施物理内存限制-->
    <property>
                   <name>yarn.nodemanager.pmem-check-enabled</name>
                   <value>false</value>
    </property>
    <!-- 是否将对容器实施虚拟内存限制-->
    <property>
                   <name>yarn.nodemanager.vmem-check-enabled</name>
                   <value>false</value>
    </property>
    <!-- 开启日志聚集-->
    <property>
                   <name>yarn.log-aggregation-enable</name>
                   <value>true</value>
    </property>
    <!-- 设置yarn历史服务器地址-->
    <property>
                   <name>yarn.log.server.url</name>
                   <value>http://node1:19888/jobhistory/logs</value>
    </property>
    <!-- 历史日志保存的时间 7天-->
    <property>
                   <name>yarn.log-aggregation.retain-seconds</name>
                   <value>604800</value>
    </property>
    </configuration>
    

    workers

    [root@node1 hadoop]# cat workers 
    node1.kyrie.cn
    node2.kyrie.cn
    node3.kyrie.cn
    
    • 分发同步hadoop安装包
    [root@node1 server]# cd /export/server/
    [root@node1 server]# scp -r ./hadoop root@node2:$PWD
    [root@node1 server]# scp -r ./hadoop root@node3:$PWD
    
    • 将hadoop添加到环境变量(3台机器)
    [root@node1 server]# vim /etc/profile  # 配置环境变量
    unset i
    unset -f pathmunge
    export JAVA_HOME=/export/server/jdk1.8.0_65
    export PATH=.:$PATH:$JAVA_HOME/bin:$PATH
    # 在文件最后加入下面两条记录
    export HADOOP_HOME=/export/server/hadoop
    export PATH=.:$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
    [root@node1 server]# source /etc/profile  # 重新加载环境变量文件
    

    ③NameNode format(格式化操作)

    • 首次启动HDFS时,必须对其进行格式化操作。

    • format本质上是初始化工作,进行HDFS清理和准备工作。

    • 命令:hdfs namenode -format(在node1上执行一次即可)

    ④Hadoop集群一键启停

    可以在node1上使用软件自带的shell脚本一键启停。前提:配置好机器之间的SSH免密登录和works文件。

    • HDFS集群:start-dfs.sh、stop-dfs.sh

    • YARN集群:start-yarn.sh、stop-yarn.sh

    • Hadoop集群(HDFS+YARN):start-all.sh、stop-all.sh

    ⑤进程状态、日志查看

    • 启动完毕之后可以使用jps命令查看进程是否启动成功。
    --------  node1服务器  --------
    [root@node1 logs]# jps
    90582 Jps
    90217 NodeManager
    89480 NameNode
    90072 ResourceManager
    89658 DataNode
    
    --------  node2服务器  --------
    [root@node2 hadoop]# jps
    74917 SecondaryNameNode
    75140 Jps
    2793 DataNode
    75006 NodeManager
    
    --------  node3服务器  --------
    [root@node3 hadoop]# jps
    71778 Jps
    71627 NodeManager
    71517 DataNode
    
    • Hadoop启动日志路径:/export/server/hadoop/logs/

    Yarn的WEB UI 接口 8088 http://node1:8088

    HDFS WEB UI端口 9870 http://node1:9870

    三、HDFS

    1、简介

    HDFS(Hadoop Distributed File System),意为Hadoop分布式文件系统,是Hadoop的组件之一

    2、特性

    ①主从架构

    一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成;Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。

    ②分块存储

    HDFS中的文件在物理上是分块(block)存储的,默认大小是128M,不足128M则本身就是一块;块的大小可以通过参数dfs.blocksize来设置。

    ③副本机制

    文件的所有block都会有副本,副本系数可以在文件创建的时候指定,也可以在之后通过命令改变;副本数由参数dfs.replication控制,默认值是3。

    ④元数据记录

    在HDFS中,Namenode管理元数据,具有两种类型

    • 文件自身属性信息:文件名称、权限、修改时间、文件大小、复制因子、数据块大小。

    • 文件块位置映射信息:记录文件块和DataNode之间的映射信息,即那个块位于那个节点上。

    ⑤抽象统一的目录树结构(namespace)

    HDFS支持传统的层次型文件组长结构。

    3、HDFS集群角色

    ①主角色 namenode

    • NameNode是Hadoop分布式文件系统的核心,架构中的主角色。

    • NameNode维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。

    • 基于此,NameNode成为了访问HDFS的唯一入口。

    • NameNode内部通过内存和磁盘文件两种方式管理元数据。

    • 其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和edits log(Journal)编辑日志。

    ②从角色 datanode

    • DataNode是Hadoop HDFS中的从角色,负责具体的数据块存储。

    • DataNode的数量决定了HDFS集群的整体数据存储能力。通过和NameNode配合维护着数据块。

    ③主角色辅助角色 secondarynamenode

    • SecondaryNameNode充当NameNode的辅助节点,但不能替代NameNode。

    • 主要是帮助主角色进行元数据文件的合并动作。可以通俗的理解为主角色的“秘书”。

    4、HDFS集群职责

    ①namenode职责

    • NameNode仅存储HDFS的元数据,不存储实际数据。

    • NameNode知道HDFS中任何给定文件的块列表及其位置。

    • NameNode不持久化存储每个文件中各个块所在的datanode的位置信息,这些信息会在系统启动时从DataNode重建。

    • NameNode是Hadoop集群中的单点故障。

    • NameNode所在机器通常会配置有大量内存。

    ②datanode职责

    • DataNode负责最终数据块block的存储。

    • DataNode启动时,会将自己注册到NameNode并汇报自己负责持有的块列表。

    • 当某个DataNode关闭时,不会影响数据的可用性。NameNode将安排由其他DataNode管理的块进行副本复制。

    • DataNode所在机器通常配置有大量的硬盘空间,因为实际数据存储在Datanode中。

    5、shell命名行

    ①创建文件夹

    hadoop fs -mkdir [-p] <path>

    • path为待创建的目录

    • -p选项的行为与Unix mkdir -p非常相似,他会沿着路径创建父目录

    ②查看指定目录下的内容

    hadoop fs -ls [-h] [-R] <path>

    • path 指定目录路径

    • -h 人性化显示文件size

    • -R 递归查看指定目录及其子目录

    ③上传文件到HDFS指定目录下

    hadoop fs -put [-f] [-p] <localsrc> <dst>

    • -f 覆盖目标文件(已存在情况下)

    • -p保留访问和修改时间,所有权和权限

    • localsrc 本地文件系统(客户端所在机器)

    • dst 目标文件系统(HDFS)

    eg:hadoop fs -put file:///etc/profile hdfs://node1:8020/kyrie

    ④查看HDFS文件内容

    hadoop fs -cat <src>

    • 读取指定文件的全部内容,显示在标准输出控制台

    • 注意:对于大文件内容读取,需慎重!

    ⑤下载HDFS文件

    hadoop fs -get [-f] [-p] <src> <localdst>

    • 下载文件到本地文件系统指定目录,localdst必须是目录

    • -f 覆盖目标文件(已存在情况下)

    • -p 保留访问和修改时间,所有权和权限

    ⑥拷贝HDFS文件

    hadoop fs -cp [-f] <src> <dst>

    • -f 覆盖目标文件(已存在情况下)

    ⑦追加数据到HDFS文件中

    hadoop fs -appendToFile <localsrc> <dst>

    • 将所有给定的本地文件的内容追加到给定dst文件,dst如果文件不存在,则创建该文件

    • 如果<localsrc>为-,则输入为从标准输入中读取

    ⑧HDFS数据移动操作

    hadoop fs -mv <src> <dst>

    • 移动文件到指定文件夹下,可以使用该命令移动数据或者文件重命名

    四、MapReduce

    1、介绍

    一个MapReduce编程模型中只能包含一个Map阶段合一个Reduce阶段,或者只有Map阶段。

    整个MapReduce程序中,数据都是以kv键值对形式流转的。

    ①MapReduce的思想核心是“先分后合,分而治之”。

    • Map表示第一阶段,负责“拆分”:即把复杂的任务分解为若干个简单的子任务来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。

    • Reduce表示第二阶段,负责“合并”:即对map阶段的结果进行全局汇总。

    ②MapReduce局限性

    • 实时计算性能差:MapReduce主要应用于离线作业,无法做到秒级或者是毫秒级的数据响应。

    • 不能进行流式计算:流式计算的特点是数据是源源不断的计算,并且数据是动态的;而MapReduce作为一个离线计算框架,主要是针对静态数据集的,数据是不能动态变化的。

    ③MapRedece实例进程

    一个完整的MapReduce程序在分布式运行时有三类

    • MRAppMaster:负责整个MR程序的过程调度及状态协调。

    • MapTask:负责map阶段的整个数据处理流程。

    • ReduceTask:负责reduce阶段的整个数据处理流程。

    2、Map阶段

    • 第一阶段:把输入目录下文件按照一定的标准(128M)逐个进行逻辑切片,形成切片规划。每一个切片由一个MapTask处理。

    • 第二阶段:对切片中的数据按照一定的规则(默认按行)读取解析返回<key, value>对。

    • 第三阶段:调用Mapper类中的map方法处理数据。

    • 第四阶段:按照一定的规则对Map输出的键值对进行分区(partition)。默认不分区,因为只有一个reducetask。

    • 第五阶段:Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。溢出(spill)的时候根据key进行排序(sort)

    • 第六阶段:对所有溢出文件进行最终的merge合并,成为一个文件。

    3、Reduce阶段

    • 第一阶段:ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据。

    • 第二阶段:把拉取来的数据,全部进行合并merge,即把分散的数据合并成一个大的数据。再对合并后的数据排序。

    • 第三阶段:对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对写入到HDFS文件中。

    4、Shuffle机制

    一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。shuffle是将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据,以便reduce端接收处理。

    ①Map端的Shuffle

    • Collect阶段:将MapTask的结果收集输出到默认大小为100M的环形缓冲区,保存之前会对key进行分区的计算,默认Hash分区。

    • Spill阶段:当内存中的数据量达到一定的阈值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。

    • Merge阶段:把所有溢出到临时文件进行一次合并操作,以确保一个MapTask最终只会产生一个中间数据文件。

    ②Reduce端shuffle

    • Copy阶段:ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据。

    • Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。

    • Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可。

    ③shuffle机制弊端

    • Shuffle是MapReduce程序的核心与精髓,是MapReduce的灵魂所在。

    • Shuffle也是MapReduce被诟病最多的地方所在。MapReduce相比较于Spark、Flink计算引擎慢的原因,跟Shuffle机制有很大的关系。

    • Shuffle中频繁涉及到数据在内存、磁盘之间的多次往复。

    五、YARN

    1、简介

    • Apache Hadoop YARN(Yet Another Resource Negotiator,另一种资源协作者)是一种新的Hadoop资源管理器。

    • YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度。

    • 它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。

    • 可以把Hadoop YARN理解为相当于一个分布式的操作系统平台,而MapReduce等计算程序则相当于运行于操作系统之上的应用程序,YARN为这些程序提供运算所需的资源(内存、CPU等)。

    2、YARN3大组件

    • ResourceManager(RM):YARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者。

    接收用户的作业提交,并通过NM分配、管理各个机器上的计算资源。

    • NodeManager(NM):YARN中的从角色,一台机器上一个,负责管理本机器上的计算资源。

    根据RM命令,启动Container容器、监视容器的资源使用情况。并且向RM主角色汇报资源使用情况。

    • ApplicationMaster(AM):用户提交的每个应用程序均包含一个AM。

    应用程序内的“老大”,负责程序内部各阶段的资源申请,监督程序的执行情况。

    3、YARN交互流程

    • 第一步:用户通过客户端向YARN中ResourceManager提交应用程序(比如hadoop jar提交MR程序)。

    • 第二步:ResourceManager为该应用程序分配第一个Container(容器),并与对应的NodeManager通信,要求它在这个Container中启动这个应用程序的ApplicationMaster。

    • 第三步:ApplicationMaster启动成功之后,首先向ResourceManager注册并保持通信,这样用户可以直接通过ResourceManage查看应用程序的运行状态(处理了百分之几)。

    • 第四步:AM为本次程序内部的各个Task任务向RM申请资源,并监控它的运行状态。

    • 第五步:一旦ApplicatonMaster申请到资源后,便于对应的NodeManager通信,要求它启动任务。

    • 第六步:NodeManager为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。

    • 第七步:各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。

    • 第八步:应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。

    4、YARN资源调度器Scheduler

    在YARN中,负责给应用分配资源的就是Scheduler,它是ResourceManager的核心组件之一。Scheduler完全专用于调度作业,它无法跟踪应用程序的状态。

    三种调度器

    • 第一种:FIFO Scheduler(先进先出调度器):先提交的应用先运行。调度工作不考虑优先级和范围,适用于负载较低的小规模集群。当使用大型共享集群时,它的效率较低且会导致一些问题。

    • 第二种:Capacity Scheduler(容量调度器)(YARN默认):通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。

    • 第三种:Fair Scheduler(公平调度器)

    六、Hive安装部署

    1、安装

    ①安装前准备

    • 由于Apache Hive是一款基于Hadoop的数据仓库软件,通常部署运行在Linux系统之上。因此不管使用何种方式配置Hive Metastore,必须要先保证服务器的基础环境(集群时间同步、防火墙关闭、主机Host映射、免密登录、JDK安装)正常,Hadoop集群健康可用。

    • 特别需要注意,需等待HDFS安全模式关闭之后再启动运行Hive。

    ②Hadoop和Hive整合

    • 因为Hive需要把数据存储在HDFS上,并且通过MapReduce作为执行引擎处理数据,因此需要在Hadoop中添加相关配置,以满足Hive在Hadoop上运行

    • 修改Hadoop中core-site.xml,并且Hadoop集群同步配置文件,重启生效。

    <!-- 整合hive -->
    <property>
     <name>hadoop.proxyuser.root.hosts</name>
     <value>*</value>
    </property>
    <property>
     <name>hadoop.proxyuser.root.groups</name>
     <value>*</value>
    </property>
    

    ③安装MySQL

    仅在node1安装即可, 安装链接

    [root@node1 home]# rpm -qa | grep mysql
    [root@node1 home]# rpm -e xxx
    [root@node1 home]# mkdir /export/software/mysql
    [root@node1 home]# cd /export/software/mysql
    [root@node1 home]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
    [root@node1 home]# yum -y install mysql57-community-release-el7-10.noarch.rpm
    [root@node1 home]# yum -y install mysql-community-server
    [root@node1 home]# systemctl start mysqld.service
    [root@node1 home]# cat /var/log/mysqld.log | grep 'password'  # 查看初始密码
    [root@node1 mysql]# mysql -u root -p
    Enter password: 输入初始密码
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 2
    Server version: 5.7.44
    
    Copyright (c) 2000, 2023, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root@123';  # 修改密码
    
    mysql> exit
    [root@node1 mysql]# systemctl enable mysqld  # 设置开机自启动
    [root@node1 mysql]# systemctl list-unit-files | grep mysqld
    mysqld.service                                enabled 
    mysqld@.service                               disabled
    

    注意:如果安装mysql-community-server过程中出现 Public key for mysql-community-server-5.7.44-1.el7.x86_64.rpm is not installed报错,请执行rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022命令后再执行yum -y install mysql-community-server

    ④安装Hive

    集群中选择任意一台集群安装Hive即可,案例中选择node1上安装。

    • 上传安装包并解压缩
    [root@node1 mysql]# cd /export/server
    [root@node1 mysql]# tar -zxvf ./apache-hive-3.1.2-bin.tar.gz
    
    • 配置环境变量

      unset i
      unset -f pathmunge
      export JAVA_HOME=/export/server/jdk1.8.0_65
      export PATH=.:$PATH:$JAVA_HOME/bin:$PATH
      
      export HADOOP_HOME=/export/server/hadoop
      export PATH=.:$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
      #  文件末尾加入下面两行
      export HIVE_HOME=/export/server/apache-hive-3.1.2-bin
      export PATH=.:$PATH:$HIVE_HOME/bin
      [root@node1 lib]# source /etc/profile```
      
      
    • 解决Hive于Hadoop之间guava版本差异

      [root@node1 lib]# rm ./guava-19.0.jar 
      rm: remove regular file ‘./guava-19.0.jar’? y
      [root@node1 lib]# cp /export/server/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar ./
      
    
    *   修改配置文件
    
        hive-env.sh
    
        ```[root@node1 conf]# cd /export/server/apache-hive-3.1.2-bin/conf
        [root@node1 conf]# mv ./hive-env.sh.template ./hive-env.sh
        [root@node1 conf]# vim hive-env.sh
        # Folder containing extra libraries required for hive compilation/execution can be controlled by:
        # export HIVE_AUX_JARS_PATH=
        # --- 文件最后加入下面三行 ---
        export HADOOP_HOME=/export/server/hadoop
        export HIVE_CONF_DIR=/export/server/apache-hive-3.1.2-bin/conf
        export HIVE_AUX_JARS_PATH=/export/server/apache-hive-3.1.2-bin/lib```
    
        hive-site.xml
    
        ```[root@node1 conf]# cd /export/server/apache-hive-3.1.2-bin/conf
        [root@node1 conf]# vim hive-site.xml
        <configuration>
        <property>
         <name>hive.metastore.db.type</name>
         <value>mysql</value>
         <description>使用链接的数据库</description>
        </property>
        <!-- 存储元数据mysql相关配置 -->
        <property>
         <name>javax.jdo.option.ConnectionURL</name>
         <value>jdbc:mysql://node1:3306/hive3?createDatabaseIfNotExist=true</value>
         <description>mysql的url</description>
        </property>
        <property>
         <name>javax.jdo.option.ConnectionDriverName</name>
         <value>com.mysql.cj.jdbc.Driver</value>
         <description>mysql的驱动</description>
        </property>
        <property>
         <name>javax.jdo.option.ConnectionUserName</name>
         <value>root</value>
         <description>mysql用户名</description>
        </property>
        <property>
         <name>javax.jdo.option.ConnectionPassword</name>
         <value>Root@123</value>
         <description>mysql密码</description>
        </property>
        <property>
         <name>hive.metastore.schema.verification</name>
         <value>false</value>
         <description>关闭schema验证</description>
        </property>
        <property>
         <name>hive.cli.print.current.db</name>
         <value>true</value>
         <description>提示当前数据库名</description>
        </property>
        <property>
         <name>hive.cli.print.header</name>
         <value>true</value>
         <description>查询输出时带列名一起输出</description>
        </property>
        <property>
         <name>hive.server2.thrift.bind.host</name>
         <value>node1</value>
         <description>H2S运行绑定host</description>
        </property>
        <property>
         <name>hive.metastore.uris</name>
         <value>thrift://node1:9083</value>
         <description>远程模式部署metastore metastore地址</description>
        </property>
        </configuration>
    
    • 上传mysql jdbc驱动到hive安装包lib下 jar包链接 提取码:d3qx

    
    *   初始化hive
    
        ```[root@node1 conf]# cd /export/server/apache-hive-3.1.2-bin/lib
        [root@node1 lib]# schematool -dbType mysql -initSchema
        # 初始化成功后会在mysql中创建74张表
    
    • 在hdfs创建hive存储目录

      [root@node1 lib]# hadoop fs -mkdir -p /usr/hive/warehouse
      [root@node1 lib]# hadoop fs -chmod g+w /tmp
      [root@node1 lib]# hadoop fs -chmod g+w /usr/hive/warehouse
      
    
    *   启动hive
    
        ```# 前台启动  关闭 ctrl+c
        /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore
        
        # 前台启动开启debug日志
        /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG, console
        
        # 后台启动  进程挂起,使用jps查看进程,使用kill -9杀死进程
        nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
    

    2、hive客户端

    Hive发展至今,总共历经了两代客户端工具。

    • 第一代客户端:$HIVE_HOME/bin/hive,是一个shellUtil。

    • 第二代客户端:$HIVE_HOME/bin/beeline,是一个JDBC客户端,和第一代相比,性能加强安全性提高;是官方强烈推荐使用的Hive命令行工具。

    HiveServer2通过Metastore服务读写元数据。所以在远程模式下,启动HiveServer2之前必须先启动Metastore服务。

    • 在hive安装的服务器上,首先启动metastore服务,然后启动hiveserver2服务。

      nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
      nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &
      
      # jps查看服务是否启动正常,两个RunJar则说明启动成功
      [root@node1 server]# jps
      78065 Jps
      90217 NodeManager
      77513 RunJar
      89480 NameNode
      90072 ResourceManager
      89658 DataNode
      77930 RunJar
      
    
    *   客户端连接
    
        ```# 第一代客户端
        [root@node3 server]# /export/server/apache-hive-3.1.2-bin/bin/hive
        
        # 第二代客户端
        [root@node3 server]# /export/server/apache-hive-3.1.2-bin/bin/beeline
    
    • 连接访问

    node3中运行客户端访问node1中的hive服务

    # node1执行
    [root@node1 server]# scp -r /export/server/apache-hive-3.1.2-bin root@node3:/export/server
    
    # node3执行
    root@node3 server]# /export/server/apache-hive-3.1.2-bin/bin/beeline
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/export/server/apache-hive-3.1.2-bin/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/export/server/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/export/server/apache-hive-3.1.2-bin/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/export/server/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
    Beeline version 3.1.2 by Apache Hive
    beeline> ! connect jdbc:hive2://node1:10000
    Connecting to jdbc:hive2://node1:10000
    Enter username for jdbc:hive2://node1:10000: root
    Enter password for jdbc:hive2://node1:10000: 直接回车
    Connected to: Apache Hive (version 3.1.2)
    Driver: Hive JDBC (version 3.1.2)
    Transaction isolation: TRANSACTION_REPEATABLE_READ
    0: jdbc:hive2://node1:10000> 
    0: jdbc:hive2://node1:10000> show databases;
    INFO  : Compiling command(queryId=root_20240227233311_926b9e5a-a87e-48b9-ac36-67a9c9d013b6): show databases
    INFO  : Concurrency mode is disabled, not creating a lock manager
    INFO  : Semantic Analysis Completed (retrial = false)
    INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
    INFO  : Completed compiling command(queryId=root_20240227233311_926b9e5a-a87e-48b9-ac36-67a9c9d013b6); Time taken: 1.905 seconds
    INFO  : Concurrency mode is disabled, not creating a lock manager
    INFO  : Executing command(queryId=root_20240227233311_926b9e5a-a87e-48b9-ac36-67a9c9d013b6): show databases
    INFO  : Starting task [Stage-0:DDL] in serial mode
    INFO  : Completed executing command(queryId=root_20240227233311_926b9e5a-a87e-48b9-ac36-67a9c9d013b6); Time taken: 0.324 seconds
    INFO  : OK
    INFO  : Concurrency mode is disabled, not creating a lock manager
    +----------------+
    | database_name  |
    +----------------+
    | default        |
    +----------------+
    1 row selected (3.219 seconds)
    0: jdbc:hive2://node1:10000> 
    
    • Hive可视化工具客户端

      DataGrip:下载地址

    • LOAD 语法

    LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;
    

    解决comment中文乱码

    mysql中执行以下语法

    alter table hive3.COLUMNS_V2 modify column comment varchar(256) character set utf8;
    alter table hive3.TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
    alter table hive3.PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
    alter table hive3.PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
    alter table hive3.INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;

    相关文章

      网友评论

          本文标题:Hadoop

          本文链接:https://www.haomeiwen.com/subject/ihztzdtx.html