Hive
Hive基本概念
- Hive是基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL的查询功能
- Hive的本质是将HQL转化成MapReduce程序
- Hive处理的数据存储在HDFS + Hive分析数据底层的实现是MapReduce + 执行程序运行在Yarn上
Hive的优缺点
优点:
1. 操作接口采用类SQL语法,提供快速开发的能力
2. 避免了去写MapReduce,减少开发人员的学习成本
3. Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合
4. Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高
5. Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
缺点:
1. Hive的HQL表达能力有限
1. 迭代式算法无法表达:第一个mr的结果做第二个mr的输入
2. 数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现
2. Hive的效率比较低
1. Hive自动生成的MapReduce作业,通常情况下不够智能化
2. Hive调优比较困难,粒度较粗
Hive架构
解析器
编译器
优化器
执行器
Hive与数据库比较
1. 查询语言相似
2. 数据更新:Hive读多写少,默认不支持更新
3. 执行延迟:Hive慢
4. 数据规模:Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小
Hive安装部署
tar -zxvf /opt/software/apache-hive-3.1.2-bin.tar.gz -C /opt/module/
mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive
sudo vim /etc/profile.d/my_env.sh
#export HIVE_HOME=/opt/module/hive
#export PATH=$PATH:$HIVE_HOME/bin
#初始化元数据库
bin/schematool -dbType derby -initSchema
#启动hadoop
myhadoop.sh start
#启动hive
bin/hive
修改MR内存配置
#/opt/module/hadoop/etc/hadoop/mapred-site.xml 加以下内容
<property>
<name>mapreduce.map.memory.mb</name>
<value>1536</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1024M</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>3072</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx2560M</value>
</property>
/opt/module/hive/conf/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://10.10.130.161:3306/xl_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>
继续
schematool -initSchema -dbType mysql -verbose
/opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml配置以下内容,解决“ xiaxia is not allowed to impersonate root”
<property>
<name>hadoop.proxyuser.xiaxia.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.xiaxia.groups</name>
<value>*</value>
</property>
/opt/module/hive/bin/hiveservice.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 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
在 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>
HQL
-- 创建表
-- songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
-- yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited fields terminated by ',' -- 列分隔符
collection items terminated by '_' -- MapStruct和Array的分隔符(数据分隔)
map keys terminated by ':' -- Map中的key和value的分隔符
lines terminated by '\n'; -- 行分隔符
-- 查询表
select friends[1],children['xiao song'],address.city from test where name=''songsong;
-- 类型转换
select '1'+2, cast('1' as int)+2;
-- 建库
create database if not exist database_name comment database_comment location dafs_path ;
create database db_hive2 location '/db_hive2.db';
-- 显示数据库
show databases;
show databases like 'db_hive*';
-- 查看数据库详情
desc database db_hive;
desc database extended db_hive;
-- 切换数据库
use db_hive;
-- 修改数据库
alter database db_hive set dbproperties('createtime'='2023.01.10');
-- 删除数据库
drop database db_hive2;
-- 删除数据库不为空时,可以用casecase命令,强制删除
drop database db_hive cascade;
-- 建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]
-- 管理表与外部表互相转换
desc formatted test;
alter table test set tblproperties('EXTERNAL'='TRUE');
alter table test set tblproperties('EXTERNAL'='FALSE');
-- 重命名表
alter table table_name rename to new_table_name;
管理表
也叫内部表。
当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。
外部表
因为是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
标签:name,--,db,hive,echo,Hive From: https://www.cnblogs.com/lili-xia/p/17996877