首先hadoop是支持并发的Mapper的,所以hbase没有道理不实现并发的Mapper,这个类是org.apache.hadoop.hbase.mapreduce.MultithreadedTableMapper.
该类简单理解就是重写了Mapper的run方法
/**
* Run the application's maps using a thread pool.
*/
@Override
public void run(Context context) throws IOException, InterruptedException {
outer = context;
int numberOfThreads = getNumberOfThreads(context);
mapClass = getMapperClass(context);
if (LOG.isDebugEnabled()) {
LOG.debug("Configuring multithread runner to use " + numberOfThreads +
" threads");
}
executor = Executors.newFixedThreadPool(numberOfThreads);
for(int i=0; i < numberOfThreads; ++i) {
MapRunner thread = new MapRunner(context);
executor.execute(thread);
}
executor.shutdown();
while (!executor.isTerminated()) {
// wait till all the threads are done
Thread.sleep(1000);
}
}
以上是源代码,引自hbase-0.94.1
同时,该类内部还实现了一个private的class MapRunner,该MapRunner持有一个mapper变量,而这个mapper就是我们要执行的mapper,而这个mapper是怎么设置进去的呢?
/**
* Set the application's mapper class.
* @param <K2> the map output key type
* @param <V2> the map output value type
* @param job the job to modify
* @param cls the class to use as the mapper
*/
public static <K2,V2>
void setMapperClass(Job job,
Class<? extends Mapper<ImmutableBytesWritable, Result,K2,V2>> cls) {
if (MultithreadedTableMapper.class.isAssignableFrom(cls)) {
throw new IllegalArgumentException("Can't have recursive " +
"MultithreadedTableMapper instances.");
}
job.getConfiguration().setClass(MAPPER_CLASS,
cls, Mapper.class);
}
以上是源代码,引自hbase-0.94.1
可以看出,我们要实现并发的Mapper类一定不能是MultithreadedTableMapper 的子类(本人在试验的时候就因为继承了MultithreadedTableMapper 而抛出异常),通过在提交任务之前调用此静态方法,就可以设定我们真实的Mapper类。
同时
/**
* Set the number of threads in the pool for running maps.
* @param job the job to modify
* @param threads the new number of threads
*/
public static void setNumberOfThreads(Job job, int threads) {
job.getConfiguration().setInt(NUMBER_OF_THREADS,
threads);
}
我们还可以调用该方法来设置并发线程的数目,默认的并发数目是10。
此外还要注意,我们使用TableMapReduceUtil来initTableMapperJob中的Mapper class必须是MultithreadedTableMapper。
最后,该类其实还实现了一些其它的内部类和方法来辅助数据的一致性,有兴趣的朋友可以自己看源代码,我这里只抛一个砖。
分享到:
相关推荐
Hbase学习总结.rar
本文首先简单介绍了HBase,然后重点讲述了HBase的高并发和实时处理数据 、HBase数据模型、HBase物理存储、HBase系统架构,HBase调优、HBase Shell访问等。
HBase开发实战,HBase学习利器:HBase实战
本文首先简单介绍了HBase,然后重点讲述了HBase的高并发和实时处理数据 、HBase数据模型、HBase物理存储、HBase系统架构,HBase调优、HBase Shell访问等。
这是 Apache HBase的官方文档, Hbase是一个分布式,,版本化(versioned),构建在 Apache Hadoop和 Apache ZooKeeper上的列数据库.
hbase 学习 hbase原理 hbase资料 ,呕心沥血整理的。很实用,不适用可拍砖。。
比较详细的HBase学习笔记,精心制作 HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》。HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其...
个人笔记整理(带目录),共8个章节:...一.Hbase快速入门 二.Apache HBase配置 三.Hbase数据存储 四.HBase协处理器与二级索引 五.PHOENIX操作HBASE 六.HBase设计与优化 七.HBase与Spark集成 八.Trafodion操作HBase 共146页
java代码使用thrift2操作hbase示例,thrift2连接hbase添加数据,单条查找,删除数据,根据扫描器查找,修改数据等测试实例
本资源为hbase的安装和使用,内含hbase安装工具包,hbase的安装说明,hbase的使用说明 。
HBase入门与使用,可以了解如何使用HBase
多线程 hbase
java 利用 sping-data-hadoop HbaseTemplate 操作hbase find get execute 等方法 可以直接运行
hbase学习-脑图总结,涵盖了大部分基础知识点,下个脑图查看器即可,方便大家学习
HBASE的主要原理解读:包括HBase 读写逻辑、HBase region拆分和合并
本文来自于csdn,介绍了Hadoop的原理,HBase的特点,HBase 的高并发和实时处理数据,数据模型,工作流程等。(一)HDFS主要是用于做什么的?HDFS(HadoopDistributedFileSystem)分布式文件管理系统、是Hadoop项目的...
Hbase学习总结,很不错的资源,对你绝对有帮助
HBase基本操作 增删改查 java代码 要使用须导入对应的jar包
文档收集了一些网络上的hbase相关学习资料,对初学者来说是非常宝贵的,省去了在网上找的时间,又省去了看一些无用的资料的麻烦。
│ Day15[Hbase 基本使用及存储设计].pdf │ ├─02_视频 │ Day1501_Hbase的介绍及其发展.mp4 │ Day1502_Hbase中的特殊概念.mp4 │ Day1503_Hbase与MYSQL的存储比较.mp4 │ Day1504_Hbase部署环境准备.mp4 │ Day...