最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

腾讯tdw技术深度解析

[复制链接]
跳转到指定楼层
楼主
发表于 2014-12-3 21:52:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
tdwTDW是腾讯基于hive和hadoop之上构建的数据仓库系统,在使用中,腾讯对hive做了大量定制,作为TDW的查询引擎(TDW QE)。这个项目将腾讯的hive分支以apache licence 2.0协议开源。
环境依赖
  • CentOS-x86-64 6.x
  • Oracle JDK 1.6.x
  • Apache-ant 1.7.x及以上版本
  • PostgreSQL 9.2.x及以上版本
  • Hadoop 0.20.x版本
  • Protobuf 2.3.0及以上版本
  • hadoop-gpl-compression

编译安装c/c++开发环境sudo yum install groupinstall "Development Tools"sudo yum install glibc-static wget unzip
安装java开发环境
下载JDK 1.6.x和Apache-ant并安装,设置JAVA_HOME和PATH环境变量,如添加以下到~/.bashrc中(这里将jdk和ant都安装在home中,请根据自己的情况替换相应的路径):
echo 'export JAVA_HOME=~/jdk_1.6.0_26' >> ~/.bashrc  echo 'export PATH=$JAVA_HOME/bin:~/apache-ant-1.7.1/bin:$PATH' >> ~/.bashrc. ~/.bashrc
检查java与ant环境及版本是否正确安装,运行如下命令检查:
allison@tdw:~$ ant -version
Apache Ant version 1.7.1 compiled on June 27 2008
allison@tdw:~$ javac -version
javac 1.6.0_26
如果返回"-bash: xxx: command not found",或者版本号低于TDW要求,请确认依赖软件是否安装正确,相应的环境变量是否设置生效。
安装protobufwget https://protobuf.googlecode.com/files/protobuf-2.3.0.zipunzip ./protobuf-2.3.0.zipcd ./protobuf-2.3.0./configuresudo make install
编译TDW QE二进制下载编译依赖的LZO压缩库:wget hadoop-gpl-compression-0.1.0-rc0.tar.gztar xf hadoop-gpl-compression-0.1.0-rc0.tar.gz下载qe.zip到当前目录unzip ./qe.zipcp hadoop-gpl-compression-0.1.0/hadoop-gpl-compression-0.1.0.jar qe/lib/进行编译:cd qe && ant package
看到
BUILD SUCCESSFUL
Total time: ...
表示编译成功,生成的二进制包在qe/build/dist目录中,有以下几个目录:
  • auxlib:运行时辅助lib
  • bin:启动、重启脚本
  • conf:配置文件所在的目录
  • examples:SQL示例
  • lib:库目录
  • pl:过程语言库及脚本
  • PLClient:交互式客户端
  • protobuf:运行时protobuf临时目录

