Hive原理实践
- Hive让数据的直接使用人员都能使用Hadoop的大数据处理能力,即使不会java编程
1、离线大数据处理的主要技术:Hive
1.2、Hive出现背景
- Hive是Facebook开发并贡献给Hadoop开源社区的;
- Hive是建立在Hadoop体系架构上的一层SQL抽象;
- Hive SQL是翻译为MapReduce任务后再Hadoop集群执行的,而Hadoop是一个批处理系统,所以Hive SQL是高延迟的,
- Hive不能提供数据排序和查询缓存功能,也不提供在线事务处理,更不能提供实时的查询和记录级的更新,但他能更好地处理不变的大规模数据集,
1.3、Hive基本架构
- 主要组件包括UI组件,Driver组件,Metastore组件,CLI,JDBC/ODBC,Thrift Server和Hive Web Interface(HWI)等;
- Driver组件: 核心组件,包括Complier(编译器),Optimizer(优化器)和Executor(执行器);
- Metastore组件:运输局服务组件,这个组件存储Hive的元数据;Hive的元数据存储在关系数据库里,Hive支持MySQL;默认情况下,Hive元数据保存在内嵌的Derby数据库中;实际生产环境中,mysql更适合
- CLI:命令行接口;
- Thrift Server:提供JDBC和ODBC接入的能力,用来进行可扩展且跨语言的服务开发;
- Hive Web Interface(HWI):Hive客户端提供了一种通过网页方式访问Hive所提供的服务;
[外链图片转存失败(img-L0XARUDS-1566993315493)(.\assets\1561557097673.png)]
[外链图片转存失败(img-khAH5bKB-1566993315494)(assets/1566963632873.png)]
2、Hive SQL
- Hive SQL和MySQL的SQL方言最为接近,但两者之间也有差异,比如Hive不支持行级数据插入(有insert 但不适合使用),更新和删除,也不支持事务等;
2.1、Hive关键概念
-
Hive数据库:Hive中的数据库从本质上来说仅仅是一个目录或者命名空间;但是它可以避免表名冲突,等同于关系型数据库中的数据库概念;
-
Hive表:每一个表在hive中都有一个对应的目录存储数据,如果没有指定表的数据库,那么hive会通过{HIVE_HOME}/conf/hive-site.xml配置文件中的hive.metastore.warehouse.dir属性来使用默认值(一般是/user/hive/warehouse),所有的table数据都保存在这个目录中;
-
内部表(managed table):即hive管理的表,数据将真实存在于表所在的目录中,删除内部表时,物理数据和文件也一并删除;
create table my_managed_table(coll STRING); LOAD DATA INPATH '/user/root/test_data.txt' INTO TABLE my_managed_table; --删除表 DROP TABLE my_managed_table; -
外部表(external table):新建表仅仅是指向一个外部目录而已,真实数据在外部,删除时,只是删除了引用和定义
CREATE EXTERNAL TABLE external_table(dummy STRING) LOCATIOIN '/user/root/external_table'; LOAD DATA INPATH '/user/root/data.txt' INTO TABLE external_table; --指定external关键字后,hive不会将数据移动到warehouse目录中;事实上,Hive甚至不会校验外部表的目录是否存在;这使的我们可以在创建表之后再创建数据 -
常见的模式是使用外部表访问存储的 HDFS (通常由其他工具创建)中的初始数据,然后使用 Hive 转换数据并将其结果放在内部表中;
-
使用外部表的另一种场景是针对一个数据集,关联多个 Schema;schema(发音 “skee-muh” 或者“skee-mah”,中文叫模式)是数据库的组织和结构,schemas andschemata都可以作为复数形式。模式中包含了schema对象,可以是表(table)、列(column)、数据类型(data type)、视图(view)、存储过程(stored procedures)、关系(relationships)、主键(primary key)、**外键(**foreign key)等。数据库模式可以用一个可视化的图来表示,它显示了数据库对象及其相互之间的关系;MySQL的文档中指出,在物理上,模式与数据库是同义的,所以,模式和数据库是一回事
-
-
分区和桶
-
分区(partition):
-- 创建表时要用partitioned by定义 create table logs (ts bigint, line string) partitioned by (dt stirng, country string); --当导入数据到分区表时,分区的值被显示指定: load data inpath '/user/root/path' into table logs partition (dt='2001-01-01',country='gb');--通过日期划分后,还可以通过国家分) --如下代码仅会扫描2001-01-01目录下的GB目录 select ts, dt ,line from logs where dt = '2001-01-01' and country='GB';
-

-
分桶(bucket):
--clustered by指定;根据id进行分桶,并且分为4个桶 create table bucketed_users(id int, name string) clustered by (id) into 4 buckets; --分桶时,hive根据字段哈希后取余数来决定数据应该放在哪个桶,因此每个桶都是整体数据的随机抽样 --设置hive.enforce.bucketing属性为true可以把分桶的工作交给hive完成,如果是在hive执行命令,先开启分桶和设定reduce个数;否则无效 set hive.enforce.bucketing=true; set mapreduce.job.reduces=3; --分桶加载数据,用insert overwrite;像load data只会有一个文件,数据就不符合分桶的意义了 insert overwrite table bucketed_users select * from course_common cluster by(c_id)

最低0.47元/天 解锁文章
1191

被折叠的 条评论
为什么被折叠?



