RSS

Monthly Archives: July 2012

HBaseCon 2012 | Building a Large Search Platform on a Shoestring Budget

This is one topic in HBase Conference 2012. The talk is from Yapmap. In this talk, Jacques Nadeau, CTO from yapmap talked about lots of details of HBase.

This is the video link: http://www.cloudera.com/resource/hbasecon-2012-building-a-large-search-platform-on-a-shoestring-budget-video/

Abstract and Description of this talk

YapMap is a new kind of search platform that does multi-quanta search to better understand threaded discussions. This talk will cover how HBase made it possible for two self-funded guys to build a new kind of search platform. We will discuss our data model and how we use row based atomicity to manage parallel data integration problems. We’ll also talk about where we don’t use HBase and instead use a traditional SQL based infrastructure. We’ll cover the benefits of using MapReduce and HBase for index generation. Then we’ll cover our migration of some tasks from a message based queue to the Coprocessor framework as well as our future Coprocessor use cases. Finally, we’ll talk briefly about our operational experience with HBase, our hardware choices and challenges we’ve had.

He developed the talk with the following six aspects: what is Yapmap, interfacing with Data, Using Hbase as a data processing pipeline, NoSQL Schemas: Adjusting and Migrating, Index Construction, and HBase operations

1 what is YapMap?

It is a visual search technology. It is to show the threaded conversations in forums with better context and ranking. It is built on Hadoop & Hbase for massive scale. Motoyap.com is a largest implementation at 650mm automobile docs.

The motivation of the product is because the discussion forums and mailing list primary home for many hobbies. Another reason is that threaded search sucks because there is no context in the middle of the  conversation.

1.2 Conceptual data model

  • Entire Thread is MainDocGroup
  • For long threads, a single group may have multiple MainDocs
  • Each individual post is a DetailDoc

1.3 General Architecture

1.4 Match the tool to the user case

2  Interfacing with data

2.1 HBase client is a power user interface

Problems: 1) Hbase client interface is low-level, it is similar to JDBC/SQL

2) Most people start use it with Bytes.to(String…) It is called Spaghetti data layer

3) New developers have to learn benches of new concepts

4) Mistakes are easy to make

2.2 We built a DTO layer to simplify dev

1) Data Transfer Objects & data access layer provide single point for code changes and data migration

2) First-class row key object

3) Centralized type serialization: standard data types & complex object serialization layer via protobuf

4) Provide optimistic locking (It is not clear to me.)

5) Asynchronous operation

6) newer tools to ease this burden

2.3 Examples for the DTO data model and the primary key design

3 Using HBase as a data processing pipeline

3.1 Processing pipeline is built on HBase

3.2 Migrating from messaging to coprocessors

Big challenges: 1) mixing the system code and application code ; 2)memory impact: We have a GC stable state

4 NoSQL Schemas: Adjusting and Migrating

4.1 Learn to leverage NoSQL strenghths 

This part is to describe how they change the data schema in NoSQL database

4.2 Schema Migration Steps

As they have to migrate the data from schema1 to schema2, they need to migrate the data

5 Index Construction

5.1 Index Shards loosely based on HBase Regions

1) Indexing is split between major (batch) indices and minor (real time)

2) Primary key order is same as index order

3) Shards are based on snapshots of splits

4) IndexedTableSplit allows cross-region shard splits to be integrated at index load time

5.2 Batch Indices are memory based, stored on DFS  

1) Total of all shards about 1TB

2) Each shard about 5GB in size to improve parallelism on search

3) Each shard is composed of multiple map and reduce parts and MapRd statistics from HBase

6 HBase Operation

1) Getting GC right

2) Region size right

3) Cautious about multiple Column Familiies

4) Consider Asynchbase client

5) Upgrade of HBase

6) MapR’s M3 distribution of Hadoop

6 Questions

1) why not lucence/solr/elasticSearch/etc

2) Why not store indices directly in HBase?