qe/build/dist目录用来打包部署生产环境。
编译后dist的代码命名为QE_HOME环境变量,后本QE_HOME都指向这个目录:
export QE_HOME=/home/allison/qe/build/dist  
单机环境搭建
这个章节,我们快速搭建一个单机版的TDW QE环境,并运行简单的SQL进行体验。这个环境中,Hive,元数据,Hadoop都在一台机器上,并且HDFS和MapReduce都是本地运行模式,因此不宜处理较大数据量。
TDW QE安装包中自带了一个hadoop-0.20.0的包在qe/hadoopcore文件夹中,在单机环境中,我们使用这个hadoop在单机环境中运行SQL和MR。这时需要设置HADOOP_HOME指向这个目录。
export HADOOP_HOME=/home/allison/qe/hadoopcore/hadoop-0.20.0
默认元数据配置首先在本机上要有PostgreSQL服务,使它监听127.0.0.1的5432端口(默认安装和初始化的PostgreSQL即监听127.0.0.1的5432端口),然后使用PG的管理员身份(一般是初始化PG数据库的linux账号,这里是postgres账户),运行qe/script/tdw_meta_init.sql脚本,初始化元数据:
psql -h 127.0.0.1 -p 5432 -U postgres postgres -f qe/script/tdw_meta_init.sql
如果之前初始化过,可以使用PG管理员身份运行qe/script/reset_meta.sql脚本重置元数据,再运行上面的命令重新初始化元数据:
psql -h 127.0.0.1 -p 5432 -U postgres postgres -f qe/script/reset_meta.sqlpsql -h 127.0.0.1 -p 5432 -U postgres postgres -f qe/script/tdw_meta_init.sql
启动Hive命令行(CLI模式)
CLI模式区别于hvie server模式,在客户端进行SQL的解析和MR任务的提交。在开发和调试时,使用CLI模式比较方便。
启动hive的命令行: cd $QE_HOME/bin && ./hive -u root -p tdwroot 进入如下命令行界面(TDW QE默认初始化账号root以及它的密码为tdwroot):
allison@tdw:~/qe/bin$ ./hive -u root -p tdwroot
session : allison_201404021650_0.4582392182039239 start!
Connect to TDW successfully!
hive>
然后就可以运行TDW SQL:
hive> create table tdw_table(key int,value string);OKTime taken: 0.574 secondshive> show create table tdw_table;OKCREATE TABLE tdw_table(key INT,value STRING);Time taken: 0.113 secondshive> insert into tdw_table values(1,'11'),(2,'22'),(3,'haha'); --...省略日志信息hive> select * from tdw_table; OK1   112   223   hahaTime taken: 0.019 seconds
启动Hive Server模式
Hive Server模式是生产环境推荐的使用模式。它的启动方式是:
cd $QE_HOME/bin && ./start-server.sh  
这个命令将hive server默认绑定在50000端口。如果希望指定端口,可以将端口号作为第一个参数传入,如:
cd $QE_HOME/bin && ./start-server.sh 50001
然后可以通过PLClient进行连接。PLClient的使用方式,请参考下文。
Hadoop分布式环境配置分布式环境与单机环境的最大区别是Hadoop使用local模式,还是分布式模式。在Hadoop生产环境中,TDW QE作为Hadoop的客户端,提交MR任务。因此,需要在TDW QE的机器上部署Hadoop客户端。
然后进行以下初始化:
以hadoop管理员运行以下命令(这里假设TDW QE将以tdwadmin这个hadoop用户提交mr job和做hdfs操作):

