hello world!!!!!

写下自己的一些心得,写下自己问题的方式,写下程序之路的艰辛,希望能够有朝一日成为大牛。
posts - 87, comments - 8, trackbacks - 0, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

2012年1月10日

一:zookeeper如何分配region的问题

二:hive 在hbase里存储的mapreduce过程

三:hbase存储结构(不同数据类型)

四:数据的牵移与备份

posted @ 2012-01-10 20:27 陈力 阅读(42) 评论(0) 编辑

转载于:http://www.javabloger.com/article/apache-hadoop-hive-hbase-integration.html

 

Hive入门3–Hive与HBase的整合
Apache Hive入门2
Apache Hive入门1

开场白:
Hive与HBase的整合功能的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive_hbase-handler.jar工具类 (Hive Storage Handlers), 大致意思如图所示:
hive-hbase

口水:
 对 hive_hbase-handler.jar 这个东东还有点兴趣,有空来磋磨一下。

一、2个注意事项:
1、需要的软件有 Hadoop、Hive、Hbase、Zookeeper,Hive与HBase的整合对Hive的版本有要求,所以不要下载.0.6.0以前的老版本,Hive.0.6.0的版本才支持与HBase对接,因此在Hive的lib目录下可以看见多了hive_hbase-handler.jar这个jar包,他是Hive扩展存储的Handler ,HBase 建议使用 0.20.6的版本,这次我没有启动HDFS的集群环境,本次所有测试环境都在一台机器上。
    
2、运行Hive时,也许会出现如下错误,表示你的JVM分配的空间不够,错误信息如下:
Invalid maximum heap size: -Xmx4096m
The specified size exceeds the maximum representable size.
Could not create the Java virtual machine.

解决方法:
/work/hive/bin/ext# vim util/execHiveCmd.sh 文件中第33行
修改,
HADOOP_HEAPSIZE=4096

HADOOP_HEAPSIZE=256

另外,在 /etc/profile/ 加入 export $HIVE_HOME=/work/hive

二、启动运行环境
1启动Hive
hive –auxpath /work/hive/lib/hive_hbase-handler.jar,/work/hive/lib/hbase-0.20.3.jar,/work/hive/lib/zookeeper-3.2.2.jar -hiveconf hbase.master=127.0.0.1:60000
加载 Hive需要的工具类,并且指向HBase的master服务器地址,我的HBase master服务器和Hive运行在同一台机器,所以我指向本地。

2启动HBase
/work/hbase/bin/hbase master start

3启动Zookeeper
/work/zookeeper/bin/zkServer.sh start

