赞
踩
在线业务产生的海量数据放到数据仓库中,使用HIVE对其进行离线分析挖掘(按理说可以用mapreduce程序,但是很麻烦,需要不断的得到中间结果,然后保存下来,再去执行下一个语句。且MapReduce相比于生气了语句复杂,还需要Java基础,没有基于sql知识的HIVE来的快)。
hive的粗略工作流程:
a) 在hive框架下创建需要分析的表,包含需要分析的字段,需要分析文件的输入路径。表创建后会在元数据库中存储这个信息。
b) 然后hive的编译器组件compiler会去底层找mapreduce模板,去匹配你的sql语句,生成对应的mapreduce程序,并生成对应的jar包。
c) 执行器组件runner 会拿到对应的jar包和文件目录,并自动执行。
这样的好处是,我不需要学习java的知识,也不需要mapreduce的知识,更不需要写很多mapreduce程序,且不需要不断的得到中间结果进行下一步分析,只需要学习sql知识,这样大大减少公司的开发成本。
HIVE的精确结构:
其中:
驱动器去生成上面的complier和runner。CLI命令行输入SQL语句;JDBC:java程序接口; HIVE的元数据存储(metastore):指的是建的表,每个表中哪些字段,输入输出数据目录等的存储)存储:若要效果好,配台服务器,装上mysql,数据存储在mysql中;效果一般,就用自带的数据库软件(metastore_db)即可。
还有需要注意的是:如果不去配置MySQL而使用自带的数据库,在不同的目录执行hive指令,会在当前的目录下产生对应的metastore_db数据库,其他目录下进入hive没用。尤其是公司不同人开发的表,其余的人都不好访问这样很不方便。所以要配置 mysql。
Hive的替代品: impala;spark shark;spark sql(特火)。
Hive是将sql翻译为mapreduce;spark sql是将SQL翻译为spark语句(这个性能更好)。
Hive压缩包解压后直接去这个目录,直接执行: ./hive ;或者配置环境变量后运行。
HIVE运行和windows下的mysql下是一样的,且字段的类型和java是一样的,但是hive不支持插入,仅支持查询。
注意:hive只是一个组件,不是集群。
在hive当中创建两张表:
//建立表时要指定分隔符
create table trade_detail (id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by '\t';
//delimited表示一行为一条记录;后面是以tab键为分隔符。
HIVE中的很多指令和MySQL的基本一致,这里不再阐述。
CREATE EXTERNAL TABLE IF NOT EXISTS cq289(
proctype STRING,
starttime STRING,
endtime STRING,
cdrstat STRING,
imsi STRING,
dl_rate_data STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
LOCATION '/user/hive/cq289';
1.EXTERNAL有:表示为外部表;若无表示内部表。
简单来说就是,内部表在建表时,会自动在对应目录下生成一个目录(简称A来表示)来存储这个表的内容(也可以在建表的时候指定存储数据的目录)。而这个表的表名,字段,内容的地址(并不包含内容)都存在mysql中,称为元数据。不论从本地还是hdfs导入数据到内部表(必须导入数据才会有内容),都会复制数据到(若原文件内容在hdfs上是剪切,所以建立内部表的时候一定要小心)目录A。当删除内部表时,也会删除其内容,即目录A的所有文件。但是原来导入数据的文件(前提是本地导入的文件)不会删除(因为本地导入的文件是拷贝),而原来在hdfs上的文件因为移动到A所以跟着一起删除。一定要小心再小心。
外部表,在建表时指定目录(也可以不指定,和内部表一样会在对应目录自动创建),这个目录就是外部表的内容存储地址,直接把数据存在这个目录下,外部表的的映射就建好了。当删除外部表时,其内容不会删除,仅删除元数据(即这个表)。
外部表除了不删除内容的好处外,还有快;同时,外部表还可以共享数据,大家共用一份数据。
2.ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘|’
指定各个字段之间使用|作为分隔符,具体看你的文件。
3.LOCATION ‘/user/hive/cq289’; 指定你的表内容的存放地址。可有可无,外部表一般指定,方便查找。
也可通过查询结果直接创建表:
CREATE TABLE test1 AS SELECT eNodeB_ID,SectorID,Cell_6th_RSRP FROM bei;
(1).将bei表的查询结果直接创建test1表,同时会在所在目录直接创建test1目录,用来存储test1的内容。
(2).此语句只能创建一个内部表test1,不能创建外部表。
(3).bei表也是一个内部表,这条语句只是对bei的查询结果作为test1的输入。不论test1怎么操作(如删除),对bei表也没有影响。
(4).因为test1是内部表,所以删除表后对应目录的内容也会删除,但对bei(不论是外部还是内部表)无影响。
下面说的导入方式对内部表和外部表一样:
1.本地文件导入:
LOAD DATA LOCAL INPATH '/home/llb/9E/data/文件名' OVERWRITE INTO TABLE cq289;
(1) LOCAL 关键字指从虚拟机本地文件导入,而不是hdfs文件导入(对应的是拷贝,原地址数据不受影响)。
(2)若不写文件名,则会把该目录下所有符合分隔符的文件全部写到表中。
(3)OVERWRITE 表示这次写入的数据直接覆盖表的内容,若没有表示追加内容。
2.hdfs导入:上一个语句去掉local关键字,目录写为hdfs的数据存放地目录即可(对应是剪切,上面写的目录文件就没有了,转移到表内容的存放地。这个一定要小心,不论外部表和内部表都一样)。
3.从别的表的查询结果中导入:
INSERT INTO TABLE bxop SELECT * FROM bei;
(1)INTO可改为OVERWRITE,一个是追加,一个是改写。
(2)和通过查询创建表一样,无论对bxop表进行何种操作,bei表不受影响。
注意内部分区表和外部分区表的建立和导入数据都是一样的,区别在于内部表和外部表的区别。分区对哪种表没有独立的特性。
建立分区表:
CREATE EXTERNAL TABLE IF NOT EXISTS bxop(
ComputerTime STRING,
HandsetTime STRING,
Longitude FLOAT,
Latitude FLOAT,
Cell_6th_RSRP STRING)
PARTITIONED BY (eNodeB_ID STRING,SectorID STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
导入数据(和前面一般表一样,只不过要指定分区):
1.load data (local) inpath ‘login.txt’ into table tb_sso_ver_login_day partition(statedate=20141201);
这种方式要求导入数据的字段必须有这个分区表的字段。(具体没有实践过,不知道对不对)
2.通过查询的结果导入分区表(也和前面的普通表一样,只不过也要指定分区字段,指定放查询前):
#下面是查询结果动态插入表
INSERT INTO TABLE bxop PARTITION (eNodeB_ID,SectorID) SELECT * FROM bei;
注意:做动态分区插入,但是Hive中默认是关闭的,所以在使用前需要先把hive.exec.dynamic.partition.mode设置为nonstrict)
hive> set hive.exec.dynamic.partition.mode=nonstrict;
#下面是查询结果静态插入表
INSERT INTO TABLE bxop PARTITION (eNodeB_ID='cc00',SectorID = 'cc')
SELECT * FROM bei WHERE bei.eNodeB_ID='cc00' AND bei.SectorID = 'cc';
也可以静态和动态结合。https://blog.csdn.net/oliang/article/details/47948801
补充:从hive中导出数据到本地
insert overwrite local directory '/home/beifeng/yanls'
row format delimited fields terminated by '\t'
select * from emp;
第一行为本地保存目录,第二行是保存的格式,第三行是从哪个表以及保存那些字段的内容。
还可以对表进行动态的增加分区:
也可以对表的其他字段进行增加或删除或修改,详见编程指南。
顺便说一下:一般在建表的时候各个字段的类型都用的是string字符串,这是因为数据来源不可信导致的。因为来的数据也许并不是你表中定义的类型,或者来的数据太大,超出了你定义类型的范围,这都是不可靠的,所以要用string保存数据。
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协调工具。
何时使用:
随机的,实时的访问就可以考虑使用。
常规的数据库(如MySQL),主要在于关联数据库的复杂关系处理(如连接等)。而HBASE不适合复杂的关联查询,只适合简单查询,且几乎没有事务功能。
优势:对于很大的表(上10亿)的查询很快,且是实时的。
下面是传统的数据库:
一行表示1个人的信息,但是对于不同的人,可能信息想增加。但是对于常见的关系型数据库,只能全部增加1列,这样就很混乱,不断的加新的列,但实际很多都是空的,浪费存储。
下面是HBASE的表结构:
HBSE只指定列族,在列簇中根据需要赋值(通过key-value保存),看起来像分开为一个一个的,但实际不为每一个信息都扩展。
对表中某个类目进行更新,原来的value不删除,都保留,通过版本号(时间戳,叫cell)来区分。
列族(Column Family):
列族在创建表的时候声明,一个列族可以包含多个列,列中的数据都是以二进制形式存在,没有数据类型。
时间戳:timestamp
HBase中通过row和columns确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引。
Table 在行的方向上分割为多个HRegion,一个region由[startkey,endkey)表示。Region Serers通常在datanode。
Region指的是表中某个区域行的内容,包括对应行的所有列簇。
Store指的是某个region中某个列簇的内容。
这么多的服务器和文件,肯定需要一个设备组件来管理,这个组件就是HMaster。
Hmaster也可以和前面的元数据管理一样实现高并发机制(HA),设置多台Hmaster,但只有一台是active状态,最后的管理可以通过zookeeper管理,实现高并发。
某个文件被划分为不同region,每个region被放到不同的服务器上,需要建立映射来查找对应的数据。
1. 划分每个表时,会带上对应的上下偏移位置,得到原表的region,我们记为RawRegion。
2.每个RawRegion会存在一台Region Server上,这个映射关系会存在一个META表中,key为:表名+偏移量,value为该region存在哪台主机上。
3.因为HBASE维护的数据很大,所以META表的内容会很大,也会划分region区域,并存在一台机器上,这个映射关系存在一个ROOT表上,这个表也会存在一台机器上。 key为:表名+偏移量(总的),value为该region存在哪台主机上。
4.ROOT表存在哪台机器上的映射关系最终存在zookeeper集群上。
5.查询的时候,要查哪个表,表的哪行数据,去zookeeper上找到对应的ROOT表,然后找到META表,最后找到存放具体数据的主机,拿到数据。
需要补充的是:当一个用户连续查询时,系统会记录用户的查询记录,这些表的内容会缓存在内存中,下次查询时不需要去zookeeper这样一步一步往回查,所以还是挺快的。
下面是HBASE的精确定义:
架构体系
Client :
包含访问hbase 的接口,client 维护着一些cache 来加快对hbase 的访问,比如regione 的位置信息
Zookeeper:
(1)保证任何时候,集群中只有一个running master;
(2)存贮所有Region 的寻址入口;
(3) 实时监控Region Server 的状态,将Region server 的上线和下线信息,实时通知给Master存储Hbase 的schema,包括有哪些table,每个table 有哪些column family。
Master:
可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行;
为Region server 分配region;
负责region server 的负载均衡;
发现失效的region server 并重新分配其上的region。
Region Server:
维护Master 分配给它的region,处理对这些region 的IO 请求
负责切分在运行过程中变得过大的region
可以看出,client 访问hbase 上数据的过程并不需要master 参与,寻址访问先zookeeper再regionserver,数据读写访问regioneserver。HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。
HBASE和HIVE的对比:
HBASE的分布式安装,等需要用到在补充。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。