hadoop fs -mkdir /tdwqe/warehousehadoop fs -chown -R tdwadmin:tdwadmin /tdwqe/warehousehadoop fs -chmod -R 777 /tmp
修改TDW QE配置,将$QE_HOME/conf/hive-default.xml中的配置进行修改: 将以下配置项删除:
hadoop.tmp.dirfs.default.namemapred.job.tracker
将以下配置项设置为冒号后的值:
hive.exec.scratchdir:/tmp/tdw-${user.name}hive.metastore.warehouse.dir:/tdwqe/warehouse
将HADOOP_HOME环境变量指向Hadoop客户端,如:
export HADOOP_HOME=/home/allison/hadoop-0.20.1
然后启动TDW QE:
cd $QE_HOME/bin && ./start-server.sh
然后就可以通过PLClient连接使用。
配置元数据分散化TDW的元数据支持分散化。元数据database由一个globa database和若干个segment database组成。在使用元数据时,TDW QE对表的qe db名计算一个hash值,将hash值映射在0~9999范围内,通过global元数据database中的一张路由配置信息,确定qe db内的表存储在哪个segment元数据database中。
TDW QE是通过global database中的seg_split表中的内容,选择将元数据放到对应的segment database中的。seg_split的定义是(可以在qe/script/tdw_meta_init.sql中找到元数据的定义信息):
CREATE TABLE seg_split (    seg_addr character varying NOT NULL,    seg_accept_range int4range);
默认TDW QE的配置如下:
insert into seg_split values('jdbc:postgresql://127.0.0.1:5432/seg_1','[0,10000)');
表示将所有qe db hash值为0~9999的表,都放在seg_1这个元数据database中,seg_1的连接地址是jdbc:postgresql://127.0.0.1:5432/seg_1。
如果要将元数据分散在两个segment database中,这两个segment database位于不同的主机上,则可以将上面的insert语句改为:
insert into seg_split values('jdbc:postgresql://192.168.1.2:5432/seg_1','[0,4999)');insert into seg_split values('jdbc:postgresql://192.168.1.3:5432/seg_2','[5000,10000)');
除了修改global database中的路由配置信息,还要初始化对应的seg_1和seg_2数据库,seg_1和seg_2两个database内的表结构都是一样的,如果他们在不同的PostgreSQL实例中,database名甚至可以相同(如都叫seg_1,但是不推荐)。可以通过pg_dump -s命令获得一个segment database的schema信息,用这个信息创建其它segment。
配置多HDFS如果想使指定的tdw database数据存储在指定的hdfs中,可以在TDW QE中执行一下操作:
create database abc with(hdfsschema = 'hdfs://tdw-hdfs.tencent-distribute.com:5353');  
之后,这个db中的所有表的数据,都会存放在hdfsschema指定的hdfs集群中。 如果create database不带with参数,创建的db的存放hdfs是TDW QE运行的机器上hadoop hdfs默认的配置。
配置pgdata存储引擎pgdata存储引擎是将PostgreSQL作为TDW的一个存储引擎,用户在TDW中建表时,如果指定stored as pgdata,那么这张表就会在配置项hive.pgdata.storage.url所指定的PostgreSQL实例中创建,同时在TDW中可见。在PG端,建表所用的用户名和密码,与TDW端的用户名和密码一致,因此在执行建表前,要确保该用户在PG侧账户和密码的存在和正确性。
用户也可以自己指定一个PG实例,以覆盖TDW QE默认的设置。如:
set hive.pgdata.storage.url = jdbc:postgresql://192.168.1.3:5432/mypgdata;create table test(key int,value string) stored as pgdata;
pgdata存储引擎的表,在TDW端和PG端都可以操作,数据值保存在PG端。相对于普通的TDW表,pgdata存储引擎表可以有索引,可以快速update、delete,可以使用PG的jdbc、odbc、php等接口进行操作等。而且,对于pgdata存储引擎表,TDW会尽量将过滤条件下推到PG侧,使它在TDW中的访问效率更高。
PLClient使用PLClient提供交互式的查询接口,一下为登陆和运行SQL的演示:
allison@tdw$ $QE_HOME/bin/plclient/tdwpl
Python version is OK.
No arguments, we fall back to shell mode now ...
Entering shell mode now ...
Got config from cmd line: mode m connect to None:None@None:None
Username: root
Password: tdwroot
Use 'connect/c' to connect the server!
TDW/PL Client Version 0.2.3
Auto save config: False
Auto save passwd: False
User home library: '~/.tdwpl'
User: 'root'
Database name 'default_db'
Server 'None:None' not connected
Welcome to TDW PL Shell, for help please input ? or help
root@TDW-PL$ server 127.0.0.1
You have changed server to '127.0.0.1'
root@TDW-PL$ port 50000
You have changed port to '50000'
root@TDW-PL$ c
connect to hive ip:127.0.0.1
Connect to server '127.0.0.1:50000' success.
root@TDW-PL$ new
New Session 6957574802551219 -1485586152
root@TDW-PL$ create table allison_test(key int);
TDW-00000 SUCCEED ( session: 6957574802551219 query: create table allison_test(key int) )
root@TDW-PL$ desc allison_test
key int
TDW-00000 SUCCEED ( session: 6957574802551219 query: desc allison_test )
root@TDW-PL$ help
Documented commands (type help ):  ========================================  EOF            color       ed            kill     put           sleep    a              compile     edit          ls       q             start    attach         config      editor        lsl      quit          status  autoed         connect     exec          lsm      reset         test    autosaveconf   d           exit          lsu      run           upload  c              dbname      get           makejar  save          uploadm cat            detach      gethistory    n        savepasswd    user    ci             discard     getqp         new      server      cl             disconnect  getqueryplan  passwd   serverstatusclusterstatus  doc         getschema     plc      sethome     co             downloadm   host          port     shows      
常用配置说明TDW QE的配置文件在$QE_HOME/conf目录中,默认有两个,hive-default.xml和hive-log4j.properties,前者是TDW QE的主要配置,后者配置日志行为。hive-default.xml中的配置可以包含Hadoop的配置项,如果包含,会覆盖$HADOOP_HOME/conf中的相关配置。
  • hive.default.fileformat
    指定新建表的默认存储格式,当create table没有stored as子句时,将使用改配置指定的存储格式。可选为sequencefile,textfile,rcfile,formatfile.默认为textfile,推荐使用rcfile。
  • hive.default.formatcompress
    使用formatfile为默认存储引擎是是否启用LZO压缩,为true时启用LZO压缩,false则不启用。默认为true。
  • hive.service.newlogpath
    hive server session log存放路径,每个session会产生一个文件。默认为/tmp/newlog目录。注意要定期清理里面的历史session日志。
  • fetch.execinfo.mode
    PLClient在执行完每条SQL时,打印执行过程的统计信息。可选的为no,part,all,打印信息依次增加。默认为part。
  • hive.query.info.log.url
  • hive.query.info.log.user
  • hive.query.info.log.passwd TDW QE在Hive Server模式下执行信息上报配置。分别配置为PG的jdbc连接url,连接用户名和密码。url格式如:jdbc:postgresql://192.168.1.3:5432/query_info。在源码的script中tdw_meta_init.sql中的tdw数据库下的tdw schema可以查看执行信息上报的表结构。注意要定期清理这些表的历史数据。
  • hive.metastore.global.url
  • hive.metastore.pbjar.url
  • hive.metastore.user
  • hive.metastore.passwd hive.metastore.global.url指定元数据global database的jdbc url,格式如:jdbc:postgresql://192.168.1.3:5432/global。hive.metastore.pbjar.url指定protobuf jar包等信息的database usr,格式如:jdbc:postgresql://192.168.1.4:5432/pbjar。 hive.metastore.user和hive.metastore.passwd设置hive.metastore.global.url、hive.metastore.pbjar.url所指定的PostgreSQL元数据库连接的用户名和密码。这个用户名密码,也是TDW QE连接所有segment database的用户名和密码。
  • hive.metastore.warehouse.dir TDW QE database数据在HDFS上的存放目录。如:/tdwqe/warehouse。
  • hive.exec.scratchdir TDW QE SQL执行过程中的中间临时数据在HDFS上的存放目录。如/tmp/tdw-${user.name}。
  • hive.pgdata.storage.url 默认的pgdata存储引擎的的PG实例地址,格式如jdbc:postgresql://192.168.1.4:5432/pbdata。
  • hive.pb.badfile.skip
  • hive.pb.badfile.limit hive.pb.badfile.skip设置是否开启SQL处理的Protobuf文件算坏时,跳过这个文件,而不是立即报错。true表示开启,false表示不开启。默认不开启。hive.pb.badfile.limit设置如果开启跳过PB损坏文件,当损坏文件超过多少时,SQL执行失败。默认是10。
  • hive.max.sql.length 设置TDW QE接受的SQL的最大长度,到超过这个长度时,SQL将报错。这个值大于100时生效。默认是0。
  • hive.session.timeout 设置session多长时间没有活动,Hive Server将其断掉。该值在[0,7200]范围内时,被设置为7200s,否则被设置为60s。默认是0。
  • hive.client.connection.limit
  • hive.client.connection.limit.number hive.client.connection.limit设置是否开启Hive Server最大连接数限制,true开启,false关闭。默认是true。hive.client.connection.limit.number设置开启Hive Server最大连接数设置时,最大连接数限制值。连接数大于或等于这个值时,Hive Server将决绝连接。默认是50。
  • hive.inputfiles.splitbylinenum
  • hive.inputfiles.line_num_per_split 设置是否开启按行split,以及按照多上行记录,产生一个split。hive.inputfiles.splitbylinenum设置是否开启,默认为false。hive.inputfiles.line_num_per_split设置单个split的行数。只对format和rcfile存储格式生效。
  • hive.exec.parallel
  • hive.exec.parallel.threads 设置是否开启单个SQL无依赖MR并行运行,以及并行的线程数。hive.exec.parallel为true时开启,默认为false。hive.exec.parallel.threads默认是8。
  • hive.multi.rctmpfile.path SQL在做JOIN等操作时,如果内存不够用,会将数据写入到MR task本地磁盘。这个配置指定多个路径,他们可以分散到多个磁盘,以提高IO效率。配置路径以逗号分隔,且必须是绝对路径。默认是/tmp/data{1..12}。


