一、安装教程
-
切换路径:cd /opt/module
-
下载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
-
解压并且重命名:tar -zxvf apache-hive-3.1.2-bin.tar.gz -> mv apache-hive-3.1.2-bin hive
-
配置环境变量:vi /etc/profile ,最后一行后面加上以下内容
#添加下面两行 export HIVE_HOME=/opt/module/hive export PATH=$PATH:$HIVE_HOME/bin
重置环境变量:source /etc/profile
-
将hadoop的lib中高版本的 /opt/module/hadoop-3.2.2/share/hadoop/common/lib/guava-27.0-jre.jar包复制到hive/lib下,并删除hive下的低版本guava包
-
添加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&characterEncoding=UTF-8&useSSL=false&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>
-
下载连接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
-
在MysqL上创建Hive的元数据存储库:create database hivedb;
-
执行Hive的初始化工作
cd /opt/module/hive/bin ./schematool -initSchema -dbType MysqL
-
修改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;
-
使用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';
-
使用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
二、问题
-
为什么需要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获取元数据的目的。
-
什么时候需要开启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>
-
遇到报错: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
三、编写启动脚本
-
mkdir /opt/module/hive/logs
-
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 &
-
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 &
-
chmod u+x metastore.sh
-
chmod u+x hiveserver2.sh
四、sql语法
-
创建数据库:create database ffcs;
-
建表: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'); --#在表属性中添加支持事务
-
create table people(id int comment '主键id',name String comment '名字') row format delimited fields terminated by ',';
-
插入数据:insert into student values(1, ‘abc’);
-
查询:select * from student;
-
修改:update student set name=‘xiaozhan’ where id=‘1’;
-
查看表:show tables;
-
查看其他库的表:show tables in 库名;
-
查看数据库:show databases;
-
切换数据库:use 库名;
-
查看表情况:desc format people;
-
查看当前属于哪个库:select current_database();
-
限制查询条数(第3条开始,往后5条):select * from 表 limit 3,5
-
查看当前库有哪些函数:show functions;
-
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语句
原文地址:https://www.jb51.cc/wenti/3287545.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。