Protobuf在腾讯数据仓库TDW的使用

标签: 技术 数据仓库 | 发表时间:2014-11-13 14:25 | 作者:标点符
出处:http://www.biaodianfu.com

protobuf是google提供的一个开源序列化框架,类似于XML、JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。

protobuf在google中是一个比较核心的基础库,作为分布式运算涉及到大量的不同业务消息的传递,如何高效简洁的表示、操作这些业务消息在google这样的大规模应用中是至关重要的。而protobuf这样的库正好是在效率、数据大小、易用性之间取得了很好的平衡。

protobuf 格式日志在tdw的支持

1、使用protobuf文件创建表

Tdw支持使用用户定义的proto文件来创建表,使用我们开发的编译器扩展对用的proto文件预处理后,通过proto文件自动抽取出表的结构,支持proto文件引用和message嵌套定义。例如:

message Person {

required string name = 1;

required int32 id = 2; // Unique ID number for this person.

optional string email = 3;

enum PhoneType {

MOBILE = 0;

HOME = 1;

}

message PhoneNumber {

required string number = 1;

optional PhoneType type = 2 [default = HOME];

}

repeated PhoneNumber phone = 4;

}

创建的表结构为:

table person{

name string

id int

email string

phone array<struct<number:string,type:int>>

}

Protobuf中enum 类型转化为tdw的int类型,repeated类型转化为tdw的array,支持protobuf中message定义的嵌套,嵌套message类型转化为tdw的struct类型。

2、使用嵌套message protobuf文件的读写适配

提供HDFS与mapreduce层的适配支持protobuf record的input/output format,mapreduce层与hive层的读写适配Serde层支持嵌套类型的message读写和protobuf默认值的支持。

message-protobuf

Protobuf表中的内容采用记录头+记录内容的方式存储,一条记录的头4个字节存储了该记录的数据长度,文件接口层以该长度为依据去读取相应的记录内容。各个记录内容之间用一个长度为4字节的长度字段分隔。

Protobuf

3、protobuf格式日志在tdw的使用

创建protobuf存储格式的表,创建表过程需要用户手工上传proto文件,生成jar包,最后执行建表语句。可通过以下几步完成protobuf表的创建:

  1. 上传Proto定义文件。将proto文件上传到$QE_HOME/protobuf/upload/${UserName}/中
  2. 准备Jar文件。用makejar脚本预处理proto文件,产生并上传对应表的读写接口jar包。示例:$QE_HOME/bin/makejar.sh pgurl user passwd dbname tablename username filename protoversion
  3. 创建protobuf格式的表。创建protobuf存储格式的TDW SQL语句是:CREATE TABLE <tableName> [partition_def] STORED AS PB。示例:
  • 创建普通表(不包含分区)create table comp stored as pb
  • 创建带分区的表,假设comp message中包含log_date的字段,以log_date字段建立分区的SQL为:create table comp partition by list(log_date) (partition default) stored as pb

注意事项

  1. proto文件名一定要是小写,并且不能包含空格等特殊字符;
  2. proto文件中用到import其他proto文件的,不要写路径,只指明文件名即可,例如import “text.proto”;
  3. 主proto文件的message名字一定要与表名相同,根据proto文件生成jar包的时候会进行检查,不相同会报错
  4. 自定义的类型名和变量名不能相同(支持区分大小写,即message A类型的变量名可以为a),否则生成jar包会失败
  5. 不能包含空的message,否则建表的时候会出错

protobuf格式的表入库tdw,直接用hadoop命令将pb文件上传到对应表或分区的目录下即可,支持gz压缩。

使用tdw SQL对protobuf表做日志分析,简单字段可以用通用SQL语法处理,以repeated类型为例描述如何用Lateral View + explode 的SQL处理pb表中的复杂字段。

repeated

举例:

假设广告展示表AdImpression的定义中每个广告展示的记录由一个页面的id和当前页面上展示的广告几个id的list组成,其proto定义为:

 message AdImpression{

   required string pageid = 1;

   repeated int adid_list =2;

 }

当前表中有如下数据:

data-1

对表做lateral view + explode 的SQL如下所示:

SELECT pageid, adid FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;

可以产生如下的输出:

data-2

4、Protobuf表在TDW中使用现状

当前TDW中有150张左右protobuf格式的表,主要存储广点通和推荐业务相关数据,解决了广点通日志模型中存储效率低,分析难度大等问题。

TDW中的pb表大部分为小时或天分区表,日均新增数据30T左右,与文本日志相比节省了大约50%的存储空间。在达到了简化业务逻辑的同时也达到了节约存储成本的效果。

5、protobuf和TDW数据类型对应关系表

当前protobuf中数据类型对应到TDW内置类型的关系如下:

protobuf-type