ProtoBuf存储格式支持TDW支持Protobuf存储格式,用户可以通过proto定义文件,创建TDW表。
下面介绍创建Protobuf表的步骤。
拷贝proto定义文件将proto文件拷贝到$QE_HOME/protobuf/upload/${UserName}/中,UserName为TDW建表用户名。如果一张表对应有多个proto文件,确保将所有的都拷贝到目标目录。
预处理proto文件运行以下命令:
$QE_HOME/bin/makejar.sh pgurl user passwd dbname tablename username filename protoversion
参数说明:
  • pgurl,user,passwd:保存jar报的元数据库信息,应该分别与$QE_HOME/conf中的hive.metastore.pbjar.url,hive.metastore.user,hive.metastore.passwd一致。
  • dbname,tablename:要创建表在TDW中的db名和表名,注意表名要与主message名相同。
  • username:建表用户名
  • filename:主proto文件名,这个文件及其包含的文件(如果有的话)应该已经拷贝到指定的目录中。
  • protoversion:protobuf版本号,目前只支持2.3.0

执行建表语句create table tablename partition by list(part_time) (partition default) stored as pb
tablename:要创建的表名,支持分区表。创建表的dbname,tablename要与预处理中的信息一致。
注意事项
  • proto文件名一定要是小写,并且不能包含空格等特殊字符;
  • proto文件中用到import其他proto文件的,不要写路径,只指明文件名即可,例如import "text.proto";
  • 主proto文件的message名字一定要与表名相同,根据proto文件生成jar包的时候会进行检查,不相同会报错
  • 自定义的类型名和变量名不能相同(新版本支持区分大小写,即message A类型的变量名可以为a),否则生成jar包会失败
  • 不能包含空的message,否则建表的时候会出错