3) Why use Riak for presentation side?

4) Why did you switch to MapR?

Conclusion:

What I learnt: 1) what most interests me is the NoSQL schema adusting and migration and the index construction. 2) I learnt about the Hbase operation, new tools for data layer access (kundera and Gora)

Still questions: I still don’t quite understand why not store the indices directly in HBase.

Advertisements
 
Leave a comment

Posted by on July 31, 2012 in Cloud Computing

 

Tags:

HBase Architecture 101 – Storage – HBase 架构图101 存储

翻译http://www.larsgeorge.com/2009/10/hbase-architecture-101-storage.html

在HBase众多底层的方面中,其中一个就是数据如何存储的。然后大多数的用户可能不需要去关心。当你想学习这些各式各样的高级配置时,你只需要熟悉了解新项目的详细情况。 一旦你通过了搭建一个基本的系统的学习的阶段, 像“我如何根据我的需要来调整HBase?”, 和类似于这种问题肯定会引起你的兴趣。 另一个想了解更多的原因是在不知道什么原因下灾难到来而你需要恢复HBase的安装。

在我想知道控制各种文件的不同的类时,我画了一幅图来表述Hbase存储架构。但是,由于HBase提交者们很简单的穿梭于这个迷宫当中,我发现想保持一个一直的图是比较困难的。

下面是详细的HBase architecture解说了。

基本上,Hbase有两种文件类型。一个用来write-ahead log,另一个是真正的数据存储。文件主要被HRegionServer来控制。 但是在特定的情况下,Hmaster也得处理底层文件的操作。实际上,在被存储到HDFS中的时候,真实的文件被分成小的block。这个也是一个你可以配置系统来处理更好地较大或者较小的数据的地方。这个后面详细解释。

基本流程是:首先客户端连接zookeeper quorum(一个独立的zookeeper cluster node)找到一个特定的row key。这个为了通过从zookeeper来获得拥有-ROOT- 服务器的名字。基于这个信息,client可以查询那个服务器来得到拥有.META.表的服务器。这两个信息被cached,并且只查询一次。最后,client可以查询拥有.META表的server来获得拥有client端要查询的数据的server。

一旦client知道数据在哪里,例如:在哪个region上,它就会cache这个信息,并且直接连接拥有那个region的HRegionServer。 因此, 随着时间的过去,client就会知道从哪里去获得rows而不用再去查询.META.

注意:在HBase启动时,HMaster是负责分配region给HRegionServer的。这个也包括‘特别的’ -ROOT-和.META.

接下来,HRegionServer打开region,创建一个相应的HRegion对象。 当HRegion是’opened’状态,它就会为每一个表里面的HColumnFamily建立一个‘Store’ 实例。每一个store实例都会轮流的拥有一个或者多个StoreFile 实例。StoreFile实例是一个轻量级的HFile的包装。一个HRegion还有一个MemStore和一个HLog 实例。

Stay Put

数据是如何被真正地存储的呢?Client发送一个HTable.put 请求到存储中详细的HRegion matching信息的HRegionServer。 第一步就是决定数据是否应该先写到Write-ahead-log (WAL)中去。这个决定是取决于client端是否用了Put.writeToWAL(boolean)。 WAL是一个标准的Hadoop的SequenceFile,它存储着HLogKey。 这些key包含顺序的标号和真实的数据,它们可以用来replay那些在server crash后没有被persistent的数据。

数据一旦写入或者没有写入WAL,WAL被替换成了memstore.同时,需要检查MemStore是不是满了,如果满了,disk需要flush。如果flush请求被HRegionServer的一个单独的线程接受,它就会将数据写入HFile中,并存入HDFS。它同时也保存最后一个被写入的序列号,这样系统可以知道哪些已经被persitented了。

Files

Hbase在HDFS里面有一个可以配置的根目录,默认情况下是/hbase。 你可以使用DFS的工具来查看这些HBase stores。

