hive初探

来源:互联网 发布:吃喝玩乐哪个软件好 编辑:程序博客网 时间:2024/05/20 12:21

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. 文件写数据

  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 DELIMITEDFIELDS TERMINATED BY '\t';     

    hive -f creat.hive

  2. 将文本文件导入对应的表

当文件是本地文件时

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;   

更多创建Hive表的方法

2. spark读Hive

  1. 如果要处理现有的表,需要将文件hive-site.xml添加到Spark的类路径中,即spark目录下的conf目录
  2. 使用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格式具有很多方法以及各种内置函数

  3. 观察数据

    rows.show

3. spark写Hive

将spark生成的rdd存入hive中需要先将其转换为datafram,通过样例类可以方便转换。
将生成的df存入hive表中有两种方法

  1. 通过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")
  2. 通过DF的写方法

    uninoDF.write.mode("append").saveAsTable("t_user_info_b")

通过desc formatted table_name;其实可以看到,两种插入方法在STORED AS INPUTFORMATOUTPUTFORMAT上是完全不同的。但是从我的结果来看,使用第二种方法很多字段都是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文件得到正确的元数据库

  1. 打开hive-site.xml后,首先查找:/mysql,得到数据库地址

  2. <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>
  3. 查找:/ConnectionPassword 修改登录密码
  4. 再查找:/ConnectionUserName 修改登录用户