
Hive是基于Hadoop平台的数仓工具,具有海量数据存储、水平可扩展、离线批量处理的优点,解决了传统关系型数仓不能支持海量数据存储、水平可扩展性差等问题,但是由于Hive数据存储和数据处理是依赖于HDFS和MapReduce,因此在Hive进行数据离线批量处理时,需将查询语言先转换成MR任务,由MR批量处理返回结果,所以Hive没法满足数据实时查询分析的需求。
Hive是由FaceBook研发并开源,当时FaceBook使用Oracle作为数仓,由于数据量越来越大,Oracle数仓性能越来越差,没法实现海量数据的离线批量分析,因此基于Hadoop研发Hive,并开源给Apacha。
由于Hive不能实现数据实时查询交互,Hbase可提供实时在线查询能力,因此Hive和Hbase形成了良性互补。Hbase因为其海量数据存储、水平扩展、批量数据处理等优点,也得到了广泛应用。
Pig与HIVE工具类似,都可以用类sql语言对数据进行处理。但是他们应用场景有区别,Pig用于数据仓库数据的ETL,HIVE用于数仓数据分析。
从架构图当中,可看出Hive并没有完成数据的存储和处理,它是由HDFS完成数据存储,MR完成数据处理,其只是提供了用户查询语言的能力。Hive支持类sql语言,这种SQL称为Hivesql。用户可用Hivesql语言查询,其驱动可将Hivesql语言转换成MR任务,完成数据处理。
Hive的访问接口
CLI:是hive提供的命令行工具
HWI:是Hive的web访问接口
JDBC/ODBC:是两种的标准的应用程序编程访问接口
Thrift Server:提供异构语言,进行远程RPC调用Hive的能力。
因此Hiv具备丰富的访问接口能力,几乎能满足各种开发应用场景需求。
Driver
是HIVE比较核心的驱动模块,包含编译器、优化器、执行器,职责为把用户输入的Hivesql转换成MR数据处理任务
Metastore
是HIVE的元数据存储模块,数据的访问和查找,必须要先访问元数据。Hive中的元数据一般使用单独的关系型数据库存储,常用的是Mysql,为了确保高可用,Mysql元数据库还需主备部署。
架构图上面Karmasphere、Hue、Qubole也是访问HIVE的工具,其中Qubole可远程访问HIVE,相当于HIVE作为一种公有云服务,用户可通过互联网访问Hive服务。
Hive在使用过程中出现了一些不稳定问题,由此发展出了Hive HA机制,
本文说明如何通过把Hive中的数据备份到磁盘中,并从磁盘中恢复到Hive中。
1,把Hive中的表数据备份到磁盘中。
备份示例:
以上语句说明,把src_companyinfo表中的数据以‘|’为分隔符号,并备份到“/root/grc_bigdata/backup/src_companyinfo”目录中。
备份之后的目录结构如下:
在Hue中浏览的src_xtbillmx2013_st的目录结构如下:
从以上结果可以看出,数据文件输出的个数与表在Hive中存储的文件个数不一定一致。
2,把磁盘中的文件恢复到Hive中。
先在hive中执行建表脚本:
然后在Hive中执行如下导入命令:
3,在Hive中备份46个表、一共552GB的数据到Linux文件系统,一共耗时55386 秒,大概154个小时。
从Linux文件系统中恢复以上数据,耗时41217秒,大概114个小时。
原文
hive的语法和sql语法大部分是是相同的,下面我们来挨个写出来:
1,简单介绍存储原理:
hive和hdfs交互,以及和本地linux交互,分为本地文件和hdfs文件,要说他们的区别,底层都是存在磁盘上,要说区别的话,hdfs分布式文件管理系统,有它独有的文件存储结构也即是能够和分布式文件进行交互的独有存储方式,Linux本地文件存储知识单纯的在Linux *** 作系统存储的文件,所以hive的作用就是和linux本地以及linux上hdfs文件两者进行交互,我可以把本地的文件上传到hive文件中,当然hive只是处理hdfs上文件的一个工具,但是hive也有自己独有的文件存储,表的结构信息,创建的表信息,都在hive文件夹中当然是存储在hdfs上的。
2,语法:
1,把本地的文件加载到hive创建的表中(比如:create table tb_user(id int ,name string ); )在hive中创建的是有结构的表,然后通过命令:load data local inpath ' 路径 ' into table 创建的表名;
2,加载hdfs上的文件到hive中:load data inpath 'hdfs上的路径' into table 创建的表
3,导出hive表到hdfs上:export table 表名 to 'hdfs路径' ;
4,把hdfs上的表导入到hive表中:import table (hive表 )from (hdfs上的表);(import table tb_kk from '/data/a')当导入的表不存在会自动创建这张表,用于备份,或者数据转移,表的字段名和导入的字段名一样。
5,通过查询hive表中的数据并把查询的数据导出到本地:insert overwrite local directory '本地路径' select from student;
6通过查询hive表中的数据并把查询的数据导出到hdfs上:insert overwrite directory 'hdfs上的路径'
select from student;
7, 把查询的结果插入到 当前的hive表中 : insert overwrite table student partition(month='201708') select id, name from student where month='201709';
8,创建表并加载查询到的数据:create table if not exists tb_text as select from tb_text;(as 关键字 同样)
9,创建表时通过Location指定加载数据路径:create table tb_text (id int , name string ) row format delimited fields terminated by ‘,’ location '/hdfs上的目录',(记住是目录)。
10,创建分区表,分区表就是能够把不同的数据分开来存放,在查询的时候只需要查询指定的分区就行,这样子能够加快查询效率:create table tb_text (id int ,name string ) partitioned by (month string) (//这里我用month来作为分区条件,分区字段不能是表中已经存在的字段,可以将分区字段看成表的伪列,不参与真实字段的 ) row format delimited fields terminated by ',' ;看一下加载数据到分区表的列子,更好地理解一下,load data local inpath '/opt/module/datas/depttxt' into table defaultdept_partition partition(month='201709');//最后就是给伪列字段赋予分区值,也就是分区的文件名。
11,查看表结构,这个需要了解清楚:desc tb_text 查看基本表信息,desc formatted tb_text ,查看详细信息。
12,当数据库存在数据强制删除时可以用:drop database db_hive cascade;
13,当数据库不存在数据:drop database db_hive;
14,默认创建的表为管理表,也称之为内部表,数据和表结构是在一起的,也就是说,当我删除表的时候,底层数据也会跟着一起删除,设计成这样要求一张表代表一份数据,保证数据的安全性。
15,外部表为只存储表的元数据和结构信息,存储的是表的路径,删除外部表不会删除内部数据,只会把表的元数据信息删除了,不影响数据本身,通常用作共享数据,设计外部表的语法为:create external table tb_text(id int ,name string);
16,创建表的时候复制表结构:create table tb_text like tb_text01;
3,外部表和内部表的转化:
1,修改内部表为外部表:alter table tb_text set tblproperties('EXTERNAL'='TRUE');
2,修改外部表为内部表:alter table tb_text set tblproperties('EXTERNAL'='FALSE'); -- 要求KV的大小写,('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,区分大小写!
指定数据存放位置,如果没有指定,就会在hdfs的默认位置建立表文件。
Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。
Hive 中所有的数据都存储在 HDFS 中,Hive 中包含以下数据模型:表(Table),外部表(External Table),分区(Partition),桶(Bucket)。
扩展资料:
Hive中的表和数据库中的表在概念上相似。 每个表在Hive中都有一个对应的目录来存储数据。
例如,一个表pvs,其在HDFS中的路径为:/ wh / pvs,其中wh是在 hive-sitexml 中由 ${hivemetastorewarehousedir} 指定的数据仓库的目录,所有表数据( 不包括外部表)存储在此目录中。
Partition 对应于数据库中的 Partition 列的密集索引,但是Hive中的Partition的组织方式与数据库中的完全不同。 在Hive中,表中的Partition与表下的目录相对应,所有Partition的数据都存储在相应的目录中。
1查询语言不同:hql/sql
2数据存储位置不同:hdfs/数据库系统
3数据格式:可自定义/数据库系统定义格式
4数据更新:Hive不支持数据更新/mysql支持数据更新update
楼主说的是Hive,不是HBase。从Oracle里面头导出数据为平面文件后,导入HDFS里面。Hive里面的表结构是要自己手工定的。
建表可以自己写个小程序实现,根据oracle字典表和hive的建表规则,每个地方使用hive的情景不同,建表也不同。数据装载可以用sqoop来实现。
你可以安装下SQOOP,注意这个跟HADOOP的版本要对应的,不然会出现一些问题。以下是我项目用到的例子,不过我有个更高级的方法,只需配到表就行了,就是写个JAVA程序,然后自动生成对应的脚本,再执行就可以了。转载,仅供参考。
以上就是关于程序中的Hive具体是干什么用的呢全部的内容,包括:程序中的Hive具体是干什么用的呢、Hive数据备份和恢复、hive之核心知识点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)