/hbase/.logs 是HLog来处理的。 这个有一个子目录来对应每一个HRegionServer

oldlogfile.log 这个是在有exception的时候才会创建的文件。他们是“log split”的产物。当HMaster 启动后发现这个有log file没有被任何一个HRegionServer处理,它就会split这个log并拷贝HLogkeys到新的regions里面去。它们被直接放到region的目录下面并叫做“oldlogfile.log”。 当相应的HRegion被实例化,它就会读取这些文件,并且插入这些包含的文件到local Memstore,并启动flush来持久化这些数据并将这些文件删除。

注意:有时候你会发现又剩下的文件oldlogfile.log.old(后面多了一个old)。这个是因为HMaster多次尝试split 这个log,但是发现有另一个split log在其他的地方。在这个时候,你得看一下HRegionServer或者HMaster的log来看一下在做什么,看你是否能够删除这些文件。我偶尔发现它们是空的,因此可以安全删除。

下一组文件就是真正的regions了。每一个region名字都是使用Jenkins Hash来编码,并且有一个目录与它相对应。Hash这些region的名字的原因是他可能包含一些不能在DFS中用于path的名字。Jenkins Hash总是会返回合法的字符,并且很简单。因此你将会得到的路径:

/hbase/<tablename>/<encoded-regionname>/column-family/filename

在region的根目录下,这个也有一个.regioninfo来保存region的meta data。这个是用来重新构建破坏了的.META.表的。

在每一个column-family目录下,你能够看到真实的文件。这个会在后面详细说明。

没有提及的有拥有初始的孩子参考文件的split regions。当region里面的数据文件增长到大于配置的hbase.hregion.max.filesize时候,region就要分成两个。这个在最开始的时候很快,因为系统只是简单的创建两个refereced文件在新的region里面。这两个region分别host一半的数据。reference文件的名字是带有hosted region name作为前缀的ID。这个refereence文件只是拥有一点信息:原始的region分开的key和是不是top或者bottom 引用。重点的是这些references后来被HalfHFileReader 类用来读取原始region的数据文件。只有当compaction,原始的文件才会被重新写到新的region目录的另一个文件里面。这同时也去掉了小的reference文件和原始的文件。

这里,这个也总结了文件dump。 最后一个是看到的在每一个table目录下的compaction.dir。它们在splitting和compacting region的时候被用到。它们通常是空的,而且是被用来在交换新的数据时的一个staging 环境。

HFile

这是HBase的很低的一个level了。HFile是真正的存储文件。只是为了一个目的:快速有效地存储hbase数据。它们显然是基于Hadoop的TFile,同时模仿Google的BigTable构架的SSTable格式。之前对Hadoop MapFile在Hbase的使用没有得到很好地performance。现在看一下files的表现吧。

文件时不定长的,仅有的特定的block是FileInfo 和Trailer 块。就是这个Trailer拥有pointer到其他的block,它被写在持久化数据的后面,同时结束一个不可改变的data store。Index的block记录数据和meta block的偏移量。数据和Meta blocks实际上是可选的。但是很大可能你将在data store 文件中寻找数据。

block的大小是怎么配置的呢?它单独的被HcolumnDescriptor控制。它是轮流地在表创建的时候被指定的。

Block size 默认是:64KB。在javadoc中的解释:

“我们推荐最小的blocksize的设置在8KB到1MB之间。大的block有助于顺序访问,但是不利于random访问(因为许多的数据需要解压)。小block利于random访问,但是需要更多地内存来hold这些block index,而且可能会更慢的创建(因为我们必须在block的结尾来flush 压缩流,这个会导致文件系统的I/Oflush)。而且,鉴于压缩编码器的内部的caching,最小的block的大小可能在20KB-30KB。”

因此, 每个拥有前缀的block或者是plain的或者是被压缩过的数据。这又会怎么样呢?下面讲一下。

