kingso profile
TRANSCRIPT
Kingso Profile
henshao
October 28, 2011
henshao Kingso Profile
Agenda
What is Profile?
How to build Profile?
Let’s talk Kbuild
henshao Kingso Profile
Agenda
What is Profile?
How to build Profile?
Let’s talk Kbuild
henshao Kingso Profile
Agenda
What is Profile?
How to build Profile?
Let’s talk Kbuild
henshao Kingso Profile
Agenda
What is Profile?
How to build Profile?
Let’s talk Kbuild
henshao Kingso Profile
基本概念
group
segment
encode
henshao Kingso Profile
基本概念
group
segment
encode
henshao Kingso Profile
基本概念
group
segment
encode
henshao Kingso Profile
group
物理上存储在一起的字段组成一个group,profile可以由多个group组成,每个group有若干个segment组成。segment中每个宝贝的数据大小是固定的。
索引数据中,profile的大小仅次于detail,目前线上一列3500w宝贝,profile大约12GB。
$ ls | grep groupprofile group 0.seg 0
profile group 1.seg 0
profile group 2.seg 0
henshao Kingso Profile
segment
每个group分为若干个segment,固定(1<<20)个doc组成一个segment。
$ ls | grep segprofile group 0.seg 0profile group 0.seg 1profile group 0.seg 2
henshao Kingso Profile
encode
对于宝贝中重复度比较高的字段,比如provcity,可以配置到编码表中;另外,变长字段必须保存在编码表中。
由于一些巨型字段(mlr feature和prop vid)的原因,编码表和group的大小各占6GB左右。
$ ls | grep encodecat id path.encode idxcat id path.encode cnt
henshao Kingso Profile
一图顶万言
henshao Kingso Profile
How to build Profile?
第一个过程: 解释xml,生成类似v3格式的中间文件,每一行是一个宝贝的正排数据。
第二个过程:读取每一行,将字段转变成二进制格式保存到segment中;如果需要编码的话,则将数据保存到编码表中,segment中只保存一个offset。
henshao Kingso Profile
Profile相关类图
一些高级玩意儿
bitrecord小于32 bits的字段可以组合起来,这样profile能小一点点。它们要对齐到32。
group varint将4个int32 t等类型一起压缩,利用1 byte保存压缩信息。比起普通的varint压缩,压缩比更高,解压速度也更快。
henshao Kingso Profile
Kingso Profile优点
简单每个doc的数据都是等长的,定位到一个doc非常快捷。要取一个宝贝的字段最多只要读两个文件。
使用编码表有效减少重复数据isearch线上一列1500w商品,profile大小为9.5GB,kingso一列3500w商品,只有12GB。cat id path一个字段就能省下2GB多。
接口清晰通过DocAccessor访问profile数据,建索引、取索引数据都是如此。
henshao Kingso Profile
传统单机build的缺点
有单点问题,以前出现过硬件问题,个别节点特别慢。
拉XML数据,建索引时间长,现在线上大约需要80分钟。
henshao Kingso Profile
Let’s talk Kbuild
单机不够酷,我们需要一些高级玩意儿!
henshao Kingso Profile
use Hadoop
新型builder为了个更好地利用Hadoop,二师兄写了个从标准输入读入xml数据,直接建索引的builder,不再产生中间文件。
水平切分merge程序将小段索引合并起来,一共有三个merge程序:index merge、profile merge和detail merge。
Hadoop streaming通过Hadoop streaming利用Hadoop分布式框架。Hadoop提供输入数据、任务调度及容错性。
使用分布式缓存通过mapred.cache.files将需要的库和可执行程序缓存起来,通过符号链接访问它们非常方便。
henshao Kingso Profile
细节情况
拉小段数据每个task要拉1.6GB*18大小的数据,7分钟多。
合并index多线程,大内存(峰值15GB),大约4分钟。
合并profile单线程,大内存(峰值19GB),大约9分钟。
高频词截断多线程,大内存(峰值28GB),大约9分钟。
推最后的索引每个task要推21GB的数据,大约6分钟。
henshao Kingso Profile
在Hadoop的真实运行情况
这些程序在单机上运行得都很Happy,上了Hadoop之后可能会这样,cpu负载非常高,内存也不够用。
henshao Kingso Profile
优化经验
mapred.map.tasks.speculative.execution=false关闭预测执行,减少data node的压力。
打tar包减少小文件的传输index索引小文件特别多,打成一个tar包可以提高传输速度。
文件不落地,减少磁盘和rm的开销hadoop fs -cat index.tar | tar xf - -C outputtar -c index | hadoop fs -put - index.tar
根据磁盘和网络使用情况合理安排任务运行get/put index和profile数据可以并行。
将detail合并独立出来detail合并和index、profile合并没有关系,可以放到一个单独的job里面做。
henshao Kingso Profile
剩下的问题
第一个Job需要起720个map,集群slot不够用。
任务对资源占用多,总有一些任务拖慢整个Job。
第二个Job要独占20个节点,需要利用内存约束来限制tasknode再运行别的任务。高级配置,不太了解。
henshao Kingso Profile
The end
Thank you!
henshao Kingso Profile