hive搭建教程及相关语法介绍

一、安装教程

  1. 切换路径:cd /opt/module

  2. 下载hive:wget https://mirrors.tuna.tsinghua.edu.cn/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=/opt/module/hive
    export PATH=$PATH:$HIVE_HOME/bin
    

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

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

  6. 添加Hive核心配置,选择远程MySQL模式:vi /opt/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>
    <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>
    
    <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>
    <property>
        <name>hive.exec.dynamic.partition.mode</name>
        <value>nonstrict</value>
    </property>
    <property>
        <name>hive.txn.manager</name>
        <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
    </property>
    <property>
        <name>hive.compactor.initiator.on</name>
        <value>true</value>
    </property>
    <property>
        <name>hive.compactor.worker.threads</name>
        <value>1</value>
    </property>
    </configuration>
    
  7. 下载连接MySQL的驱动包到hive的lib目录下

    cd /opt/module/hive/lib
    # 下载MySQL驱动包
    wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.17/mysql-connector-java-8.0.17.jar
    
  8. 在MySQL上创建Hive的元数据存储库:create database hivedb;

  9. 执行Hive的初始化工作

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

  11. 修改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;
    
  12. 使用hive

    # 启动hive
    hive
    # 建表
    create table student(id int,name String)clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');
    # 插入数据
    insert into student values(1, 'abc');
    # 插入成功后,查询
    select * from student;
    #测试修改
    update student set name='xiaozhan' where id='1';
    
  13. 使用beeline连接测试

    1)首先启动hiveserver2服务

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

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

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

    cd /opt/module/hive
    # 进入beeline客户端
    bin/beeline
    # 执行连接hiveserver2操作
    !connect jdbc:hive2://node10:10000/default
    #测试
    show tables;
    
    # 或者
    bin/beeline -u jdbc:hive2://node10:10000/default -n root -p ffcsict123
    

二、问题

  1. 为什么需要metastore和hiveserver2

    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.

    解决:hdfs dfsadmin -safemode leave ,关闭安全模式
    ​ ps:如果还是不行,则执行hdfs dfsadmin -safemode forceExit

三、编写启动脚本

  1. mkdir /opt/module/hive/logs

  2. metastore.sh

    #构建变量
    HIVE_HOME=/opt/module/hive
    ## 启动服务的时间
    DATE_STR=`/bin/date '+%Y%m%d%H%M%S'`
    # 日志文件名称(包含存储路径)
    HIVE_METASTORE_LOG=${HIVE_HOME}/logs/hivemetastore-${DATE_STR}.log
    ## 启动服务
    nohup hive --service metastore > ${HIVE_METASTORE_LOG} 2>&1 &
    
  3. hiveserver2.sh

    #构建变量
    HIVE_HOME=/opt/module/hive
    ## 启动服务的时间
    DATE_STR=`/bin/date '+%Y%m%d%H%M%S'`
    # 日志文件名称(包含存储路径)
    HIVE_SERVER2_LOG=${HIVE_HOME}/logs/hiveserver2-${DATE_STR}.log
    ## 启动服务
    nohup ${HIVE_HOME}/bin/hiveserver2>>${HIVE_SERVER2_LOG} 2>&1 &
    
  4. chmod u+x metastore.sh

  5. chmod u+x hiveserver2.sh

四、sql语法

  1. 创建数据库:create database ffcs;

  2. 建表:create table student(id int,name String)clustered by (id) into 2 buckets stored as orc TBLPROPERTIES(‘transactional’=‘true’);

    create table people(id int comment '主键id',name String comment '名字') 
    clustered by (id) into 2 buckets 										--#必须支持分桶.上传时该配置将会调用mapreduce,引起效率低下。
    row format delimited fields terminated by ','  							--#设置分隔符,默认\001字符
    stored as orc 															--#指定格式,默认txt,默认方式可以直接上传txt文件解析
    TBLPROPERTIES('transactional'='true');									--#在表属性中添加支持事务
    
  3. 可以通过上传txt文件来映射数据,仅支持默认的txt模式

    create table people(id int comment '主键id',name String comment '名字') row format delimited fields terminated by ',';
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-blhLX0j9-1661262330791)(C:\Users\86188\AppData\Roaming\Typora\typora-user-images\image-20220821154626285.png)]

  4. 插入数据:insert into student values(1, ‘abc’);

  5. 查询:select * from student;

  6. 修改:update student set name=‘xiaozhan’ where id=‘1’;

  7. 查看表:show tables;

  8. 查看其他库的表:show tables in 库名;

  9. 查看数据库:show databases;

  10. 切换数据库:use 库名;

  11. 删除数据库(库底下必须没有表):drop database 库名;

  12. 查看表情况:desc format people;

  13. 查看当前属于哪个库:select current_database();

  14. 限制查询条数(第3条开始,往后5条):select * from 表 limit 3,5

  15. 查看当前库有哪些函数:show functions;

  16. 查看当前库有函数功能:describe function extended count;

  17. load语法:LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename;
    1)local指的是hiveserver2的服务所在的本地linux系统。(local加载是一个纯复制的过程)
    2)不写local,则是从hdfs服务器加载数据。(非local加载是一个纯移动的过程)
    3)overWrite会把之前的数据全部干掉,慎重
    4)插入数据,走insert sql语句,很慢,因为需要走MR程序。所以一般走load语句

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...