Understanding Cubert Concepts(二)Co-Partitioned Blocks

Understanding Cubert Concepts(二):Cubert Co-Partitioned Blocks

话接上文Cubert PartitionedBlocks,我们介绍了Cubert的核心Block概念之一的分区块,它是一种根据partitionKeyscost function来对原始数据进行RedistributionTransformation来结构化数据,这种结构化的数据是对后续join和cube计算是非常有利的。

好了,本文将着重讲Cubert Block中的另一种Block,Co-PartitionedBlock.

Co-partitioned Blocks

让我们来看下另一种创建blocks的方式:

这种方式就是,依靠一个dataset的index创建``另一个dataset的blocks.

比如:

有一个dataset P 是通过上文Cubert PartitionedBlocksBLOCKGEN方式生成的。这个dataset P 的内部会将partitionKeys的全局的range划分为sub-ranges,使得每个sub-range的key范围对应了一个block.(Ps:就是定范围的rangeKeys的数据在一个block内)

举个例子:

  • BLOCKGEN For DataSet P (PartitionedBlocks)

比如我们对dataset PparititionKey指定为memberId,那么BLOCKGEN过程后,会生成类似如下的索引:

memberIds from 0 to 1000 => block 0
memberIds from 1001 to 1500 => block 1
and so on until block N

至此,我们做的都是PartitionedBlocks,如果dataset **S** 要生成Co-paritionedBlocks怎么办呢? 那么索引就是dataset **P**.

  • BLOCKGEN For DataSet S (Co-partitionedBlocks)

我们要生成与DataSet P 同样numberblocks。(分区都是一致的)

具体来说,就是block i of S会和block i in P有着相同的memberIds,换句话说,如果memberId=1234block 2 of P中,那么我们能确定能在block 2 of S中找到这个相同的memberId.

对于Map-Side Join来说,这种一致性的分区方法是必要的。

这种根据其它已经partitionedBlock来进行创建一致性分区Block的过程叫做BLOCKGEN BY INDEX

BLOCKGEN BY INDEX Checklist

如果想要使用cubert来进行开发,那么我们必须遵从下面三个准则:

  1. 定义primary relation:也就是上面我们创建的DataSet P,指定我们要使用的index,这样我们可以根据这个index来创建BLOCKS。(Ps:这里的说的index,就是primary relation)

    Note:

    BLOCKGEN BY INDEX是一个可传递性的操作,比如,我们有三个数据集A,B,C。我们通过BLOKGEN操作数据集A,然后我们可以将A作为primary relation (可以看做indexA),这样我们就可以根据indexA创建co-partitioned Blocks。现在如果C也要做BLOCKGEN操作怎么办呢,选用A还是B呢?其实这种BLOCKGEN BY INDEX是传递性的,indexA -> Blocks of B (co-partitioned), 那么indexA -> Blocks of C 后, Blocks of B == Blocks of C(这里==的意思是co-partitioned).

    所以说BLOCKGEN BY INDEX是一个可传递性的操作。

  2. 定义SortKeys(可选)

    这个排序也是在每个生成后的block内进行的(根据sortKeys排序),不是全局排序的。

  3. 存储为RUBIX FILE FORMAT

    原始数据集转化为blocks的操作,存储的格式必须为RUBIX FILE FOMRAT。

Creating Co-Partitioned Blocks

要创建Co-PartitionedBlocks,还是需要BLOCKGEN这个shuffle command,通过使用BY INDEX来生成。

  • 首先第一个JOB生成primary dataset(包含index,存储的路径就是下面要生成co-partitionedBlocks的索引路径)
  • 第二个BlockGen是通过BY INDEX 指定第primary dataset BLOCKGENtarget path为其索引的。

eg:

// the primary dataset
JOB "our first BLOCKGEN"
        REDUCERS 10;
        MAP {
                data = LOAD "/path/to/data" USING AVRO();
        }
        //根据memberId来作为分区键,根据timestamp来进行sort
        BLOCKGEN data BY ROW 1000 PARTITIONED ON memberId SORTED ON timestamp;
        //注意,这里必须存储为RUBIX FILE FORMAT
        STORE data INTO "/path/to/output" USING RUBIX();
END

JOB "our first blockgen by index"
        REDUCERS 20;
        MAP {
                data = LOAD "/path/to/other/data" USING AVRO();
        }

        //注意 INDEX的 Path 为 上一个JOB的存储目录
        BLOCKGEN data BY INDEX "/path/to/output" PARTITIONED ON memberId SORTED ON some_column;
        STORE data INTO "/path/to/other/output" USING RUBIX();
END

Idiom of Resorting Blocks

BLOCKGEN BY INDE命令还有另一种用途,对于已创建过的Blocks进行重新排序

在上一个例子里的our first BLOCKGEN JOB里,我们是对blocks内部根据timestamp键来进行排序的。如果我想重新指定排序键,怎么做呢?

  • 将生成Blocks后的数据集重新从存储路径(/path/to/output)使用RUBIX FILE FORMAT加载进来
  • 使用相同的路径自引用索引/path/to/outputBLOCKGEN BY INDEX,并且指定sorted on pagekey 重排序的键为pagekey
