程序员的自我修养
最近需要紧急搭建Hadoop集群,以前搭建都没留下文档和记录,导致这次忙的晕头转向。现在终于搞定了,决定将全部过程记录下来,方便下次使用。
软件环境
- 操作系统:Centos 6.4
- JDK:1.6.0_27
- Hadoop:1.0.4
- HBase:0.94.17
- Zookeeper:3.4.5
前置步骤
范围:Hadoop集群所有机器
操作身份:root用户
创建Hadoop用户
1 2 | adduser hadoop passwd hadoop |
关闭SELINUX
1 | vi /etc/sysconfig/selinux |
修改:
1 | SELINUX=disabled |
简介
使用Scan的时候,可以配合各种Filter进行数据的筛选以减少返回的数据量,同样也可以通过选择特定的列族和列来减少返回的数据量。若是能将该特性进一步的优化则HBase会更强大,例如将客户端的代码分发到各个HRegionServer上执行,好比MapReduce一样的执行任务,执行完后返回的结果相信数据量会更小。HBase在0.92版本后引入了协处理器来实现该功能。
使用协处理器的好处是显而易见的,可以将运算放至Server端,减少通信开销的同时还能有效的提升性能。但同样的也会存在一些风险:由于协处理器目前还没有与主要的HBase进程隔离开来,若协处理器崩溃可能导致进程崩溃。
协处理器分类两类:Observer和Endpoint。可以分别对应成关系型数据库中的触发器和存储过程。
Observer
Observer类的协处理器在特定的事件发生时执行回调函数(也被称为钩子函数,hook),这些事件可以是用户产生的事件,也可以是服务器端产生的事件。
Observer分类以下三类:
- RegionObserver:提供客户端的数据操纵事件钩子,与表的region紧密关联
- MasterObserver:提供DDL类型的操作钩子,为集群级事件
- WALObserver:提供WAL相关操作钩子
接着上一篇HBase Filter – Dedicated Filters继续进行HBase Filter的学习和了解。Decorating Filters,装饰性过滤器,其自身不产生任何作用,需要结合其它过滤器来产生效果。
数据准备和代码准备同HBase Filter – Comparision Filters。
Decorating Filters(装饰性过滤器)
SkipFilter
SkipFilter,跳转过滤器,目前只能作用于ValueFilter。ValueFilter用于输出满足条件的行和对应的列(该行中也有1至N列满足),当加上SkipFilter后,若某行中有不满足ValueFilter的列存在,则整行都不会输出(即,只要某行中有一列不满足ValueFilter,则其它满足的列也不会输出)。
代码示例
1 2 3 4 5 6 7 | @Test public void testValueFilter() throws IOException { Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("100")); Filter f = new SkipFilter(filter); setFilterAndPrint(f); } |
输出结果为空,因为没有哪一行的所有列的值全部以100开头。
接着上一篇HBase Filter – Comparision Filters继续进行HBase Filter的学习和了解。Dedicated Filters,专用过滤器,其实现的功能大部分可以通过对Comparision Filters进行一层包装来实现。
数据准备和代码准备同HBase Filter – Comparision Filters。
Dedicated Filters(专用过滤器)
SingleColumnValueFilter
代码示例
1 2 3 4 5 6 7 8 | @Test //获取cf1:col1的值没有100子串的数据 public void testSingleColumnValueFilter() throws IOException { Filter filter = new SingleColumnValueFilter(Bytes.toBytes("cf1"), Bytes.toBytes("col1"),CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("100")); setFilterAndPrint(filter); } |
HBase的Get和Scan实例可以调用setFilter()来设置过滤器,HBase的过滤器种类繁多,以满足不同的过滤需求。Filter作用于各个RegionServer,通过使用过滤器可以高效的获取数据。HBaseFilter主要分为三大类,用户也可以通过继承FilterBase或实现Filter接口来自定义Filter。若需要多个Filter结合使用,可以通过FilterList来满足。
以下主要对各个Filter进行简单的了解。
数据准备
rowkey | cf1:col1 | cf1:col2 | cf2:col1 | cf2:col2 |
---|---|---|---|---|
101 | 10086 | qwe1 | 1352288xxxx | wer1 |
102 | 10000 | sdf2 | 1820160xxxx | ert2 |
103 | 10001 | cxv3 | 1531308xxxx | mnb3 |
104 | 12306 | jhg4 | 1387223xxxx | kji4 |
105 | 12580 | nju5 | 1580101xxxx | nbv5 |
关于HBase MapReduce
正确进行参数传递
MapReduce中传递参数必须通过configuration.set..()一系列函数来设置。如果通过属性来传递参数,那么必然会报空指针的错误。如下为经典错误示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class MRHandler { private static Integer a; private static int b; public static class MyMapper extends TableMapper<Text, IntWritable> { @Override protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException { System.out.println(a); System.out.println(b); ... } } public static void main(String[] args) throws Exception { a = 10; b = 20; ... } } |
运行的结果会是输出10和20吗?单机情况下确实如此,但是若在集群上跑,则会发现a为null,b=0。至于为什么,很简单:集群、分布式、JobTracker、TaskTracker。
善用setup()和cleanup()
- 对于需要传递的参数,最好在setup()中进行初始化,不要在map()中频繁的获取
- setup()和cleanup()也可以进行输出,输出的内容同样会经过排序,并不会因为从setup()中输出而排在最前面,也不会因为从cleanup()输出而排在最后面
连接HBase
1 2 3 4 5 6 7 8 9 10 | private HTable table; @Before public void setUp() throws IOException { Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "192.168.0.100"); conf.set("hbase.zookeeper.property.clientPort", "2181"); conf.set("mapred.task.timeout", "0"); table = new HTable(conf, "pigstore"); } |
Create
1 2 3 4 5 6 7 8 9 10 | @Test public void testPut() throws IOException { //rowKey = 100 Put put = new Put(Bytes.toBytes("100")); //添加列cf:one, 值为10101 put.add(Bytes.toBytes("cf"),Bytes.toBytes("one"),Bytes.toBytes("10101")); //添加列cf:two,值为cdf put.add(Bytes.toBytes("cf"),Bytes.toBytes("two"),Bytes.toBytes("cdf")); table.put(put); } |
进入HBase Shell,scan一下:
1 2 3 | hbase(main):003:0> scan 'pigstore' 100 column=cf:one, timestamp=1402391810630, value=10101 100 column=cf:two, timestamp=1402391810630, value=cdf |
HBase写过程
- client向region server提交写请求
- region server找到目标region
- region检查数据是否与schema一致
- 如果客户端没有指定版本,则获取当前系统时间作为数据版本
- 将更新写入WAL log
- 将更新写入Memstore
- 判断Memstore的是否需要flush为Store文件
概念视图与物理视图
BigTable论文和HBase官网上的示例
概念视图
Row Key | Time Stamp | ColumnFamily contents | ColumnFamily anchor |
---|---|---|---|
"com.cnn.www" | t1 | anchor:cnnsi.com = "CNN" | |
"com.cnn.www" | t2 | anchor:my.look.ca = "CNN.com" | |
"com.cnn.www" | t3 | contents:html = "..." | |
"com.cnn.www" | t4 | contents:html = "..." | |
"com.cnn.www" | t5 | contents:html = "..." |
物理视图
ColumnFamily anchor
Row Key | Time Stamp | Column Family anchor |
---|---|---|
"com.cnn.www" | t1 | anchor:cnnsi.com = "CNN" |
"com.cnn.www" | t2 | anchor:my.look.ca = "CNN.com" |
- 文章总数:79篇
- 评论总数:318条
- 分类总数:31个
- 标签总数:44个
- 运行时间:974天
大家好,欢迎来到selfup.cn。
这不是一个只谈技术的博客,这里记录我成长的点点滴滴,coding、riding and everthing!
- Akka (1)
- Apache Flume (1)
- Apache Hadoop (7)
- Apache HBase (8)
- Apache Hive (5)
- Apache Kafka (2)
- Apache Pig (2)
- Apache Spark (16)
- Apache Sqoop2 (1)
- Apache Storm (1)
- APNs (3)
- CDH (4)
- Java语言 (18)
- Linux (2)
- MongoDB (1)
- Python语言 (1)
- Redis (1)
- Scala语言 (4)
- Shell (1)
- Ubuntu (1)
- 前端 (1)
- 并发编程 (5)
- 战5渣 (7)
- 未分类 (2)
- 机器学习 (7)
- 杂七杂八 (3)
- 概率论与数理统计 (1)
- 算法拾遗 (2)
- 设计模式 (2)
- 随想 (2)
- 面试 (1)
- yurnom: 可能苹果最近又改变了返回值吧,最近没做测试了。 BadDeviceToken一般测试环境和正式环境弄错的情况 下会出现。
- Anonymous: 博主,良心贴啊, 最近也在弄apns推送。 有个问题想请教你一下啊。 你博客中写的 Unregistered 错误,有准确的说明吗, 我看你博客中写的:...
- 一波清泉: 回复邮箱: [email protected] 多谢
- Anonymous: 17/02/09 01:15:02 WARN Utils: Service ‘SparkUI’ could not bind on port 4040. Attempting port...
- pacificLee:
- 小码: 为什么没有后面的呢,只有前10个
- Anonymous:
- Anonymous: 楼主是属于会聊天的。 我想问,sqoop发了几个版本了,应该没这些问题了吧。
- Anonymous: Config.kafkaConfig.kafkaGroupI d 这个是指自己配置的group id 还是从 import org.apache.kafka.common.config .Config 这个类...
- Anonymous: ZkUtils.getPartitionsForTopics (zkClient, Config.kafkaConfig.topic) 那个方法是在 spark-streaming_2.10 中 kafka...
- Anonymous: ZkUtils.getPartitionsForTopics (zkClient, Config.kafkaConfig.topic) 你确定 kafka 里面有这个类 ? 个人在kafka 最新 稳定版...
- Anonymous:
- Anonymous: 很不错,试问有java版的吗?
- Anonymous: 赞
- Anonymous: 哈哈 看楼主的吐槽乐死了 where子句是可以写的 同样找不到资料 一点点试出来的 select id from xxxx where ${CONDITIONS} and 1=1 and 2=2 limit 4
- EVIL: 我在运行完C4.5的代码后,显示 defined object DecisionTreeTest 是什么意思?这是有错误吗?运行结果在哪里看?
- sf: 楼主的问题,我都遇到。。。没办法项目已经定型了,最后都硬着头 皮一个一个的改了源码
- zz: 我去,楼主你真及时,我们今天上了新的HTTP2 push之后也发现速度曲线很奇怪,开始有200k/min,跟 另一台老的推送协议速度差不多,但是过了一会,立马降到只有几k /min,百思不得其解,我们还用了一个海外代理,在...
- qi365: 很可恶,百度助纣为虐~
- qi365: :? haha~ very good~