Hive基础【Hive的基本概念和集群的安装】

154 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

文章目录

Hive基本概念

什么是Hive

Hive:由Facebook开源用于解决海量结构化日志的数据统计工具。

结构化数据:有规律的数据,比如日志文件,不能称之为一张表格,因为其缺少了描述这份数据的元数据(表头,注释等描述信息)。

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。

Hiva不存储数据,将来Hive处理的数据全部存储到HDFS上,Hive还可以将缺少元数据的数据映射成一张表。其实,Hive就是给这份数据加上了一些描述信息。

将一份没有元数据的数据变为一张表的好处就是对于数据处理十分方便,如想要直到一份数据有多少行,对于表可以直接用sql语句执行,十分方便,而对于结构化数据,就只能通过MapReduce来处理。

本质是:将SQL转化成MapReduce程序,,可以认为它是一个翻译器。

==总结:==Hive把一份HDFS数据映射成为表格,让工作人员能够遍历地通过sql语句进行分析,Hive接收到工作人员传送的sql语句之后,将这条sql语句转换成MapReduce程序来帮助工作人员执行,换言之,就是用写sql语句的形式代替写MapReduce程序,好处就是便利!

Hive处理的数据存储在HDFS、Hive分析数据底层的实现是MapReduce、执行程序运行在Yarn上。

Hive特点

优点

  • 操作接口采用类SQL语法,避免了写MapReduce程序,简单、容易上手;
  • Hive的执行延迟比较高,因此Hive常用于数据分析,适合对实时性要求不高的场合,优势在于处理大数据,对于小数据没有优势;
  • Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

缺点

  • Hive的SQL表达能力有限

    mysql不是用来编程,而是用来做数据分析的

    迭代式算法(循环)无法表达、数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现,只能做简单的数据分析。

  • Hive的效率比较低

    用现在的中英文在线翻译举例,机器翻译的效果虽然取得了一定的效果,但始终比不上人类翻译的效果

    Hive自动生成的MapReduce作业,通常情况下不够智能化,Hive调优比较困难,粒度较粗。

虽然Hive有以上缺点,但因为其十分便利,现在仍然使用Hive进行数据分析。从某种程度上来说,程序员都比较懒,要不为什么让计算机帮助人们完成任务!

Hive架构

Hive的工作是给存储在HDFS上的数据加了一些描述,将这些数据映射成一张表并提供sql查询功能。
在这里插入图片描述
重点是hive中Driver的四部分组成:SQL Parser,Physical Plan,Query Optimizer,Execution。

Hive的安装

Hive安装地址

Hive官网地址 hive.apache.org/

文档查看地址 cwiki.apache.org/confluence/…

下载地址 archive.apache.org/dist/hive/

github地址 github.com/apache/hive

mysql安装

上传安装包到linux

  • 检查本机是否存在mysql安装包

rpm -qa | grep -i -E mysql\|mariadb

  • 卸载原有mysql

sudo bash remove_mysql.sh

  • remove_mysql.sh
#!/bin/bash
service mysql stop 2>/dev/null
service mysqld stop 2>/dev/null
rpm -qa | grep -i mysql | xargs -n1 rpm -e --nodeps 2>/dev/null
rpm -qa | grep -i mariadb | xargs -n1 rpm -e --nodeps 2>/dev/null
rm -rf /var/lib/mysql
rm -rf /usr/lib64/mysql
rm -rf /etc/my.cnf
rm -rf /usr/my.cnf
  • 将安装包上传linux服务器/opt/software/目录下

    01_mysql-community-common-5.7.29-1.el7.x86_64.rpm
    02_mysql-community-libs-5.7.29-1.el7.x86_64.rpm
    03_mysql-community-libs-compat-5.7.29-1.el7.x86_64.rpm
    04_mysql-community-client-5.7.29-1.el7.x86_64.rpm
    05_mysql-community-server-5.7.29-1.el7.x86_64.rpm
    apache-hive-3.1.2-bin.tar.gz
    apache-tez-0.9.2-bin.tar.gz
    mysql-connector-java-5.1.48.jar

将五个mysql安装包全部安装

ls *.rpm | xargs -n1 sudo rpm -ivh

将所有的rpm作为参数传到sudo rpm -ivh命令中

  • 启动mysql

sudo systemctl start mysqld

  • 查看密码

sudo cat /var/log/mysqld.log | grep password

登录mysql进行配置

mysql -uroot -p'Gi<gLhF/c0fr'

注意密码要用单引号括起来

  • 设置复杂密码(由于mysql密码策略,此密码必须足够复杂)

set password=password("0Hi=ke3gq");

  • 更改mysql密码策略

    set global validate_password_length=4;
    set global validate_password_policy=0;
    
  • 设置一个简单好记的密码

set password=password("hikehike");

  • 进入mysql库

use mysql;

  • 查询user表

select user,host from user;

  • 修改user表,把host表内容修改为%,root可以让任何人登陆

update user set host="%" where user="root";

  • 刷新

flush privileges;

  • 退出

quit;

hive安装

  • 解压apache-hive-3.1.2-bin.tar.gz到/opt/module/目录下面

tar -zxvf /opt/software/apache-hive-3.1.2-bin.tar.gz -C /opt/module/

  • 修改apache-hive-3.1.2-bin.tar.gz的名称为hive

mv /opt/module/apache-hive-3.1.2-bin /opt/module/hive

  • 修改/etc/profile.d/my_env.sh,添加环境变量

sudo vim /etc/profile.d/my_env.sh

  • 添加内容