回归测试首先按照“默认元数据配置”章节所描述的方法,初始化元数据,然后执行以下操作:
cd qeant test等待...ant testreport  
用浏览器打开qe/build/test/junit-noframes.html可以查看junit测试用例运行情况。
推荐在有4GB以上内存配置的机器上运行回归测试。

已知问题
  • formatfile存储格式单行记录不能超过32KB,rcfile存储格式默认单行记录不能超过4MB,文本存储格式没有这个限制。因此在使用前,请提前做好评估,选择合适的存储格式建表。
  • 目前tdw的用户名和密码在元数据库中使明文存储的,并且在传输过程中也是明文传输;hadoop的日志和job配置信息,日志可能带有敏感信息,需要控制访问权限。因此,请在安全可信的环境中(使用防火墙隔离或者物理隔离)使用。在TDW未来版本中,将对安全这块进行改进。
  • 在向一个分区表中insert数据时,如果insert的目标分区过大(如数据将insert到超过100个分区),在MR执行过程中可能产生OOM错误,这时请修改SQL逻辑,或者增大MR task的内存配置。


FAQ
  • TDW是什么?
    TDW是腾讯分布式数据仓库(Tencent Distributed Data Warehouse)的简称,是腾讯基于Hive、Hadoop、PostgreSQL等开源软件构建的数据仓库。TDW目前将核心模块--TDW查询引擎(TDW QE)块以apache license 2.0协议开源,这个模块基于apache hive 0.4.1版本进行改造,可以配合社区Hadoop版本快速构建数据仓库系统。
  • TDW QE现在的应用情况是怎样的?
    TDW正式运营已有4年多,目前腾讯内超过90%以上的大数据分析是通过TDW QE的SQL来做的。我们的生产环境有70多个QE(hive server模式)实例在运行,他们共用一套元数据,管理着30万+张表,数千万个分区,近百PB的HDFS数据,每天接受近900万条SQL命令,并发session峰值超过2000。
  • TDW QE相比官方apache hive有什么优势?
    首先TDW QE经过腾讯大规模压力、稳定性、功能上的验证,更稳定;其次,我们有一些社区并不具备的特性:如元数据分散化,多HDFS支持,基于角色的权限管理,range/list分区等;最后我们的文档都是中文,对国内研发人员来说更友好。
  • TDW QE的SQL语法与与apache hive兼容吗?
    我们基于apache hive 0.4.1版本,添加了大量SQL语法和函数,在添加过程中,我们尽量参考已有的SQL语法(如MySQL、PostgreSQL),但是很少参考社区hive 0.4.1后的版本的语法。因此TDW QE的SQL语法与apache hive有差异,不完全兼容。对于SQL语法,TDW QE的往往比apache hive的更标准(如cube和rollup的语法)。
  • 与TDW QE配合使用的hadoop版本有哪些?
    在腾讯的TDW生产环境中,我们使用的hadoop版本基于hadoop-0.20.1,及CDH3u3(基于apapche hadoop-0.20.2),我们没有测试过更高的hadoop版本。但是理论上与hadoop-0.20.x接口兼容的hadoop版本都可以用。对于hadoop 2.0版本的支持,我们正在开发中,将在未来一两个月完成。





楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-6 08:48

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表