kingso profile

24
Kingso Profile henshao October 28, 2011 henshao Kingso Profile

Upload: fuzhjie

Post on 11-Jul-2015

1.559 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Kingso profile

Kingso Profile

henshao

October 28, 2011

henshao Kingso Profile

Page 2: Kingso profile

Agenda

What is Profile?

How to build Profile?

Let’s talk Kbuild

henshao Kingso Profile

Page 3: Kingso profile

Agenda

What is Profile?

How to build Profile?

Let’s talk Kbuild

henshao Kingso Profile

Page 4: Kingso profile

Agenda

What is Profile?

How to build Profile?

Let’s talk Kbuild

henshao Kingso Profile

Page 5: Kingso profile

Agenda

What is Profile?

How to build Profile?

Let’s talk Kbuild

henshao Kingso Profile

Page 6: Kingso profile

基本概念

group

segment

encode

henshao Kingso Profile

Page 7: Kingso profile

基本概念

group

segment

encode

henshao Kingso Profile

Page 8: Kingso profile

基本概念

group

segment

encode

henshao Kingso Profile

Page 9: 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

Page 10: 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

Page 11: Kingso profile

encode

对于宝贝中重复度比较高的字段,比如provcity,可以配置到编码表中;另外,变长字段必须保存在编码表中。

由于一些巨型字段(mlr feature和prop vid)的原因,编码表和group的大小各占6GB左右。

$ ls | grep encodecat id path.encode idxcat id path.encode cnt

henshao Kingso Profile

Page 12: Kingso profile

一图顶万言

henshao Kingso Profile

Page 13: Kingso profile

How to build Profile?

第一个过程: 解释xml,生成类似v3格式的中间文件,每一行是一个宝贝的正排数据。

第二个过程:读取每一行,将字段转变成二进制格式保存到segment中;如果需要编码的话,则将数据保存到编码表中,segment中只保存一个offset。

henshao Kingso Profile

Page 14: Kingso profile

Profile相关类图

Page 15: Kingso profile

一些高级玩意儿

bitrecord小于32 bits的字段可以组合起来,这样profile能小一点点。它们要对齐到32。

group varint将4个int32 t等类型一起压缩,利用1 byte保存压缩信息。比起普通的varint压缩,压缩比更高,解压速度也更快。

henshao Kingso Profile

Page 16: Kingso profile

Kingso Profile优点

简单每个doc的数据都是等长的,定位到一个doc非常快捷。要取一个宝贝的字段最多只要读两个文件。

使用编码表有效减少重复数据isearch线上一列1500w商品,profile大小为9.5GB,kingso一列3500w商品,只有12GB。cat id path一个字段就能省下2GB多。

接口清晰通过DocAccessor访问profile数据,建索引、取索引数据都是如此。

henshao Kingso Profile

Page 17: Kingso profile

传统单机build的缺点

有单点问题,以前出现过硬件问题,个别节点特别慢。

拉XML数据,建索引时间长,现在线上大约需要80分钟。

henshao Kingso Profile

Page 18: Kingso profile

Let’s talk Kbuild

单机不够酷,我们需要一些高级玩意儿!

henshao Kingso Profile

Page 19: 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

Page 20: Kingso profile

细节情况

拉小段数据每个task要拉1.6GB*18大小的数据,7分钟多。

合并index多线程,大内存(峰值15GB),大约4分钟。

合并profile单线程,大内存(峰值19GB),大约9分钟。

高频词截断多线程,大内存(峰值28GB),大约9分钟。

推最后的索引每个task要推21GB的数据,大约6分钟。

henshao Kingso Profile

Page 21: Kingso profile

在Hadoop的真实运行情况

这些程序在单机上运行得都很Happy,上了Hadoop之后可能会这样,cpu负载非常高,内存也不够用。

henshao Kingso Profile

Page 22: 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

Page 23: Kingso profile

剩下的问题

第一个Job需要起720个map,集群slot不够用。

任务对资源占用多,总有一些任务拖慢整个Job。

第二个Job要独占20个节点,需要利用内存约束来限制tasknode再运行别的任务。高级配置,不太了解。

henshao Kingso Profile

Page 24: Kingso profile

The end

Thank you!

henshao Kingso Profile