Hive数据管理
用来进行数据提取,转换,加载,这是一种可以存储、查询和分析存储在hadoop中大规模数据机制。把结构化数据当做一张表,提供sql查询。但是不支持更新,索引,事务。将sql转换成mapReduce任务进行运行,
下载apache-hive-3.1.2-bin.tar.gz 放在目录/myfiles/hive 解压 tar -zxvf apache-hive-2.3.7-bin.tar.gz
http://mirror.bit.edu.cn/apache/hive/
修改环境变量
vim /etc/profile
export HIVE_HOME=/myfiles/hive/apache-hive-3.1.2-bin
export PATH=$PATH:$HIVE_HOME/bin
//执行
source /etc/profile
hive --version 查看版本
下载mysql-connector-java-5.1.39.jar
添加到/myfiles/hive/apache-hive-3.1.2-bin/lib下
/myfiles/hive/apache-hive-3.1.2-bin/conf目录下
mv hive-env.sh.template hive-env.sh
修改hive-env.sh
添加
HADOOP_HOME=/myfiles/hadoop/hadoop-3.2.1
export HIVE_CONF_DIR=/myfiles/hive/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/myfiles/hive/apache-hive-3.1.2-bin/lib
新增配置文件hive-site.xml
//编辑
vim hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.100.3:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>tietong</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>tietong</value>
</property>
<property>
<name>datanucleus.readOnlyDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.autoCreateSchema</name>
<value>true</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateTables</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateColumns</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<!-- 显示表的列名 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 显示数据库名称 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- DBserver 查看表数据,不设置会报错 hive Storage schema reading not supported -->
<property>
<name>metastore.storage.schema.reader.impl</name>
<value>org.apache.hadoop.hive.metastore.SerDeStorageSchemaReader</value>
</property>
<!-- DBserver select * from 对应HBase得表得时候,报错connection closed row 'todopool' on table 'hbase:meta'
默认情况下,HiveServer2以提交查询的用户执行查询(true),如果hive.server2.enable.doAs设置为false,查询将以运行hiveserver2进程的用户运行
-->
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
</configuration>
格式化数据库
schematool -dbType mysql -initSchema
命令输入hive启动。
报错解决:
1. 我这里启动报错:main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/
checkArgument这个类所在的jar包为:guava.jar。该jar包版本不一致。
将jar包变成一致的版本:删除hive中低版本jar包,将hadoop(/myfiles/hadoop/hadoop-3.2.1/share/hadoop/common/lib)中高版本的guava-27.0-jre.jar复制到hive的lib(/myfiles/hive/apache-hive-2.3.7-bin/lib)中。删除hive的guava-14.0.1.jar
然后进入hive命令界面,安装成功
create database hive_1;
show databases;
DBeaver远程连接hive(暂时没有试验成功 所以下面远程连接暂时删除)
1. 启动 远程服务
启动hiveserver2服务
nohup ./hive --service hiveserver2 & .
配置驱动
hadoop-common-3.2.1.jar是从/myfiles/hadoop/hadoop-3.2.1/share/hadoop/common中下载
hive-jdbc-3.1.2-standalone.jar是从/myfiles/hive/apache-hive-3.1.2-bin/jdbc中下载
连接
在hadoop的配置文件core-site.xml中添加如下属性:
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
实际应用
mysql中初始化得hive数据库,为hive使用得基础系统表。
hive语法与mysql一致。查询得结果就是基于mapReduce运行后得到的结果。所以没有实时性。
Hive适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。Hive不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。
Hbase是Hadoop database 的简称,是一种NoSQL数据库,非常适用于海量明细数据(十亿、百亿)的随机实时查询,如交易清单、轨迹行为等。
hive支持select u.name, o.orderid from order o join user u on o.uid = u.uid;
一、部分场景,可以在hive中create database ,然后create table,然后将数据insert 到表中,然后进行查询等等。
二、部分场景,hive与hdfs结合。将普通的hdfs文件导入hive中
create table aaa(time string,myname string,yourname string) row format delimited
fields terminated by '\t' lines terminated by '\n' stored as textfile;
根据\t分隔字符串
load data local inpath '/root/aaaa.txt' overwrite into table aaa;
将Select的结果导出成文件
insert overwrite local directory '/tmp' select a.time from aaa a;
将Select的结果保存到另一张表
insert overwrite table test select uid,name from test2;
将Select的结果保存到hdfs
INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>';
三、对于我这边来讲,首先是基于hbase + phoenix 实现基于hbase的数据库表存储,支持实时查询的。并且支持非常大的数据量。
我们会将hbase与hive结合起来。
hbase配置文件中
这个目录是region server的共享目录,用来持久化Hbase.如果是单机,hbase和zookeeper会运行在同一个JVM中。
1. Hive集成Hbase
Hive与HBase整合的实现是利用两者本身对外的API接口互相通信来完成的。工作是由hive的libe目录,hive-hbase-handler-.jar工具类来实现的。将jar复制到hbase/lib中
注: 如果在hive整合hbase中,出现版本之类的问题,那么以hbase的版本为主,将hbase中的jar包覆盖hive的jar包
cp /myfiles/hive/apache-hive-3.1.2-bin/lib/hive-hbase-handler-3.1.2.jar /myfiles/hbase/hbase-2.2.4/lib
其他node02和node03
scp /myfiles/hive/apache-hive-3.1.2-bin/lib/hive-hbase-handler-3.1.2.jar root@node02:/myfiles/hbase/hbase-2.2.4/lib
hive和hbase底层已经打通。
上层,我们通过HQL建立表来关联。hive也创建一个表,与hbase映射。
create EXTERNAL table SN_PORTAL_TODO_LIST(id int,sheet_id string, app_id string,app_name string,send_user_id string,send_user_name string, create_name string) stored by
'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with
serdeproperties("hbase.columns.mapping"=":key,0:\x80\x0B,0:\x80\x0C,0:\x80\x0D,0:\x80\x0E,0:\x80\x0F,0:\x80\x10")
tblproperties("hbase.table.name"="SN_DIVERSION:PORTAL_TODO_LIST","hbase.mapred.output.outputtable" = "SN_PORTAL_TODO_LIST");
第一个为hive表名
hbase.columns.mapping hive字段与hbase列族映射
例如:st1就是列族,name就是列,通过:连接。
其中key对应hbase的rowkey,value对应hbase的列族进行映射
tblproperties中,第一个为hbase表名
1. 创建hive表无EXTERNAL
这种情况是hbase本来没有这张表。hive建表时创建了hbase表。这种情况下,hdfs的hive表目录有hive文件夹,但是里面没有数据
2.EXTERNAL创建hive表
hbase里面已经有这张表了,创建一个hive表去管理这hbase表。
create EXTERNAL table todopool_lv(id String,region string, title string,appid string) stored by
'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with
serdeproperties("hbase.columns.mapping"=":key,baseinfo:region,baseinfo:itemTitle,baseinfo:appId")
tblproperties("hbase.table.name"="todopool","hbase.mapred.output.outputtable" = "todopool");
然后我们在操作hbase的时候。在hive select 回同步一样的数据。
使用Hive集成HBase表的需注意
- 对HBase表进行预分区,增大其MapReduce作业的并行度
- 合理的设计rowkey使其尽可能的分布在预先分区好的Region上
- 通过set hbase.client.scanner.caching设置合理的扫描缓存