10-hive-元数据及其他方式访问hive:
使用元数据服务的方式访问 Hive (类似将hive提供了一个服务端)
1)在hive-site.xml 文件中添加如下配置信息
<!-- 指定存储元数据要连接的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop102:9083</value>
</property>
2)启动 metastore
[root@hadoop202 hive]$ bin/hive --service metastore
注意: 启动后窗口不能再操作,需打开一个新的 shell 窗口做别的操作
3)启动 hive
[root@hadoop202 hive]$ bin/hive
使用 JDBC 方式访问 Hive
1)在 hive-site.xml 文件中添加如下配置信息
<!-- 指定 hiveserver2 连接的 host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop102</value>
</property>
<!-- 指定 hiveserver2 连接的端口号 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
2)启动 hiveserver2
[root@hadoop102 hive]$ bin/hive --service hiveserver2
3)启动 beeline 客户端(需要多等待一会)
[root@hadoop102 hive]$ bin/beeline -u jdbc:hive2://hadoop102:10000 -n root
遇见错误,hiveserver2未成功启动。
查看日志提示:
主要报错内容是:java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException:User: root is not allowed to impersonate anonymous
解决办法:通过httpfs协议访问rest接口,以root用户包装自己用户的方式操作HDFS
首先需要开启rest接口,在hdfs-site.xml文件中加入:
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
然后在core-site.xml文件中加入:
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
4)看到如下界面
5)编写 hive 服务启动脚本(重点脚本相关命令多了解一下)
(1) 前台启动的方式导致需要打开多个 shell 窗口,可以使用如下方式后台方式启动
nohup: 放在命令开头,表示不挂起,也就是关闭终端进程也继续保持运行状态
/dev/null:是 Linux 文件系统中的一个文件,被称为黑洞,所有写入改文件的内容
都会被自动丢弃
2>&1 : 表示将错误重定向到标准输出上
&: 放在命令结尾,表示后台运行
一般会组合使用: nohup [xxx 命令操作]> file 2>&1 &,表示将 xxx 命令运行的结
果输出到 file 中,并保持命令启动的进程在后台运行。主要使用以下脚本。
[root@hadoop102 hive]$ nohup hive --service metastore 2>&1 &
[root@hadoop102 hive]$ nohup hive --service hiveserver2 2>&1 &
编写脚本,在$HIVE_HOME/bin下创建hiveservices.sh
#!/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 hive --service 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)添加执行权限
[root@hadoop102 hive]$ chmod +x $HIVE_HOME/bin/hiveservices.sh
4)启动 Hive 后台服务
[root@hadoop102 hive]$ hiveservices.sh start
hiveservices.sh start/stop/restart/status
启动客户端 bin/beeline -u jdbc:hive2://hadoop102:10000 -n root
Hive日常其他交互命令(使用于脚本):
1)“-e”不进入 hive 的交互窗口执行 sql 语句
[root@hadoop102 hive]# bin/hive -e “select * from test;”
2)“-f”执行脚本中 sql 语句
(1)在/opt/module/hive/下创建 hive-sql文件
[root@hadoop102 hive]# vim hive-sql
(2)文件中写入正确的 sql 语句
select * from test;
select count(id) from test;
(3)执行文件中的 sql 语句
[root@hadoop102 hive]# bin/hive -f hive-sql
(4)执行文件中的 sql 语句并将结果写入文件中
[root@hadoop102 hive]# bin/hive -f hive-sql > hive_result.txt
Hive 其他命令操作(作用不大,了解)
1)退出 hive 窗口:
exit; quit;
2)在hive cli** 命令窗口中如何查看 hdfs 文件系统
hive(default)>dfs -ls /;
3)查看在 hive 中输入的所有历史命令
(1)进入到当前用户的根目录 /root 或/home/atguigu
(2)查看. hivehistory 文件
[root@hadoop102 ~]$ cat .hivehistory
Hive 常见属性配置
Hive 运行日志信息配置
Hive 的log默认存放在/tmp/root/hive.log 目录下(当前用户名下)
修改 hive 的 log 存放日志到/opt/module/hive/logs
(1)修改/opt/module/hive/conf/hive-log4j2.properties.template 文件名称为hive-log4j2.properties
[root@hadoop102 hive]#mv hive-log4j2.properties.template hive
log4j2.properties
(2)在 hive-log4j2.properties 文件中修改 log 存放位置
hive.log.dir=/opt/module/hive/logs
打印 当前库 和 表头
在 hive-site.xml 中加入如下两个配置:
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
参数配置方式
1)查看当前所有的配置信息,都是key-value的形式
hive>set;
2)参数的配置三种方式
(1)配置文件方式
默认配置文件:hive-default.xml,用户自定义配置文件:hive-site.xml
注意:用户自定义配置会覆盖默认配置。另外,Hive 也会读入 Hadoop 的配置,因为 Hive是作为 Hadoop 的客户端启动的,Hive 的配置会覆盖 Hadoop 的配置。配置文件的设定对本机启动的所有 Hive 进程都有效。
(2)命令行参数方式
启动 Hive 时,可以在命令行添加-hiveconf param=value 来设定参数。
例:
[root@hadoop102 hive]$ bin/hive -hiveconf mapred.reduce.tasks=10;
注意:仅对本次 hive 启动有效
查看参数设置:
hive (default)> set mapred.reduce.tasks;
(3)参数声明方式
可以在 HQL 中使用 SET 关键字设定参数
例如:
hive (default)> set mapred.reduce.tasks=100;
注意:仅对本次 hive 启动有效。
查看参数设置
hive (default)> set mapred.reduce.tasks;
上述三种设定方式的优先级依次递增。即配置文件<命令行参数<参数声明。注意某些系