大数据理论与实践9 分布式数据仓库Inceptor
简介
定位:
分布式通用SQL引擎:支持Hyperbase、Search、ArgoDB、StellarDB和Slipstream等核心数据库和计算引擎。逻辑数仓。
分布式关系型数仓:基于Hive和Spark,主要用于离线分析(对时间不敏感)。主要是关系型的数据。
原理
系统架构
数据类型是不一样的,要放在不同的数据库中。关系型数据放在HDFS中(Hive底层),半结构化数据放在Hyperbase(思维表)中,文本类型需要综合搜索防在Search(切词和全文索引),一体化的统一架构防在ArgoDB,图防在StellarDB中。
逻辑数仓:数据其实是分离的,但是在逻辑上是一个。
InceptorServer
connector:为BI、ETL工具提供标准JDBC、ODBC接口。
SQL Compiler包括:SQL语法解析器、规则和代价优化器、代码生成器。
PL/SQL Compiler包括:存储过程解析器、控制流优化器、并行优化器。
Transaction Manager:分布式增删改、事务并发控制器。
Spark:星环发行版
计算资源:Executor是资源调度的基本单元。
Metastore
存储各种类型的元数据,如Inceptor表、Hyperbase表、Search表、Slipstream流表等,数据存储在TxSQL(MySql引擎)上。
Client
- CLI(命令行界面):Beeline
- JDBC/ODBC
- Web UI
- Waterdrop:Inceptor SQL IDE工具,支持主流的关系数据库和数据仓库,如Oracle、DB2、MySQL、Hive、Teradata、SAP等。
数据模型
表下面分区,分区下面分桶。因为在大数据中,索引是不合适的,因为索引进行更新开销是非常大的,对数据进行分区。分区下面分桶,用于join连接。
database 数据库
数据库是一个包含若干表的命名空间和磁盘目录,类似于RDBMS中的数据库。系统会为每个数据库创建一个目录,目录名=数据库名.db,通常无法删除包含表的数据库,应该先删表,再删数据库。
table 表
和关系型数据库一样,存储同一类关系的数据记录。
元数据存储在Metastore中,表数据存储在HDFS、Hyperbase(用于半结构化)和Search(用于全文数据)中。
按照所有权分类,表可以分为内表和外表:
- 内表(Managed Table,又称托管表)
系统具有内表的完全控制权,负责管理它的生命周期,元数据存储在Metastore中,想删就删。表数据默认存储在数据库(database)目录下的对应子目录(文件夹)中(目录名=表名),或者人工创建的外部目录中。删除内表时,会同时删除表数据,以及Metastore中的元数据。 - 外表(External Table)
系统不具有外表的完全控制权,更加常用。元数据存储在Metastore中,表数据通常存储在指定的外部存储目录中。删除外表时,不会删除表数据,但会删除Metastore中的元数据。
按存储格式分类,表可以分为Text表和ORC表:
- Text表
系统默认的表类型,无压缩,行存储,仅支持批量Insert,性能较低,主要用于导入原始数据时建立过渡表(贴源层,靠近数据源,仅进行简单清洗)。 - ORC表
优化的列式存储,轻量级索引,压缩比高,仅支持批量Insert;是Inceptor计算的主要表类型,适用于数仓离线分析,通常由Text表生成(清洗转换后,通常为ORC表)。
按存储格式分类,分为ORC事务表、Hyperbase表以及ES表:
- ORC事务表:由ORC表衍生而来,继承了ORC表的所有特性,支持完整CURD以及分布式事务处理。多版本文件存储,定期做压缩,10~20%的性能损失。
- Hyperbase表:存储在Hyperbase上,支持多种索引,以及Insert、Update、Delete;适用于高并发点查(简单条件,精确查询),支持半结构化数据、小对象(10M以内的图片和音视频文件)存储。
- ES表
原始数据和索引数据都存储在ElasticSearch中,支持模糊、语义和全文检索,适用于综合搜索
Partition 分区
一张表分成多个分区。因为在大数据(PB级)中,索引是不合适的,因为索引进行更新开销是非常大的。要把数据集合变小。
含义:将表按照某个或某几个字段(分区键)划分为更小的数据集。
作用:减少不必要的全表扫描,缩小查询范围,提升查询效率
存储:一个分区对应于表目录下的一个子目录,可以进行单值分区(分区键=value)或者范围分区(分区键=_less_than_value):
例如上图,采用state作为分区键,这样在数据库中,会有右边这个进行划分。这样在Select查询的时候,只需要遍历相应的区域即可,缩小查询范围。
注意:单值分区不能出现在表结构中,因为已经用这个划分文件了,再存储就产生了冗余。
分区键通常高频出现在Select … Where条件查询中,为了避免产生过多的子目录和小文件,只对离散字段进行分区,如日期、地域、民族等。需要提前对分区数量进行预估,尽量避免数据倾斜。
Bucket 分桶
用于提升join的效率。
通过分桶键哈希取模操作(key hashcode % N),将表或分区数据随机分发到N个桶中。桶数N一般为质数,方便桶数不同进行操作。
哈希取模的作用:数据划分:随机分为N个桶;数据聚合:Key相同的数据在同一个桶中。
分桶可以:
- 提高Join查询效率:如果两个表的Join列都做了分桶,且分桶数相同或成倍数,那么相同列值的数据会分到编号相同或有对应关系的桶中,这样就不用全表遍历,对应的桶做Join就可以了;
- 提高取样效率:从桶中直接抽取数据。
假如有两张表,都分仨桶,那么每条数据都是在同一个桶号中的(即,第一条数据都在0桶,第4条数据都在1桶),这样做join是比较容易的。
存储时,在表或分区目录下,每个桶存储为一个文件,文件的大小应控制在100~200MB之间(ORC表压缩后)。如果桶文件小于HDFS Block, 那么一个桶对应一个Block,否则会存储在多个Block 中。
分桶用法:
- 先分区后分桶;
- 分桶键和分桶数在建表时确定,不允许更改,否则必须重新分桶;
- 分桶键必须出现在表结构中
读时模式
数据进入数仓时,并不检查数据的规范性,而是查询时再验证。这样写入速度快,适合处理大规模数据。查询时处理尺度很宽松(弱校验),尽可能容忍各种错误。
Inceptor SQL
SQL DDL
数据库操作
Create/Drop/Alter/Use/Describe/Show Database(s)
完整建表语句:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS]
[<database_name>.]<table_name>
[(<col_name> <data_type> [COMMENT '<col_comment>'] [, <col_name> <data_type> ...])]
[COMMENT '<table_comment>']
[PARTITIONED BY [RANGE] (<partition_key> <data_type> [COMMENT '<partition_comment>']
[, <partition_key > <data_type>...])]
[CLUSTERED BY (<col_name> [, <col_name>...])
[SORTED BY (<col_name> [ASC|DESC] [, <col_name> [ASC|DESC]...])]
INTO <num_buckets> BUCKETS]
[
[ROW FORMAT <row_format>]
[STORED AS (TEXTFILE|ORC|CSVFILE)]
| STORED BY '<storage.handler.class.name>' [WITH SERDEPROPERTIES (<...>)]
]
[LOCATION '<file_path>']
[TBLPROPERTIES ('<property_name>'='<property_value>', ...)];
表操作
Create/Drop/Alter/Truncate/Describe/Show Table(s)
创建内表
# 通过自定义Schema来创建内表
CREATE TABLE <table_name> [(<col_name> <data_type> [, <col_name> <data_type> ...])];
# 通过已存在的表或视图来创建内表,只复制Schema,不复制数据
CREATE TABLE <table_name> LIKE <existing_table_or_view_name>;
# 通过查询结果来创建内表,既复制Schema,又复制数据
CREATE TABLE <table_name>AS SELECT <select_statement>;
高级操作:
分区和分桶
分区
单值分区:一个分区对应分区键的一个值,目录名为“分区键=键值”
分区键不能和表结构中的列重复,因为分区键和数据已存储在分区目录名中,否则会造成数据冗余。
CREATE [EXTERNAL] TABLE <table_name>(<col_name> <data_type> [, <col_name> <data_type> ...])PARTITIONED BY (<partition_key> <data_type>, ...) [CLUSTERED BY ...] [ROW FORMAT <row_format>] [STORED AS TEXTFILE|ORC|CSVFILE][LOCATION '<file_path>'] [TBLPROPERTIES ('<property_name>'='<property_value>', ...)];
在create语句之后,是不会创建文件的,因为还不知道是动态还是静态分区,系统只是知道你创建了分区。
单值分区分为两类:
- 单值静态分区
# 单值静态分区导入时系统没有任何机制来保证数据导入的正确性,只有靠用户自己
/* 覆盖导入 */
INSERT OVERWRITE TABLE <table_name> PARTITION (<partition_key>=<partition_value>[, <partition_key>=<partition_value>, ...]) SELECT <select_statement>;
/* 追加导入 */
INSERT INTO TABLE <table_name> PARTITION (<partition_key>=<partition_value>[, <partition_key>=<partition_value>, ...])SELECT <select_statement>;
/* 将HDFS数据或本地文件导入到分区目录下 */
LOAD DATA [LOCAL] INPATH '<path>’ [OVERWRITE] INTO TABLE <tablename> PARTITION (<partition_key>=<partition_value>[, <partition_key>=<partition_value>, ...]);
- 单值动态分区:导入数据时,系统可以动态判断目标分区
自动设置分区,需要进行设置。动态定义必须写在静态之后。
/* 开启动态分区支持,并设置最大分区数*/
set hive.exec.dynamic.partition=true;
set hive.exec.max.dynamic.partitions=2000;
/* <dpk>为动态分区键, <spk>为静态分区键 */
INSERT (OVERWRITE | INTO) TABLE <table_name>PARTITION ([<spk>=<value>, ..., ] <dpk>, [..., <dpk>]) SELECT <select_statement>;
新增、删除、重命名和清空分区:
ALTER TABLE <table_name> ADD PARTITION (<partition_key>=<value>);
ALTER TABLE <table_name> DROP PARTITION (<partition_key>=<value>);
ALTER TABLE <table_name> PARTITION (<partition_key>=<value>) RENAME TO PARTITION
(<partition_key>=<new_value>);
TRUNCATE TABLE <table_name> PARTITION (<partition_key>=<value>);
范围分区
每个分区对应分区键的一个区间,凡是落在指定区间内的数据都被存储在对应的分区下。
创建范围分区:
CREATE [EXTERNAL] TABLE <table_name>
(<col_name> <data_type>, <col_name> <data_type>, ...)PARTITIONED BY RANGE (<partition_key> <data_type>, ...) (PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>), [PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>),...
]PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>|MAXVALUE) )
[ROW FORMAT <row_format>] [STORED AS TEXTFILE|ORC|CSVFILE]
[LOCATION '<file_path>']
[TBLPROPERTIES ('<property_name>'='<property_value>', ...)];
范围分区需手工指定,可在建表时添加分区,也可建表后通过Alter Table添加或删除分区
分桶
按分桶键哈希取模的方式,将表中数据随机分发到若干桶文件中。
创建分桶表:INTO BUCKETS设定桶的数量,SORTED BY设定桶内排序,默认升序
CREATE [EXTERNAL] TABLE <table_name>(<col_name> <data_type> [, <col_name> <data_type> ...])][PARTITIONED BY ...] CLUSTERED BY (<col_name>) [SORTED BY (<col_name> [ASC|DESC] [, <col_name> [ASC|DESC]...])] INTO <num_buckets> BUCKETS[ROW FORMAT <row_format>] [STORED AS TEXTFILE|ORC|CSVFILE][LOCATION '<file_path>'] [TBLPROPERTIES ('<property_name>'='<property_value>', ...)];
写入分桶表
/* 开启强制分桶,并设置Reduce任务数为分桶数 */
set hive.enforce.bucketing = true;
set mapreduce.job.reduces=4;
/* 写入分桶表 */
INSERT (OVERWRITE | INTO) TABLE <table_name>
SELECT <select_expression>, <select_expression>, ... FROM <table_name>
DISTRIBUTE BY <col_name> SORT BY <col_name> [ASC|DESC] [, col_name [ASC|DESC], ...]
[CLUSTER BY <col_list> ]
与分区键不同,分桶键必须是表结构中的列。分桶键和分桶数在建表时确定,不允许更改。
SQL DML
数据预处理:文件编码为UTF-8,\n为换行符
导入
Load导入
将文件中的数据导入已存在的表或分区。仅将数据文件移动到表或分区的目录中,不会对数据进行任何处理,如分桶、排序。不支持动态分区导入。
不推荐使用Load导入数据:在安全模式下的权限设置步骤较多。
# <path>是文件存储路径,如果标注LOCAL,指向本地磁盘路径,不标则指向HDFS路径
LOAD DATA [LOCAL] INPATH '<path>’ [OVERWRITE] INTOTABLE <tablename> [PARTITION (<partition_key>=<partition_value>, ...)];
Insert导入
# 单值静态分区导入
INSERT (OVERWRITE | INTO) TABLE <table_name> PARTITION (<partition_key>=<partition_value>[, <partition_key>=<partition_value>, ...]) SELECT <select_statement>;
# 单值动态分区导入
/* 开启动态分区支持,并设置最大分区数*/
set hive.exec.dynamic.partition=true;
set hive.exec.max.dynamic.partitions=2000;
/* <dpk>为动态分区键, <spk>为静态分区键 */
INSERT (OVERWRITE | INTO) TABLE <table_name>PARTITION ([<spk>=<value>, ..., ] <dpk>, [..., <dpk>]) SELECT <select_statement>;
查询
分桶与聚合:
Distribute By:将Distribute By列值相同的数据发送给同一个Reduce任务,实现数据按指定列聚合
Inceptor PL/SQL
数据类型
%type属性
基于变量或数据库表的列定义一个变量。该变量的类型与被参照变量或列的类型相同;当被参照变量的类型改变之后,新定义变量的类型也会随之改变
%rowtype属性
基于数据库表定义一个记录型变量。该变量的字段名和字段类型就是被参照表的字段名和字段类型;当被参照表的结构发生变化时,新定义变量也会发生改变
标量类型
用于保存单个值,Inceptor支持的标量类型有Int、String、Double、Boolean等
复合类型
如Record、Collection等
PL/SQL语句块
/* 声明(可选)*/
DECLARE
transid STRING
/*执行体开始(必要)*/
BEGIN
SELECT trans_id into transid from transactions where acc_num=6513065
DBMS_OUTPUT.put_line(transid)
/*异常处理(可选)*/
EXCEPTION --WHEN too_many_rows
THEN
DBMS_OUTPUT.put_line ('too many rows')
/*执行体结束(必要)*/
END;
存储过程
/* 创建存储过程 */
CREATE OR REPLACE PROCEDURE hello_world()
IS
DECLARE
l_message STRING := 'Hello World!'
BEGIN
DBMS_OUTPUT.put_line (l_message)
END;
/* 调用存储过程 */
BEGIN
hello_world()
END;
复习
如何定位Inceptor?它与Hive有什么区别?
如何理解Inceptor读时模式。
分区的目的是什么?分区有几种类型?如何将数据导入分区表?
分桶的目的是什么?如何将数据导入分桶表?
大数据理论与实践9 分布式数据仓库Inceptor相关推荐
- 大数据理论与实践6 分布式ETL工具Sqoop
ETL是指数据收集层,指的是数据抽取(Extract).转换(Transform).加载(Load),在真正的大数据工作中,很大的工作量都在做这一块的内容. Sqoop简介 只要用于在Hadoop和关 ...
- 大数据理论与实践5 分布式计算框架MapReduce和Spark
MapReduce和Spark MapReduce 简介 原理示例 基本概念 作业运行模式 Spark 简介 概念 编程模型 RDD RDD操作(Operator) RDD依赖(Dependency) ...
- 第十一章·大数据技术与实践
11.1大数据概述 11.1.1大数据产生的背景 家阿尔文,托夫勒便在<第三次浪潮>一书中, 将大数据比作 第三次浪潮的华彩乐章". 在传统数据处理过程中,单个计算机的性能往往很 ...
- 《大数据》第1期“应用”——百度大数据应用与实践
百度大数据应用与实践 陈尚义 百度公司 北京100085 摘要:产生于互联网的大数据应用,现阶段正在向其他行业领域渗透,成为行业创新和转型的重要驱动力.根据百度多年来在大数据领域的创新与实践,阐述了大 ...
- 科大讯飞交通超脑荣获 2019 年大数据应用最佳实践案例 TOP10
12月5日,由中国计算机学会主办,CCF 大数据专家委员会承办的中国大数据技术大会(BDTC 2019)在北京长城饭店隆重举行.会上揭晓了由CCF大数据专家委员会组织评选的大数据应用最佳实践案例TOP ...
- 李永辉:IBM大数据产品及实践路线图
文章讲的是李永辉:IBM大数据产品及实践路线图,近日,主题为"行胜于言"的2013 IBM大数据与分析高峰论坛在北京举行,会上正式发布了大数据分析加速技术BLU Accelerat ...
- 七牛云大数据平台建设实践
2017 年 1 月 14.15日,为期 2 天的 ECUG Con 十周年大会在深圳圆满结束,会上七牛云 CEO 许式伟做了题为<七牛大数据平台建设实践>的演讲,首次披露七牛云在大数据方 ...
- 第11章 大数据技术与实践
第11章 大数据技术与实践 11.1 大数据概述 大数据一词由英文" big data"翻译而来,是最近几年兴起的概念,目前还没有一个统的定义.相比于过去的"信息爆炸&q ...
- 从零到一,臻于至善|网易邮箱基于StarRocks 开发大数据平台的实践
作者:网易邮箱 黄贤康.现任职网易邮件事业部资深数据开发工程师,作为主要开发人员参与网易邮箱大数据平台的建立.优化.重构等工作,并取得相当的成效.他长期从事服务端应用及大数据领域的架构研发工作,对相关 ...
- 【TOP100】100个中国大数据应用最佳实践案例—为您打开万亿元大数据产业的财富之门
热门下载(点击标题即可阅读) ☞[下载]2015中国数据分析师行业峰会精彩PPT下载(共计21个文件) 2017年3月28日至29日,由工业和信息化部指导.中国信息通信研究院和数据中心联盟主办的&qu ...
最新文章
- python开源项目贡献_通过为开源项目做贡献,我如何找到理想的工作
- 关于HashMap根据Value获取Key
- java excel 复杂表头_中国式复杂报表开发教程(4)—类Excel复杂表头报表
- Larbin 安装遇到的问题(fedora)
- Thread Group(线程组)
- L0、L1、L2范数在机器学习中的应用
- HADOOP都升级到2.5啦~~~
- Android 蹲坑的疑难杂症集锦一
- 数据结构---二叉线索树
- leetcode 976. 三角形的最大周长
- c++调用python原理_C++调用Python浅析
- hashset如何检查重复_如何使用 C# 中的 HashSet
- Oracle集群(RAC)及 jdbc 连接双机数据库
- Java 获取系统信息
- 矩阵分析_二阶矩阵A为酉矩阵的充分必要条件是A为下列三种形式之一
- 可以实现树形结构的设计模式(组合模式)
- 翻译PDF 翻译PPT 保留原格式 一键搞定
- 手机浏览器 html编辑器,vue移动端富文本编辑器vue-html5-editor
- “中国如果有五个丘成桐,数学肯定世界一流”
- XMPP协议的工作原理
热门文章
- python2和python3(导包)自定义包并导入之
- 基于mx27ads 的yaffs 文件系统释疑
- apache加nginx加Php,Apache/Nginx为PHP设置、添加$_SERVER服务器环境变量
- Duilib使用---颜色配置
- CentOS 6.7安装gcc4.8.2
- 天气显示服务器不可用,win7系统桌面天气小工具提示无法连接服务的解决方法...
- 大数据时代下的原型该怎么做?免费模版送给你
- python华为认证_HCIA-AI华为认证AI工程师在线课程题目及参考答案
- Church's Coupon Performance Test Script
- 交叉火力dsp手机调音软件_dsp教程_交叉火力dsp调音教程_教你学dsp百度云(2)