#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin

重启Xshell对话框使环境变量生效

  • 替换hive中的guava.jar

cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar $HIVE-HOME/lib/
rm guava-19.0.jar

  • 解决日志Jar包冲突

mv $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak

将hive的元数据配置到MySQL中

  • 拷贝驱动

cp /opt/software/mysql-connector-java-5.1.48.jar $HIVE_HOME/lib

  • 配置Metastore到mysql

在$HIVE_HOME/conf目录下新建hive-site.xml文件

vim $HIVE_HOME/conf/hive-site.xml

添加以下内容

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<!--mysql的元数据仓库 -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hadoop101:3306/metastore?useSSL=false</value>
    </property>
	<!--mysql的Driver -->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.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>hikehike</value>
    </property>
	<!--mysql的元数据仓库在HDFS上什么位置 -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>
	<!--是否验证 -->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
    <property>
        <name>datanucleus.schema.autoCreateAll</name>
        <value>true</value> 
    </property>
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://hadoop101:9083</value>
    </property>

    <property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
    </property>

    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>hadoop101</value>
    </property>

    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>

</configuration>

安装tex引擎

可以将tex看做是加强版的MapReduce,MapReduce的特点是如果有多个MapReduce相衔接,最后的数据一定会存储在磁盘上,上一层MapReduce的结果会通过网络传给下一层的MapReduce,依次类推,在这个过程中会产生大量的网络传输和网络持久化。

tex会将以上动作整合成一个动作,优化成下图(右)所示,将左图中上一份MapReduce输出和下一层MapReduce的输入整合成一个文件,且不会进行写磁盘的操作,所以tex比MapReduce更快,缺点是会用到更多的内存。

在这里插入图片描述

  • 解压tar包

    tar -zxvf /opt/software/apache-tez-0.9.2-bin.tar.gz -C /opt/module

  • 重命名

    mv /opt/module/apache-tez-0.9.2-bin /opt/module/tez

  • 上传tez依赖到HDFS

    在module目录下新建

    hadoop fs -mkdir /tez

    hadoop fs -put /opt/module/tez/share/tez.tar.gz /tez

  • 新建tez-site.xml

    vim $HADOOP_HOME/etc/hadoop/tez-site.xml

    添加如下内容

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <!-- 使用哪个tar包 -->
    <property>
    	<name>tez.lib.uris</name>
        <value>${fs.defaultFS}/tez/tez.tar.gz</value>
    </property>
    <property>
         <name>tez.use.cluster.hadoop-libs</name>
         <value>false</value>
    </property>
    <property>
         <name>tez.history.logging.service.class</name>
         <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value>
    </property>
    </configuration>
    
  • 修改Hadoop环境变量

    vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh

  • 添加Tez的Jar包相关信息

    export TEZ_CONF_DIR=$HADOOP_HOME/etc/hadoop
    export TEZ_JARS=/opt/module/tez
    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${TEZ_CONF_DIR}:${TEZ_JARS}/*:${TEZ_JARS}/lib/*
    
  • 修改Hive的计算引擎

    vim $HIVE_HOME/conf/hive-site.xml

    添加以下信息

    <property>
        <name>hive.execution.engine</name>
        <value>tez</value>
    </property>
    
  • 解决日志tar包冲突

    rm /opt/module/tez/lib/slf4j-log4j12-1.7.10.jar

hive配置完成!

启动hive

  • 登录mysql

    mysql -uroot -phikehike

  • 新建hive元数据库

    create database metastore;
    quit;
    
  • 初始化hive元数据库

    schematool -initSchema -dbType mysql -verbose

  • 启动metastore和hiveserver2

    编写hive服务启动脚本

    vim $HIVE_HOME/bin/hiveservices.sh

    添加以下内容

    #!/bin/bash
    HIVE_LOG_DIR=$HIVE_HOME/logs
    META_PID=/tmp/meta.pid
    SERVER_PID=/tmp/server.pid
    mkdir -p $HIVE_LOG_DIR
    
    function hive_start()
    {
        nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &
    echo $! > $META_PID
    sleep 8
        nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveserver2.log 2>&1 &
        echo $! > $SERVER_PID
    }
    
    function hive_stop()
    {
        if [ -f $META_PID ]
        then
            cat $META_PID | xargs kill -9
            rm $META_PID
        else
            echo "Meta PID文件丢失,请手动关闭服务"
        fi
        if [ -f $SERVER_PID ]
        then
            cat $SERVER_PID | xargs kill -9
            rm $SERVER_PID
        else
            echo "Server2 PID文件丢失,请手动关闭服务"
        fi
    
    }
    
    case $1 in
    "start")
        hive_start
        ;;
    "stop")
        hive_stop
        ;;
    "restart")
    hive_stop
    sleep 2
        hive_start
        ;;
    *)
        echo Invalid Args!
        echo 'Usage: '$(basename $0)' start|stop|restart'
        ;;
    esac
    
  • Hive运行日志信息配置

    cd /opt/module/hive/conf/

    mv hive-log4j2.properties.template hive-log4j2.properties

    vim hive-log4j2.properties

    修改

    hive.log.dir=/opt/module/hive/logs

  • 添加执行权限

    chmod +x $HIVE_HOME/bin/hiveservices.sh

  • 启动后台hive服务

    hiveservices.sh start

    看到两个RunJar,运行netstat -nltp | grep -E 25465\|25242,如果看到3个端口(1000、10002、9083)说明hive启动成功!

    25465、25242是两个RunJar的进行号