Hive

Hive

Hive基本概念

  1. Hive是基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL的查询功能
  2. Hive的本质是将HQL转化成MapReduce程序
  3. 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并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。

posted @ 2024-01-30 12:56  停不下的时光  阅读(22)  评论(0编辑  收藏  举报