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配置文件中

hive1跟hive3有没有区别 hive2和hive3_ssh

 这个目录是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");

hive1跟hive3有没有区别 hive2和hive3_hive_02

 然后我们在操作hbase的时候。在hive select 回同步一样的数据。

使用Hive集成HBase表的需注意

  1. 对HBase表进行预分区,增大其MapReduce作业的并行度
  2. 合理的设计rowkey使其尽可能的分布在预先分区好的Region上
  3. 通过set hbase.client.scanner.caching设置合理的扫描缓存