一:将本地文件导入Hive案例
- 需求:
将本地/opt/module/datas/student.txt这个目录下的数据导入到hive的student(id int, name string)表中。 - 数据准备:
⑴在/opt/module/datas/student.txt 这个目录下准备数据
- 启动hive,在数据库中创建的student表,并声明文件分隔符’\t’
sql为:create table student(id int,name string) row format delimited fields terminated by '\t'; - 加载/opt/module/datas/student.txt 文件到 student 数据库表中。
sql:load data local inpath '/opt/module/datas/student.txt' into table student;
- 遇到的问题
⑴现在我们使用的是一个102连接窗口启动hive数据库,如果我们再打开一个102连接窗口去启动hive,就会报错
我们在第二个窗口也启动hive试试:
⑵原因:
Metastore(元数据) 默认存储在自带的 derby 数据库中,只支持一个hive客户端连接。
推荐使用 MySQL 存储 Metastore;
二:Mysql安装
- 查看mysql是否安装,如果安装了,可以先卸载掉
- 版本:
- 上传到Linux上
- 将文件解压到/usr/local/目录下
- 修改文件夹的名称
-
检查并创建用户和用户组
-
创建data文件夹
-
授权授权目录和用户
-
安装并初始化
命令如下:datadir就是安装路径,basedir就是根目录
/usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
-
复制启动脚本到资源目录
-
增加mysqld服务控制脚本执行权限
-
将mysqld服务加入到系统服务
-
检查mysqld服务是否已经生效
-
启动mysql(注意:安装目录一定要在/usr/local下)
-
登录mysql(提示找不到mysql命令)
-
解决
-
再次登录
-
修改密码
-
最后退出使用修改后的密码登录
-
连接出现如下
-
解决
-
连接成功
三:将Hive元数据拷贝到mysql
- 驱动拷贝,将mysql-connector-java-5.1.38.jar拷贝到/opt/module/hive/lib/
- 在/opt/module/hive/conf 目录下创建一个 hive-site.xml
- 根据官方文档配置mysql参数,拷贝数据到 hive-site.xml 文件中。
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- jdbc 连接的 URL --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop20:3306/metastore?useSSL=false</value> </property> <!-- jdbc 连接的 Driver--> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <!-- jdbc 连接的 username--> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <!-- jdbc 连接的 password --> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> </property> <!-- Hive 元数据存储版本的验证 --> <property> <name>hive.metastore.schema.verification</name> <value>false</value> </property> <!--元数据存储授权--> <property> <name>hive.metastore.event.db.notification.api.auth</name> <value>false</value> </property> <!-- Hive 默认在 HDFS 的工作目录 --> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> </configuration>
- 登陆 MySQL,新建 Hive 元数据库
mysql> create database metastore; mysql> quit;
- 初始化 Hive 元数据库
[kgf@hadoop20 hive]$ schematool -initSchema -dbType mysql -verbose
- 配置完毕后,如果启动 hive 异常,可以重新启动虚拟机。(重启后,别忘了启动 hadoop
集群),启动hive后可以发现我们之前的student表不见了,我们看看mysql数据库变化
- mysql数据库变化,多了一个元数据库,之前是没有的
- 多窗口启动测试,可以的
四:Hive中常用的交互命令
- 首先在hive中新建一张表,并且导入一些数据
- “-e”不进入 hive 的交互窗口执行 sql 语句
- “-f”执行脚本中 sql 语句
⑴新建一个sql脚本
⑵执行sql脚本
- 执行文件中的 sql 语句并将结果写入文件中
五: Hive 其他命令操作
- 在 hive cli 命令窗口中如何查看 hdfs 文件系统
- 在 hive cli 命令窗口中如何查看 hdfs 本地系统
- 查看在 hive 中输入的所有历史命令
a:进入到当前用户的根目录
b:查看. hivehistory 文件
六、使用 JDBC 方式访问 Hive
1)在 hive-site.xml 文件中添加如下配置信息
<!-- 指定 hiveserver2 连接的 host --> <property> <name>hive.server2.thrift.bind.host</name> <value>hadoop20</value> </property> <!-- 指定 hiveserver2 连接的端口号 --> <property> <name>hive.server2.thrift.port</name> <value>10000</value> </property>
2)启动 hiveserver2
[kgf@hadoop20 hive]$ bin/hive --service hiveserver2 which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_191//bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/opt/module/hive/bin:/home/kgf/.local/bin:/home/kgf/bin) 2022-06-20 14:16:48: Starting HiveServer2 Hive Session ID = 3209018e-3dcb-4576-bdcb-ab2ed5a55f66 Hive Session ID = 0822263d-09c6-4096-ae50-123ba4b3f3e8
3)启动 beeline 客户端(需要多等待一会)
[kgf@hadoop20 hive]$ bin/beeline -u jdbc:hive2://hadoop20:10000 -n kgf
4)看到如下界面
[kgf@hadoop20 hive]$ bin/beeline -u jdbc:hive2://hadoop20:10000 -n kgf Connecting to jdbc:hive2://hadoop20:10000 Connected to: Apache Hive (version 3.1.2) Driver: Hive JDBC (version 3.1.2) Transaction isolation: TRANSACTION_REPEATABLE_READ Beeline version 3.1.2 by Apache Hive 0: jdbc:hive2://hadoop20:10000>
七、编写 hive 服务启动脚本
(1) 前台启动的方式导致需要打开多个 shell 窗口,可以使用如下方式后台方式启动
nohup: 放在命令开头,表示不挂起,也就是关闭终端进程也继续保持运行状态
/dev/null:是 Linux 文件系统中的一个文件,被称为黑洞,所有写入改文件的内容 都会被自动丢弃。
2>&1 : 表示将错误重定向到标准输出上
&: 放在命令结尾,表示后台运行
一般会组合使用: nohup [xxx 命令操作]> file 2>&1 &,表示将 xxx 命令运行的结 果输出到 file 中,并保持命令启动的进程在后台运行。
(2)启动的名称参考如下
[kgf@hadoop20 hive]$ nohup hive --service metastore 2>&1 & [kgf@hadoop20 hive]$ nohup hive --service hiveserver2 2>&1 &
(3)为了方便使用,可以直接编写脚本来管理服务的启动和关闭
#!/bin/bash HIVE_LOG_DIR=$HIVE_HOME/logs if [ ! -d $HIVE_LOG_DIR ] #判断该目录是否存在 then mkdir -p $HIVE_LOG_DIR fi #检查进程是否运行正常,参数 1 为进程名,参数 2 为进程端口 function check_process() { pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}') ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut - d '/' -f 1) echo $pid [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1 } function hive_start() { metapid=$(check_process HiveMetastore 9083) cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &" [ -z "$metapid" ] && eval $cmd || echo "Metastroe 服务已启动" server2pid=$(check_process HiveServer2 10000) cmd="nohup hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &" [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2 服务已启动" } function hive_stop() { metapid=$(check_process HiveMetastore 9083) [ "$metapid" ] && kill $metapid || echo "Metastore 服务未启动" server2pid=$(check_process HiveServer2 10000) [ "$server2pid" ] && kill $server2pid || echo "HiveServer2 服务未启动" } case $1 in "start") hive_start ;; "stop") hive_stop ;; "restart") hive_stop sleep 2 hive_start ;; "status") check_process HiveMetastore 9083 >/dev/null && echo "Metastore 服务运行 正常" || echo "Metastore 服务运行异常" check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运 行正常" || echo "HiveServer2 服务运行异常" ;; *) echo Invalid Args! echo 'Usage: '$(basename $0)' start|stop|restart|status' ;; esac
3)添加执行权限
[kgf@hadoop20 hive]$ chmod +x $HIVE_HOME/bin/hiveservices.sh
4)启动 Hive 后台服务
[kgf@hadoop20 hive]$ hiveservices.sh start