Hive
Hive构成原理
服务端组件:
Driver组件:该组件包括Complier、Optimizer和Executor,它的作用是将我们写的HiveQL(类SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的mapreduce计算框架。
Metastore组件:元数据服务组件,这个组件存储hive的元数据,hive的元数据存储在关系数据库里,hive支持的关系数据库有derby、mysql。元数据对于hive十分重要,因此hive支持把metastore服务独立出来,安装到远程的服务器集群里,从而解耦hive服务和metastore服务,保证hive运行的健壮性,这个方面的知识,我会在后面的metastore小节里做详细的讲解。
Thrift服务:thrift是facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。
客户端组件:
CLI:command line interface,命令行接口。
Thrift客户端:上面的架构图里没有写上Thrift客户端,但是hive架构的许多客户端接口是建立在thrift客户端之上,包括JDBC和ODBC接口。
WEBGUI:hive客户端提供了一种通过网页的方式访问hive所提供的服务。这个接口对应hive的hwi组件(hive web interface),使用前要启动hwi服务。
Hive的metastore组件是hive元数据集中存放地。Metastore组件包括两个部分:metastore服务和后台数据的存储。后台数据存储的介质就是关系数据库,例如hive默认的嵌入式磁盘数据库derby,还有mysql数据库。Metastore服务是建立在后台数据存储介质之上,并且可以和hive服务进行交互的服务组件,默认情况下,metastore服务和hive服务是安装在一起的,运行在同一个进程当中。我也可以把metastore服务从hive服务里剥离出来,metastore独立安装在一个集群里,hive远程调用metastore服务,这样我们可以把元数据这一层放到防火墙之后,客户端访问hive服务,就可以连接到元数据这一层,从而提供了更好的管理性和安全保障。使用远程的metastore服务,可以让metastore服务和hive服务运行在不同的进程里,这样也保证了hive的稳定性,提升了hive服务的效率。
Hive相关操作
1. 文件写数据
通过.hive文件在Hive建立相应的表
create table t_usr_detail( program_name string, grade double, contenttype string, start_time string, play_time double, series int, usr_id bigint) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
hive -f creat.hive
将文本文件导入对应的表
当文件是本地文件时
load data local inpath "/root/homed/line.csv" into table t_usr_detail;
当文件在hdfs上时
load data inpath "/root/homed/line.csv" into table t_usr_detail;
因为建表时规定了分隔符为制表’\t’,因此,待导入的数据格式为
- 剧场 0.67 1100 2017-08-11 13:30:58 38 3 50003433
- 剧场 0.38 1100 2017-08-11 13:47:31 21 3 50003433
- 大连经济报道 0.33 1104 2017-08-11 13:49:07 46 23 50003433
- 大连购物 0.02 1001 2017-08-11 14:33:18 1 10 50003433
- 别让爱你的人等太久 0.57 1100 2017-08-11 14:37:25 23 35 50003433
- 广告 1 1100 2017-08-11 15:00:42 14 31 50003433
- 别让爱你的人等太久 1 1100 2017-08-11 15:14:47 41 35 50003433
3 . 查看表
desc t_usr_detail;
select * from t_usr_detail limit 10;
2. spark读Hive
- 如果要处理现有的表,需要将文件hive-site.xml添加到Spark的类路径中,即spark目录下的conf目录
使用spark-shell读取表数据
import org.apache.spark.sql.hive.HiveContext val hiveCtx = new HiveContext(sc) val rows = hiveCtx.sql("SELECT * from t_usr_detail limit 10")
返回的是DataFrame格式,在spark中,DataFrame格式具有很多方法以及各种内置函数
观察数据
rows.show
3. spark写Hive
将spark生成的rdd存入hive中需要先将其转换为datafram,通过样例类可以方便转换。
将生成的df存入hive表中有两种方法
通过hiveConcext的sql语句
val sqlContext = new HiveContext(sc) val uninoDF = unionRDD1.toDF() //uninoDF.write.saveAsTable("t_user_info") uninoDF.registerTempTable("t_user_tmp") sqlContext.sql("INSERT INTO TABLE t_user_log_info partition(day='"+date+"') select * from t_user_tmp")
通过DF的写方法
uninoDF.write.mode("append").saveAsTable("t_user_info_b")
通过desc formatted table_name;
其实可以看到,两种插入方法在STORED AS INPUTFORMAT
和OUTPUTFORMAT
上是完全不同的。但是从我的结果来看,使用第二种方法很多字段都是NULL,应该就出来输入输出的序列化方法上。第二种方法在spark的hive.metastore版本与hive自身的metastore版本不同时会报错,需要指定hive.metastore版本。并且第一种方法不能指定分区,所以优先选择第二种。
4. Hive下查看数据表信息的方法
方法1:查看表的字段信息
desc table_name;
方法2:查看表的字段信息及元数据存储路径
desc extended table_name;
方法3:查看表的字段信息及元数据存储路径
desc formatted table_name;
方法4:查看建表语句及其他详细信息的方法
show create table table_name;
5. 修改Hive的hive-site.xml文件得到正确的元数据库
- 打开hive-site.xml后,首先查找:/mysql,得到数据库地址
-
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.36.100:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property> - 查找:/ConnectionPassword 修改登录密码
- 再查找:/ConnectionUserName 修改登录用户