参考链接:http://www.csdn.net/article/a/2014-06-06/15818975

相关 [protobuf 腾讯 数据仓库] 推荐:

Protobuf在腾讯数据仓库TDW的使用

- - 标点符
protobuf是google提供的一个开源序列化框架,类似于XML、JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多. 虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java、c++、python等语言环境.

腾讯数据仓库TDW元数据重构方案

- - 标点符
大规模应用场景下HIVE暴露出的问题. HIVE进程内存占用高,GC频繁. 元数据接口性能下降(秒级->分钟级). 元数据库压力大,不堪重负. HIVE进程间各个session容易相互影响. HIVE出现session卡死现象. 高并发下容易发生死锁和死循环. HQL Translator层. 重构步骤一:去除ORM层,直接使用JDBC.

大规模Hadoop集群在腾讯数据仓库TDW的实践

- - 标点符
随着业务的快速增长,TDW的节点数也在增加,对单个大规模Hadoop集群的需求也越来越强烈. TDW需要做单个大规模集群,主要是从数据共享、计算资源共享、减轻运营负担和成本等三个方面考虑. TDW之前在多个IDC部署数十个集群,主要是根据业务分别部署,这样当一个业务需要其他业务的数据,或者需要公共数据时,就需要跨集群或者跨IDC访问数据,这样会占用IDC之间的网络带宽.

数据仓库

- Ran - Linux@SOHU
翻译:马少兵、曾怀东、朱翊然、林业. 尽管服务器存储、处理能力得到有效的提高,以及服务器价格的降低,让人们能够负担起大量的服务器,但是商业软件应用和监控工具快速的增加,还是使得人们被大量的数据所困扰. 在数据仓库领域中的许多系统管理员、应用开发者,以及初级数据库管理员发现,他们正在处理“海量数据”-不管你准备与否-都会有好多不熟悉的术语,概念或工具.

数据仓库概念

- - 互联网 - ITeye博客
数据仓库:是一个数据库环境,它提供用户用于决策支持的当前和历史数据,这些数据在传统的数据库中不方便得到. 特点:面向主题,集成的,相对稳定的,反应历史变化的. 组成:数据仓库的数据库,数据抽取工具,元数据,访问工具,数据集市,数据仓库管理,信息发布系统. 数据挖掘:就是从大量数据中获取有效的,新颖的,潜在有用的,最终可理解的模式的过程.

大数据仓库-kudu

- - 数据库 - ITeye博客
数据仓库里面存储引擎是非常重要的,存储引擎的好坏,基本决定了整个数仓的基础. cloudera公司最近发布了一个kudu存储引擎. 按照cloudera的想法,kudu的出现是为了解决,hbase,parquet不能兼顾分析和更新的需求,所以需要一个新的存储引擎可以同时支持高吞吐的分析应用以及少量更新的应用.

数据仓库的设计与开发

- - 数据库 - ITeye博客
     数据仓库系统的设计与开发. 1)       收集和分析业务需求.   用户需求,管理人员需求. 2)       建立数据模型和数据仓库的物理设计.   概念模型,逻辑模型,物理模型. 3)       定义数据源. 数据源面向应用,不是面向主题,而且数据源之间存在多个不一致的情况,所以必须在已有的系统中定义记录系统(内容正确,在多个数据源间起决定作用的操作型数据源).

oracle数据仓库设计指南

- - 数据库 - ITeye博客
ODS(Operational Data Store)是数据仓库体系结构中的一个可选部分,ODS具备数据仓库的部分特征和OLTP系统的部分特征,它是“面向主题的、集成的、当前或接近当前的、不断变化的”数据.     一般在带有ODS的系统体系结构中,ODS都设计为如下几个作用:. 1 )    在业务系统和数据仓库之间形成一个隔离层.

[原]数据仓库元数据管理

- - oycn2010的专栏
元数据管理, 简单的做就是EXCEL结合版本管理等传统工具管理, 专业点就用专门的元数据管理工具;. 数据字典--> 数据知识库. 业务元数据,技术元数据,管理元数据. 参照:SAP元数据管理平台:按业务(角色)分类,按技术类型分类(特征,关键值,DSO,InfoCube),数据流程图. 按照传统的定义,元数据(Metadata)是关于数据的数据.

[原]数据仓库构建步骤

- - oycn2010的专栏
 即确定数据分析或前端展现的主题(例:某年某月某地区的啤酒销售情况). 主题要体现出某一方面的各分析角度(维度)和统计数值型数据(量度)之间的关系,确定主题时要综合考虑..  确定主题后,需要考虑分析的技术指标(例:年销售额等等). 它们一般为数据值型数据,其中有些度量值不可以汇总;些可以汇总起来,以便为分析者提供有用的信息.