有一件事情可能你已经发现:Hadoop默认的block size是64MB,10倍的HBase里面的HFile。因此,看来它们并不match。因此,你需要分开来想这两个参数,并找到一个好的配置点来达到好的performance。

Hbase配置中的一个配置项:hfile.min.blocksize.size.它似乎只是在从之前的Hbase中migration时被用到。

问题:我们如何知道HFile是好还是不好?如何知道它到底存储了哪些数据呢?这里有个应用。

hbase org.apache.hadoop.hbase.io.hfile.HFile -v -p -m -f \

KeyValue’s

基本上,每一个HFile中的keyvalue都是一个简单的低层的byte 数组,它允许零拷贝的去访问数据。他们是怎么被组织的呢?

开始是两个固定长度的数字,它们表明了key和value的大小。 基于这个信息,你可以offset到数组中来直接访问数据。如果你知道你在做什么,就可以直接忽略key,如果不知道,那么需要从key里面得到需要的信息。一旦得到了keyvalue的对象,你可以通过getter来访问细节的东西。

注意:一件事情需要小心是:keyvalue.getkey()和keyvalue.getrow()的不同。前者是得到所有的关于row key,column,timestamp。而后者才是只得到rowkey,然后通过它得到整个row的信息。这个有点confused。

到此为止,翻译完毕。许多的意思不是很通顺,还需要update。

 
Leave a comment

Posted by on July 30, 2012 in HBase

 

Tags:

Some useful shell commands

Get the CPU Usage: top -b -d1 -n1|grep -i “Cpu(s)”

top -b -d1 -n1|grep -i “Cpu(s)”|cut -d’:’ -f2 |awk -F’,’ ‘{print $1 $2,$4}’

Result:  ===0.0%us  0.0%sy 100.0%id

Get the Memory Usage: top -b -d1 -n1|grep -i “Mem:”| cut -d’:’ -f2

Result: ===33013712k total,  1131848k used, 31881864k free,   163056k buffers

If you want to remove the last letter from one line

top -b -d1 -n1|grep -i “Mem:”| cut -d’:’ -f2 | awk -F’,’ ‘{print $1}’|awk -F’ ‘ ‘{print $1}’ |sed -e ‘s/k//’

******************All scripts*************************************************************

Collect the CPU and memory usage and save them into a csv file

#!/bin/bash

for((; ;)) do
NOW=$(date +”%m-%d-%y-%T”)
timestamp=$(date +”%m-%d-%y”)
cpu_file=”cpu.usage.$timestamp”
mem_file=”mem.usage.$timestamp”
#top -b -d1 -n1|grep -i “Cpu(s)”|cut -d’:’ -f2 |awk -F’,’ ‘{print $1}’ | awk -F’%’ ‘{print $1}’
cpu_usage=` top -b -d1 -n1|grep -i “Cpu(s)”|cut -d’:’ -f2 `
usr_cpu=`echo $cpu_usage | awk -F’,’ ‘{print $1}’ | awk -F’%’ ‘{print $1}’`
sys_cpu=`echo $cpu_usage | awk -F’,’ ‘{print $2}’ | awk -F’%’ ‘{print $1}’`
idl_cpu=`echo $cpu_usage | awk -F’,’ ‘{print $4}’ | awk -F’%’ ‘{print $1}’`
echo “$NOW $usr_cpu $sys_cpu $idl_cpu” >> $cpu_file

# memory usage top -b -d1 -n1|grep -i “Mem:”| cut -d’:’ -f2 | awk -F’,’ ‘{print $1}’|awk -F’ ‘ ‘{print $1}’
mem_usage=`top -b -d1 -n1|grep -i “Mem:”| cut -d’:’ -f2`
total_mem=`echo $mem_usage| awk -F’,’ ‘{print $1}’|awk -F’ ‘ ‘{print $1}’`
used_mem=`echo $mem_usage| awk -F’,’ ‘{print $2}’|awk -F’ ‘ ‘{print $1}’ |sed -e ‘s/k//’`
free_mem=`echo $mem_usage| awk -F’,’ ‘{print $3}’|awk -F’ ‘ ‘{print $1}’ |sed -e ‘s/k//’`
buffer_mem=`echo $mem_usage| awk -F’,’ ‘{print $4}’|awk -F’ ‘ ‘{print $1}’ |sed -e ‘s/k//’`
echo “$NOW $total_mem $used_mem $free_mem $buffer_mem”>> $mem_file