JOB "resorting blocks"
        REDUCERS 10;
        MAP {
                data = LOAD "/path/to/output" USING RUBIX();
        }
        BLOCKGEN data BY INDEX "/path/to/output" PARTITIONED ON memberId SORTED ON pagekey;
        STORE data INTO "/path/to/resorted-output" USING RUBIX();
END

注意:

  • 我们要确保使用的还是原始数据集的index
  • 并且一定要使用相同的partition Keys哦,否则block的数据分布就乱了。

同样,我们可以对数据集B,C都使用indexA进行重排序处理,因为他们都是co-partitioned blocks

参考

Cubert官方文档blocks

Ps:本文的写作是基于对Cubert官方文档的翻译和个人对Cubert的理解综合完成 :)

原创文章,转载请注明:

转载自:OopsOutOfMemory盛利的Blog,作者: OopsOutOfMemory

本文链接地址:http://blog.csdn.net/oopsoom/article/details/46707733

注:本文基于署名-非商业性使用-禁止演绎 2.5 中国大陆(CC BY-NC-ND 2.5 CN)协议,欢迎转载、转发和评论,但是请保留本文作者署名和文章链接。如若需要用于商业目的或者与授权方面的协商,请联系我。

时间: 2024-11-07 14:32:18

Understanding Cubert Concepts(二)Co-Partitioned Blocks的相关文章

Understanding Cubert Concepts 之 BLOCK(一)

Understanding Cubert Concepts: Cubert Concepts 对于Cubert,我们要理解其核心的一些概念,比如BLOCK.这些概念也是区别于传统的关系型范式(Pig,Hive)等数据处理流程并使得Cubert在大规模数据下JOIN和Aggregation中取胜的关键因素.(自己测下来,CUBE的计算效率比Hive高好多倍.) BLOCK Cubert定义了一个BLOCK的概念,分为两种:Partitioned Blocks & Co-ParitionedBloc

LinkedIn Cubert 实践指南

· LinkedIn Cubert安装指南 · Understanding Cubert Concepts(一)Partitioned Blocks · Understanding Cubert Concepts(二)Co-Partitioned Blocks 原创文章,转载请注明: 转载自:OopsOutOfMemory盛利的Blog,作者: OopsOutOfMemory 本文链接地址:http://blog.csdn.net/oopsoom/article/details/46707733

Basic Concepts 基本概念(二)

Basic Concepts There are a few concepts that are core to Elasticsearch. Understanding these concepts from the outset will tremendously help ease the learning process. 有一些概念是Elasticsearch的核心.从一开始就理解这些概念将极大地帮助简化学习过程. Near Realtime (NRT) Elasticsearch i

LinkedIn Cubert安装指南

最近工作需要,调研了一下LinkedIn开源的用于复杂大数据分析的高性能计算引擎Cubert.自己测了下,感觉比较适合做报表统计中的Cube计算和Join计算,效率往往比Hive高很多倍,节省资源和时间. 下面看下这个框架的介绍: Cubert完全用Java开发,并提供一种脚本语言.它是针对报表领域里经常出现的复杂连接和聚合而设计的.Cubert使用MeshJoin算法处理大时间窗口下的大数据集,CPU和内存利用率显著提升.CUBE是Cubert定义的一个新操作符,可以计算累加和非累加分析维度.

Objective-C Blocks

Objective-C Blocks All of these examples have been verified with this version of LLVM: Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn) Target: x86_64-apple-darwin11.4.2 Thread model: posix Example A void exampleA() { char

Log4j – Configuring Log4j 2 - Apache Log4j 2

Apache Log4j 2 ? Logging Wiki Apache Logging Services Sonar   Configuration Inserting log requests into the application code requires a fair amount of planning and effort. Observation shows that approximately 4 percent of code is dedicated to logging

logstash+elastic+kibana日志管理工具介绍及安装

logstash+elastic+kibana日志管理工具介绍及安装 一. Logstash 安装 1.1 前置条件,安装了官方java 7或更新版本 查看 [ldx@1511-min ~]$ java -version openjdk version "1.8.0_71" OpenJDK Runtime Environment (build 1.8.0_71-b15) OpenJDK 64-Bit Server VM (build 25.71-b15, mixed mode) 1.2

Hadoop 架构初探

对流行Hadoop做了一些最基本的了解,暂时没太大感觉,恩先记点笔记吧. = = Hadoop 基本命令及环境安装 一.下载虚拟机镜像 目前比较流行的有以下三个: (CHD) http://www.cloudera.com (HDP)  http://hortonworks.com/ (MapR) http://www.mapr.com 本文使用HDP的沙盘 下载地址 http://hortonworks.com/products/hortonworks-sandbox/#install 我使用

Partition Table 查询性能

分区表的高效的查询性能是基于Partition Elimination 和 Partition Parallelism实现的.Partition Elimination 是指在执行TSql查询的时候,不是seek表的所有分区,而是根据Partition column排除部分分区,在符合 filtering the partition column 条件的 partition 上进行查询.Partition Parallelism是指分区之间可以并发执行查询.分区表查询使用更小的查询范围,更高的并