三、执行
在Hive中创建一张表,相互关联的表
CREATE TABLE hbase_table_1(key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") TBLPROPERTIES ("hbase.table.name" = "xyz");

在运行一个在Hive中建表语句,并且将数据导入
建表
    CREATE TABLE pokes (foo INT, bar STRING);
数据导入
    LOAD DATA LOCAL INPATH '/work/hive/examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

在Hive与HBase关联的表中 插入一条数据
    INSERT OVERWRITE TABLE hbase_table_1 SELECT * FROM pokes WHERE foo=98;
运行成功后,如图所示:
hive

插入数据时采用了MapReduce的策略算法,并且同时向HBase写入,如图所示:
Map-Reduce Job for INSERT

在HBase shell中运行 scan 'xyz' 和describe "xyz" 命令,查看表结构,运行结果如图所示:
hive

xyz是通过Hive在Hbase中创建的表,刚刚在Hive的建表语句中指定了映射的属性 "hbase.columns.mapping" = ":key,cf1:val"  和 在HBase中建表的名称 "hbase.table.name" = "xyz"

在hbase在运行put命令,插入一条记录
    put 'xyz','10001','cf1:val','www.javabloger.com'

在hive上运行查询语句,看看刚刚在hbase中插入的数据有没有同步过来,
    select * from hbase_table_1 WHERE key=10001;
如图所示:
hive

最终的效果
    以上整合过程和操作步骤已经执行完毕,现在Hive中添加记录HBase中有记录添加,同样你在HBase中添加记录Hive中也会添加, 表示Hive与HBase整合成功,对海量级别的数据我们是不是可以在HBase写入,在Hive中查询 喃?因为HBase 不支持复杂的查询,但是HBase可以作为基于 key 获取一行或多行数据,或者扫描数据区间,以及过滤操作。而复杂的查询可以让Hive来完成,一个作为存储的入口(HBase),一个作为查询的入口(Hive)。如下图示。
    hive mapreduce
    
    呵呵,见笑了,以上只是我面片的观点。

先这样,稍后我将继续更新,感谢你的阅读

posted @ 2012-01-10 17:16 陈力 阅读(41) 评论(0) 编辑

转载 http://www.javabloger.com/article/hadoop-mapreduce-hbase.html

 

我的废话:
本文提供代码示例,但是不讲述mapreduce对HBase代码层面的细节,主要讲述我片面的理解和体会。

最近看见Medialets(Ref)在网站架构中提到对MapReduce使用的经验分享,采用HDFS作为MapReduce分布式计算的基础环境,基于Python的MapReduce框架计算具体的内容,将计算的结果写入MongoDB中存储,对外宣称每秒1可以处理百万级的业务事件,可见MapReduce的运用场景在越来越多的丰富起来,说明除了Google和Yahoo这样的超大型互联网公司以外,更多的中小门户都对MapReduce和Hadoop开始产生兴趣,使用Hadoop的Mapreduce分布式计算的场景将和我们越来越近。

Hadoop Map/Reduce的框架的确简单易懂,基于他开发的应用程序能够运行在上千个机器组成的大型集群上,或者说MapReduce是一种“蛮力”计算,在一定程度上机器数量越多,得到的效果越显著,而且MapReduce提供了一种可靠容错的方式可并行处理上T级别的数据集。
在现实场景中执行一个Map/Reduce作业(job)会把Input的数据分为多个数据块(就像下面图中左边的黄色小块),MapperTask以分布式并行的方式处理这些输入的数据。mapreduce框架会对map的输出先排序, 再map把计算结果输入给reduce最终对计算结果合并输出。
hadoop-hbase

集群环境中的mapreduce计算节点失效转发、 分布式存储,工作调度,容错处理,网络通信,负载均衡 等问题不用开发者去考虑,MapReduce框架和MapReduce运行环境早就为此做出的考虑,如下图所示 在集群环境中有一个master负责调度构成一个作业的所有任务,大量的任务存在master的Task Queue里面,将这些任务分配在不同的slave上,master监控它们的执行 如果任务执行失败,由master指派slave(work)重新执行任务,如图所示:
hadoop-task

通常作业的输入和输出都会被存储在文件系统HDFS中,也就是说,通常MapReduce框架和分布式文件系统是运行在一组相同的节点上的,允许在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。MapReduce框架由一个单独的JobTracker(master)和很多个TaskTracker(slave)集群节点一个共同组成。

在MapReduce客户端的代码需要指明输入/输出的位置(文件路径/DB/NOSQL),客户端再加上作业的参数,就构成了作业配置(job configuration),客户端代码需要定义map和reduce方法通过实现合适的抽象类,并在实现的方法中编写你的业务逻辑,在客户端程序中还要定义你的map/reduce输入和输出的类型,当Hadoop的 job client提交作业(jar包/class/可执行程序等)和配置信息给JobTracker,后者负责分发这些软件和配置信息给slave、调度任务并监控它们的执行,同时提供状态和诊断信息给job-client。至于客户端job提交后的工作流程就是hadoop的事情了,分为4个过程,输入| 切分、排序、洗牌,合并 | 输出 ,输出的结果是有序的,因为mapreduce框架是天然排序的。如图所示:
hadoop

MapReduce把数据集的操作分散到网络节点上,每个节点会周期性的把执行状态报告回,当某个节点连接或者计算超时达到一定次数,主节点记录下这个节点状态为死亡状态,并且分配给这个节点的任务发到别的节点上运行,例如Apache的Hive就是一个MapReduce框架的实现,Hive可以将SQL语句转换为 MapReduce任务把执行的SQL分散到每台机器上运行,最后返回计算结果。

我写了一个代码示例,这个示例通过mapreduce框架从文件夹中读取数据,进过格式化、对内容的加工,再写入HBase的的程序。当输入后根据输入的条件和状态产生多个Mapper(maptask)处理输入的内容,mapper先是从目录中读取所有文件信息,然后加工进行格式化,这一切都处理完成之后,将计算的结果交给Reducer去执行,Reducer根据客户端定义的输入类型做出对应的操作,将最终的结果存入HBase中。

示例例说明:
有一个 input  的输入目录,里面有3个文件 1.txt/2.txt/3.txt,需要在HBase中建立一张 tab1表,f1 是列名称,然后运行代码示例,最后在Hbase查看到3个txt中的数据全部写入hbase中。运行的过程中可以在eclipse的控制台上看见,先读取/格式化数据,最后写入hbase中的效果,如图所示:
hadoop-hbase

Reduce的计算结果,如图:
http://mlqgow.bay.livefilestore.com/y1pPT7XKNAdmNWwJiFBWiGlFVRlEgk59NRXi8U8elxJO3wDjZrKFKiWSDO4gMpMN60fh_tfJ-LjdOMP_5ynngzwM-s1Jh8mWVo-/hbase-mapreduce-2.png?psid=1

代码示例下载地址:http://javabloger-mini-books.googlecode.com/files/txt-to-hbase.rar

通过这个例子可以假定一种场景,例如百度文库,每时每刻都有成千上万的人向百度的服务器上传文件,需要做到在最短的时间内对不同格式的文档进行处理、格式化,最终保存起来。前端服务器拿到用户上传的文档后,就像这个例子中x:\input下的3个文件,对于百度文库的运行场景来说也许是3w个,将大量的文档全部扔给mapreduce,mapreduce把需要解析、排版、格式化的文档交给每个分布的hadoop节点,将计算压力分布在多个CPU上进行计算,因为多人力量大的原因很快将能把3w个文档处理完毕,并且保存数据库/NOSQL,用户可以立刻在线阅读到刚刚上传的文档。

离线的场景中通过mapreduce写入HBase还可以采用另外一种方式,先将文档扔给mapreduce,然后通过HFileOutputFormat输出HBase的数据文件,最后通过Hbase 工具将数据文件导入到HBase中,对于海量数据的迁移可以考虑这样的方式,在这种方案的基础上HBase官方提供了importtsv 工具 可以参考HBase的官方文档(Ref)。

我的废话:
最近有一个项目需要对 国内最大的网络设备供应商  提供方案实施,该项目主要针对android平台上的联系人功能进行扩展,比如2个客户端都安装这个联系人软件可以发送免费短信,类似现在的飞信、kiki,该产品还会向中国以外的市场推广,一旦二期上线用户的数量级将达到上千万,很可能产生大量的离线消息,打算采用HBase对用户的离线消息进行存储,在这点上不折不扣的向FaceBook学习了一把。

 

posted @ 2012-01-10 17:10 陈力 阅读(119) 评论(0) 编辑

 


 



1. database replication, log replication等, 如bdb的数据复制就是使用paxos兼容的算法。Paxos最大的用途就是保持多个节点数据的一致性。

2. naming service, 如大型系统内部通常存在多个接口服务相互调用。
1) 通常的实现是将服务的ip/hostname写死在配置中,当service发生故障时候,通过手工更改配置文件或者修改DNS指向的方法来解决。缺点是可维护性差,内部的单元越多,故障率越大。
2) LVS双机冗余的方式,缺点是所有单元需要双倍的资源投入。
通过Paxos算法来管理所有的naming服务,则可保证high available分配可用的service给client。象ZooKeeper还提供watch功能,即watch的对象发生了改变会自动发notification, 这样所有的client就可以使用一致的,高可用的接口。

3.config配置管理
1) 通常手工修改配置文件的方法,这样容易出错,也需要人工干预才能生效,所以节点的状态无法同时达到一致。
2) 大规模的应用都会实现自己的配置服务,比如用http web服务来实现配置中心化。它的缺点是更新后所有client无法立即得知,各节点加载的顺序无法保证,造成系统中的配置不是同一状态。

4.membership用户角色/access control list, 比如在权限设置中,用户一旦设置某项权限比如由管理员变成普通身份,这时应在所有的服务器上所有远程CDN立即生效,否则就会导致不能接受的后果。

5. 号码分配。通常简单的解决方法是用数据库自增ID, 这导致数据库切分困难,或程序生成GUID, 这通常导致ID过长。更优雅的做法是利用paxos算法在多台replicas之间选择一个作为master, 通过master来分配号码。当master发生故障时,再用paxos选择另外一个master。

posted @ 2012-01-10 15:48 陈力 阅读(20) 评论(0) 编辑

posted @ 2012-01-10 11:39 陈力 阅读(79) 评论(0) 编辑