HBase背景 HBase项目是有Powerset公司的Chad Walters和Jim Kelleman在2006年末发起的。它是根据Google的Chang等人发表的论文"Bigtable: A Distributed Storage System for Structured Data" 来设计的。2007年2月,Mike Cafarella提供代码,形成一个基本可用的系统,然后Jim Kellerman接手继续推进项目。 HBase的第一个发布版本是在2007年10月和Hadoop 0.15.0捆绑在一起发布的。2010年5月,HBase从Hadoop子项目升级成Apache顶层项目。HBase的产品用户包括Adobe,StumbleUpon,Twitter以及Yahoo的一些小组。
HBase基础 HBase是一个在HDFS上开发的面向列的分布式数据库。如果需要实时的随机读/写超大规模的数据集,就可以使用HBase这一Hadoop应用。 HBase从另一方面来解决可伸缩性的问题。它自底向上的进行构建,能够简单的通过增加节点来达到线性扩展。HBase并不是关系性数据库,它不支持SQL。但在特定的空间里,它能做RDBMS(关系型数据库管理系统)不能做的事:在廉价的硬件构成的集群上管理超大规模的稀疏表。 HBase的一个典型应用是webtable,一个以网页的URL为主键的表,其中包含爬取的页面和页面属性(例如语言和MIMIE类型)。webtable非常大,行数可以达十亿级(billion)。在webtable上连续、批处理的运行用于分析和解析的MapReduce作业,从而获取相关的统计信息,增加验证的MIME类型列,供搜索引擎进行索引解析后的文本内容。与此同时,“爬取器”(Crawler)随机的以不同的速度访问表中不同的行,更新他们的内容;再用户点击访问网站的缓存页面时,这些随机访问的页面实时提供给他们使用。
HBase概念 1. 数据模型
HBase的表是由行和列组成的。表格“单元格”(cell)--有行和列的坐标交叉决定--是有版本的。默认情况下,版本号是自动分配的,是HBase插入单元格时间的时间戳。单元格的内容是未解释的字节数组。 表中的键也是字节数组。所以理论上,任何东西都可以表示成二进制形式,然后转化为长整型的字符串或者直接对数据结构进行序列化,来作为键值。表中的行根据行的键值(也就是表的主键)进行排序。排序根据字节序进行。所有对表的访问都要通过表的主键。 行中的列分成“列簇”(column family)。所有的列簇成员有相同的前缀。列簇的前缀须由“可打印的”(printable)字符组成。而修饰性的结尾字符,即列簇修饰符,可以为任意字节。 物理上,所有的列簇成员都一起存放在文件系统中。HBase是一个面向列簇的存储器。
2. 区域 HBase自动把表水平划分成“区域”(region)。每个区域由表中行的子集构成。一开始一个表只有一个区域。但是随着区域开始变大,等超过他设定的大小,便会在某行的边界上把表分成两个大小基本相同的新分区。区域是在HBase集群分布数据的最小单位。
3. 加锁 无论对行进行访问的事务牵扯多少列,对行的更新都是“原子的”(atomic)。这使的“加锁模型”(locking model)能够保持简单。
4. HBase工作流程 HBase采用客户端、从属机(slave)和协调主控机(master)的模型,它用一个Master节点协调管理一个或多个Regionserver。HBase主控机(Master)负责启动和全新的安装、把区域分配给注册的Regionserver,恢复Regionserver的故障。Master负载很轻。Regionserver负责零个或多个区域的管理以及响应客户端的读写请求。Regionserver还负责区域的划分,并通知HBase Master有了新的子区域。 HBase依赖于ZooKeeper。默认情况下,它管理一个ZooKeeper实例,作为集群的权威。HBase负责根据目录表的位置、当前集群主控机地址类似重要的管理。如果区域的分配过程中有服务器崩溃,就通过ZooKeeper来协调管理。在ZooKeeper上管理分配事务的状态有助于在恢复时可以从崩溃服务器遗留的状态开始分配。在启动一个客户端到HBase集群的链接时,客户端必须至少拿到集群所传递的ZooKeeper整体的位置。这样,客户端才能访问ZooKeeper层次,了解集群属性,如服务器位置。 HBase通过Hadoop文件系统的API来持久化存储数据。有多种文件系统接口的实现--一种时本地文件系统接口,一种是KFS文件系统、Amazon S3以及HDFS的接口。默认情况下HBase写的是本地文件系统。
HBase安装 安装HBase系统需要java环境,所以需要先配置java。如果配置了JAVA_HOME环境变量,把它指向了正确的java安装,HBase则会使用这个java安装。否则,可以通过编辑HBase的conf/hbase-env.sh,把JAVA_HOME变量指向java安装路径,从而设置HBase所使用的java安装。 1. 获取HBase HBase现在最新版本是hbase-0.94.1,但是我安装上了,当php通过thrift通信的时候会报错,所以用的是0.92.2这个版本
[root@web-2 software]# wget http://www.fayea.com/apache-mirror/hbase/hbase-0.92.2/hbase-0.92.2.tar.gz
2. 安装HBase
[root@web-2 software]# tar zxvf hbase-0.92.2.tar.gz[root@web-2 software]# mv hbase-0.92.2 hbase
3. 启动HBase
[root@web-2 hbase]# /home/software/hbase/bin/start-hbase.sh
查看一下状态netstat -tnlp|grep java
tcp 0 0 ::ffff:127.0.0.1:45707 :::* LISTEN 2075/java tcp 0 0 :::60030 :::* LISTEN 2075/java tcp 0 0 :::2181 :::* LISTEN 2075/java tcp 0 0 ::ffff:127.0.0.1:33257 :::* LISTEN 2075/java tcp 0 0 :::60010 :::* LISTEN 2075/java
出现上面信息说明启动成功。 4. 测试HBase
[root@web-2 hbase]# /home/software/hbase/bin/hbase shell HBase Shell; enter 'help<RETURN>' for list of supported commands. Type "exit<RETURN>" to leave the HBase Shell Version 0.92.2, r1379292, Fri Aug 31 13:13:53 UTC 2012
hbase(main):001:0> list TABLE 0 row(s) in 1.1580 seconds
hbase(main):002:0> create 'test','data'0 row(s) in 0.2220 seconds
hbase(main):003:0> put 'test','row1','data:1','value1'0 row(s) in 0.1310 seconds
hbase(main):003:0> put 'test','row2','data:2','value2'0 row(s) in 0.8640 seconds
如果想要丢弃表必须先把它设为禁用。操作如下
hbase(main):002:0> disable 'test'0 row(s) in 2.3410 seconds
hbase(main):003:0> drop 'test'0 row(s) in 1.0910 seconds
到此HBase的已经检查完毕,可以正常运行,下面让我们来安装Thrift,php通信模块 1. 安装Thrift
[root@web-2 ~]# yum -y install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel [root@web-2 ~]# tar zxvf thrift-0.8.0.tar.gz [root@web-2 ~]# cd thrift-0.8.0 [root@web-2 thrift-0.8.0]# ./configure --prefix=/home/software/thrift --with-php-config=/home/software/php/bin [root@web-2 thrift-0.8.0]# make [root@web-2 thrift-0.8.0]# make install
2. 生成php和hbase的接口文件
[root@web-2 ~]# /home/software/thrift/bin/thrift --gen php /home/software/hbase/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift [root@web-2 ~]# cd gen-php/Hbase/ [root@web-2 Hbase]# ll
total 324 -rw-r--r--. 1 root root 292201 Sep 18 02:49 Hbase.php -rw-r--r--. 1 root root 33001 Sep 18 02:49 Hbase_types.php
3. 复制php需要的客户端
[root@web-2 thrift]# cp -a ~/thrift-0.8.0/lib/php thrift [root@web-2 hbaseclient]# cd thrift/src/ [root@web-2 src]# cp -a ~/gen-php ./packages [root@web-2 hbaseclient]# /home/software/hbase/bin/start-hbase.sh [root@web-2 hbaseclient]# /home/software/hbase/bin/hbase-daemon.sh start thrift [root@web-2 hbaseclient]# vi client.php <?php $GLOBALS['THRIFT_ROOT'] = '/home/hbaseclient/thrift/src'; require_once( $GLOBALS['THRIFT_ROOT'].'/Thrift.php' );< require_once( $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php' ); require_once( $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php' ); require_once( $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php' ); require_once( $GLOBALS['THRIFT_ROOT'].'/packages/Hbase/Hbase.php' ); $socket = new TSocket( 'localhost', 9090 ); $socket->setSendTimeout( 10000 ); // Ten seconds (too long for production, but this is just a demo ;) $socket->setRecvTimeout( 20000 ); // Twenty seconds $transport = new TBufferedTransport( $socket ); $protocol = new TBinaryProtocol( $transport ); $client = new HbaseClient( $protocol ); $transport->open(); echo( "listing tables...\n" ); $tables = $client->getTableNames(); sort( $tables ); foreach ( $tables as $name ) { echo( " found: {$name}\n" ); }$transport->close(); ?> [root@web-2 hbaseclient]# /home/software/php/bin/php client.php
listing tables... found: table1
HBase + thrift + php 安装完毕 (责任编辑:IT) |