sleep 5
done

 
Leave a comment

Posted by on July 20, 2012 in Uncategorized

 

Several interesting things happening in my time line

I realized that I have to record something happened during my life. I don’t want to pay attention to the grammar, and I am going to make it as free writing.

1 2012-07-17 I achieved the first step during the phase of swimming learning that I can move forward. It tells me that any miracle can happen if you insist in it.

2 2012-07-18 I am going to attend “Startup Hackton” in this weekend. But now, I am nervous. I am always nervous if I think I have not prepared well and if I don’t have 200% confidence in it.  

 
Leave a comment

Posted by on July 18, 2012 in Life

 

建立完美的内心世界 – Build Oneself Perfect Inner World

每一件我写在这里的事情,我都是下定决心改正的。成功的秘诀就在于每天淘汰自己。

1 我觉得自己开始有点懒惰了,这个倾向不知道从什么时候有的。我自认为在上学的时候没有发现。工作了三年,也没敢怠慢。反思一下,我没有培养出自己好的工作习惯。我需要从现在开始培养自己的工作习惯,总是凭心情做事,或者受心情影响是很不明智的,而且是很致命的。明显感觉现在就是把事情向后推。今日事,今日毕!我必须做到!

2 我又发现了我的一个缺点,就是追求更多,不知道适可而止。有时候,追求的很多就会让你功亏于匮。对于有风险的事情,不能贪多,不能没有止境。要给自己设置一个下限和一个上限。做什么事情都不会太完美,因此,要知道在什么时候就需要停先来,积蓄能量,然后再战,不能打持久战术,任何事情都应该是这样的。建立完美的内心世界需要你知道什么时候需要停下来,什么时候需要奋不顾身的前行。做到恰到好处是一件很难的事情,但是我相信,你一定可以做到,而且也必须要做到。

3 有时候觉得自己可以做,而且能够做得很快,从而表现出不以为然的样子,这是一种很不成熟的表现。在回答任何问题之前,需要思考一下,可不可行,能不能做,真正需要花的时间+一个思考的时间+准备时间。尽管你觉得自己可以很快的做完,也需要正确的面对那个问题。不能轻视,更不能表现出轻视的感觉。人需要在回应别人的问题的时候表现得成熟!

4 我一直都有一个不解的问题:我不知道如何做才可以做到“不是炫耀,而是在表述你自己的成果,是在让别人了解你。” 有些事情写在社交网络上,譬如你荣获了一个奖。写在上面,有人就会想“这个人怎么这么招摇?” 但其实你不是那种人,或者你本意不想招摇的。但是,如果你什么都不写,那么社交网络上的朋友如何才能了解你?朋友不了解你,就失去了社交网络的意义。朋友不了解你,就不会主动找到你来做什么事情,或者提供工作机会。所以,如何使用社交网络,或者说如果去宣传自己,我其实有一个矛盾在心里。同时,我渴望想通这件事情。

5 今天发现的一个问题是:我在对方说完一个观点的时候就很直接说出不同意的地方。不知道我是为什么,反正第一反应永远都是她/他说的不一定对。well,你可以说这是一种怀疑精神,但是这是一种类似于反抗的表现。不知道我是想显示自己knowledgeable呢,还是想显示自己可以看出什么东西。有些时候我很确定对方说的确实是有漏洞的,但是其实有些时候我本身对某些事情不是很确定,也会有所反应。这就是今天发现的自己的一个缺点。这个必须改!

 
Leave a comment

Posted by on July 18, 2012 in Life