Understanding Cubert Concepts(一)Partitioned Blocks
Understanding Cubert Concepts(一)Partitioned Blocks
Cubert Concepts
对于Cubert,我们要理解其核心的一些概念,比方BLOCK。这些概念也是差别于传统的关系型范式(Pig。Hive)等数据处理流程并使得Cubert在大规模数据下JOIN和Aggregation中取胜的关键因素。
(自己測下来,CUBE的计算效率比Hive高好多倍。
)
BLOCK
Cubert定义了一个BLOCK的概念。分为两种:Partitioned Blocks
& Co-ParitionedBlocks
Hubert将这些Block存储为特殊的格式。叫做Rubix Format
Partitioned Blocks
从字面上来看,叫做分区块。
比方说有一个pageviews
表,有三个列,分别为:memberId(int)
,pagekey(string)
,timestamp(long)
通常在HDFS中,这些数据会被切分为一个个的文件(part-00000.avro, part-00001.avro, etc)
,然后置于某一个文件夹下,这些数据默认是没有被分区
和排序
的。
然而,在Cubert的世界里,我们鼓舞数据
能被更加结构化的存储。
更确切的来说,我们希望数据
能够依据一些分区键
来进行分区成一些数据单元
。这些数据单元
就是Cubert中的Partitioned Blocks, 并且我们希望在每一个Block
中的数据能够在某些列上是有序
的。
PS:这里面涉及到2个概念:PartitionKeys
和 SortKeys
。相应于上述的分区键
和排序键
。
BLOCKGEN
将Raw data
转化为partitioned
和sorted
的data units
的过程称为BLOCKGEN
。
这个是Cubert语法里一个很重要的操作符。
这张图告诉我们:
1. 我们有一个table。2列,JK
和GK
2. BLOCKGEN的过程就是选择一个partitionKey
为JK
,依据这个分区键来对数据块分区。然后对分区后的数据块内部选择GK
作为排序键,来对分区后的数据块
排序。
3. 这样原始数据划分称为了2个partitionedBlocks即BLOCK#1
,BLOCK#2
BLOCKGEN Checklist
作为一个Cubert的开发人员,我们须要遵从4个规范:
1.定义PartitionKeys
从这个数据集的列中选择要依据哪几个列进行分区。
举个来说:
对于pageviews
这个表:
假设指定分区键为memberId
,那么我们能够确定的是。全部memberId=1234
的数据Row
都会被分区到一个partitionedBlock
中去.
2.定义SortKeys(可选)
从这个数据集的列中选择要依据哪几个列进行排序,假设不指定,默认和分区键同样。
Note:这个排序操作不是全局排序,仅仅是在每一个已经分区好的block内部进行局部排序。
举个来说:
还是pageviews
这个表:
我们分区后的数据。能够依据timestamp
这个时间字段。在对block内部
的rows
进行排序。
3.定义代价函数CostFunction
前面一直提到分区。详细怎样来划分block呢?这时候cost function
起到了作用:
- BY ROW 依据数据行数来划分。每一个block中最多油多少行记录。假设超出阀值。则新生成一个
block
。 - BY PARTITION KEYS 依据分区键来划分。每一个block要有指定数目的
partition keys
。假设partition keys
是主键的话,那么和BY ROW
这个cost function
效果相似。 - BY SIZE 依据数据块的大小来划分。单位bytes。
超过指定阀值。就会新建一个block。
4.存储结果数据格式(必须)为RUBIX格式
RUBIX是一种特殊的数据格式。它存储了数据的一些索引细信息
和BLOCKGEN过程须要的一些metadata
Creating Partitioned Blocks(Demo)
Note: BLOCKGEN是一个shuffle command
该程序的分区键:memberId
排序键:timestamp
JOB "our first BLOCKGEN"
REDUCERS 10;
MAP {
data = LOAD "/path/to/data" USING AVRO();
}
// Create blocks that are (a) partitioned on memberId, (b) sorted on timestamp, and
// (c) have a size of 1000 rows
BLOCKGEN data BY ROW 1000 PARTITIONED ON memberId SORTED ON timestamp;
// ALWAYS store BLOCKGEN data using RUBIX file format!
STORE data INTO "/path/to/output" USING RUBIX();
END
因为我们设定了reducer的个数为10,那么将会有10个part-xxx.rbx
文件,e.g.:(part-r-00000.rbx through part-r-00009.rbx
)
Note:每一个rbx文件里能够包括>=1
个block
。
所以不用操心会生产太多的file.
參考
Ps:本文的写作是基于对Cubert官方文档的翻译
和个人对Cubert的理解
综合完毕 :)
原创文章。转载请注明:
转载自:OopsOutOfMemory盛利的Blog, 作者: OopsOutOfMemory
本文链接地址:
注:本文基于署名-非商业性使用-禁止演绎 2.5 中国大陆(CC BY-NC-ND 2.5 CN)协议,欢迎转载、转发和评论。可是请保留本文作者署名和文章链接。
如若须要用于商业目的或者与授权方面的协商。请联系我。
Understanding Cubert Concepts(一)Partitioned Blocks的更多相关文章
- LinkedIn Cubert 实践指南
· LinkedIn Cubert安装指南 · Understanding Cubert Concepts(一)Partitioned Blocks · Understanding Cubert Co ...
- (二)Basic Concepts 基本概念
Basic Concepts There are a few concepts that are core to Elasticsearch. Understanding these concepts ...
- Elasticsearch-->Get Started-->Basic concepts
https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-concepts.html There ...
- Log4j – Configuring Log4j 2 - Log4j 2的配置
Configuration Inserting log requests into the application code requires a fair amount of planning an ...
- rxjs 入门--环境配置
原文: https://codingthesmartway.com/getting-started-with-rxjs-part-1-setting-up-the-development-enviro ...
- .Net元编程【Metaprogramming in NET】 序-翻译
最近在看这本书,比较实用.抽点时间把公开的部分内容简单的翻译了一下,下文是序部分. 书的具体地址为: http://www.amazon.cn/Metaprogramming-in-NET-Hazza ...
- Gumshoe - Microsoft Code Coverage Test Toolset
Gumshoe - Microsoft Code Coverage Test Toolset 2014-07-17 What is Gumshoe? How to instrument a binar ...
- Speeding up AngularJS apps with simple optimizations
AngularJS is a huge framework with that already has many performance enhancements built in, but they ...
- spring Transaction Management --官方
原文链接:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html 12. ...
随机推荐
- mvc表单Form提交 --实体
1.方式1:字段加验证 @model MvcWeb.Models.UserInfo @{ ViewBag.Title = "Add"; } <h2>Add</h2 ...
- 51Nod 迷宫问题(最短路+权值)(模板)
你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了 ...
- vue 使用同一组件,切换时不触发created、mounted钩子
两个页面参数不同使用同一组件,默认情况下当这两个页面切换时并不会触发created或者mounted钩子. 方法一:通过watch $route的变化来做处理 watch: { $route() { ...
- hostname---显示和设置系统的主机
hostname命令用于显示和设置系统的主机名称.环境变量HOSTNAME也保存了当前的主机名.在使用hostname命令设置主机名后,系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名. ...
- 托管非托管Dll动态调用
原文:托管非托管Dll动态调用 最近经常看到有人问托管非托管Dll调用的问题.对于动态库的调用其实很简单.网上很多代码都实现了Dll的静态调用方法.我主要谈论下动态库的动态加载. 对于托管动态库,实现 ...
- Mybatis 一对多 多对1
http://blog.csdn.net/z69183787/article/details/46833565 http://blog.csdn.net/rain097790/article/deta ...
- 停止使用域名 boypay.net
停止使用域名 boypay.net boypay.net 这个域名当时注册的时候打算开发网店--" 情侣商城",表面意思是 "男生支付",情侣和婚姻是人生中必须 ...
- Uniform Server
Uniform Server http://www.uniformserver.com/ https://sourceforge.net/projects/miniserver/files/ Unif ...
- read()方法读取的是一个字节,为什么返回是int,而不是byte
因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111 那 ...
- 求第k大的数(用到快速排序算法的思想)
//下面两种part效率比较:相同运算量下part比part2快5倍左右,part2写法简单但是效率低 #include "stdafx.h" #include <iostr ...