TableMapReduceUtil.initTableMapperJob是用来对内输入的,传递的参数之一,就是输入格式化类TableInputFormat.class,且会进行set操作:

job.setInputFormatClass(inputFormatClass);

TableInputFormat的父类TableInputFormatBase会创建TableRecordReader:

if (trr == null) {trr = new TableRecordReader();
}
Scan sc = new Scan(this.scan);
sc.setStartRow(tSplit.getStartRow());
sc.setStopRow(tSplit.getEndRow());
trr.setScan(sc);
trr.setHTable(table);
return trr;

所以记录读取器用的就是TableRecordReader。它会不断往下读:

@Override
public boolean nextKeyValue() throws IOException, InterruptedException {return this.recordReaderImpl.nextKeyValue();
}

查看实现类,说明K-V就是rowkey-Result对象:

public boolean nextKeyValue() throws IOException, InterruptedException {if (key == null) key = new ImmutableBytesWritable();//这里说明value就是Result对象if (value == null) value = new Result();try {try {//读取下一行内容value = this.scanner.next();if (logScannerActivity) {rowcount ++;if (rowcount >= logPerRowCount) {long now = System.currentTimeMillis();LOG.info("Mapper took " + (now-timestamp)+ "ms to process " + rowcount + " rows");timestamp = now;rowcount = 0;}}} catch (IOException e) {// do not retry if the exception tells us not to do soif (e instanceof DoNotRetryIOException) {throw e;}// try to handle all other IOExceptions by restarting// the scanner, if the second call fails, it will be rethrownLOG.info("recovered from " + StringUtils.stringifyException(e));if (lastSuccessfulRow == null) {LOG.warn("We are restarting the first next() invocation," +" if your mapper has restarted a few other times like this" +" then you should consider killing this job and investigate" +" why it's taking so long.");}if (lastSuccessfulRow == null) {restart(scan.getStartRow());} else {restart(lastSuccessfulRow);scanner.next();    // skip presumed already mapped row}value = scanner.next();numRestarts++;}if (value != null && value.size() > 0) {//这里getRow得到的就是RowKeykey.set(value.getRow());lastSuccessfulRow = key.get();return true;}updateCounters();return false;} catch (IOException ioe) {if (logScannerActivity) {long now = System.currentTimeMillis();LOG.info("Mapper took " + (now-timestamp)+ "ms to process " + rowcount + " rows");LOG.info(ioe);String lastRow = lastSuccessfulRow == null ?"null" : Bytes.toStringBinary(lastSuccessfulRow);LOG.info("lastSuccessfulRow=" + lastRow);}throw ioe;}
}

nextKeyValue()方法用来不断往下读,value就是Result对象。往下读取,调用的是this.scanner.next()。这里的K set的就是得到的Row Key。说明数据会以Row Key作为K,以Result对象作为V。

当我们在Mapper中进行如下操作,就能拿到单元格中的信息:

Cell cell = value.getColumnLatestCell("cf".getBytes(), "line".getBytes());

数据如何从HBase读到MR相关推荐

  1. 大数据学习之HBase入门笔记

    文章目录 一.HBase简介 1.1.HBase定义 1.2.HBase数据模型 1.2.1.HBase逻辑结构 1.2.2.物理存储结构 1.2.3.数据模型 1.3.HBase基础架构(入门版) ...

  2. 大数据最佳实践-hbase

    目录 概述 架构 MemStore WAL HMaster 读流程 写流程 Memstore Flush Flush过程 StoreFile Compaction Region Split 优化 re ...

  3. 【学习笔记】大数据技术之HBase

    大数据技术之HBase 思考? 1. RegionServer和Master的区别? 2. Hbase端口 3. HBase写流程中,为什么要和zk进行交互? 第 1 章 HBase 简介 1.1 H ...

  4. 大数据技术之HBase(超级详细)

    大数据技术之HBase 第1章 HBase简介 1.1 什么是HBase HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持 ...

  5. 分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储...

    http://blog.51cto.com/xpleaf/2093952 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HB ...

  6. 大数据面试题Hbase篇

    目录 1.Hbase是什么? 2.HBase 的特点是什么? 3.HBase 和 Hive 的区别? 4.描述 HBase 的 rowKey 的设计原则? 5.请详细描述 HBase 中一个 cell ...

  7. 分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储

    1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HBase等. 基于面向接口的编码思想来开发,因此这个系统具有一定的扩展性,有 ...

  8. 大数据-NoSQL数据库-HBase操作框架:Phoenix【Java写的基于JDBC API的操作HBase数据库的SQL引擎框架;低延迟、事务性、可使用sql语句、提供JDBC接口】

    一.Phoenix概述 1.Phoenix 定义 Phoenix 最早是 saleforce 的一个开源项目,后来成为 Apache 的顶级项目. Phoenix 构建在 HBase 之上的开源 SQ ...

  9. 大数据技术之HBase(二)HBase原理简介

    一.HBase定义 1.1 HBase定义 HBase 是一种分布式.可扩展.支持海量数据存储的 NoSQL 数据库非结构化数据存储的数据库,基于列的模式存储.利用Hadoop HDFS作为其文件存储 ...

最新文章

  1. !! 机器学习常用工具
  2. 产品经理必了解的3个app技术框架
  3. 语言取10的整数倍_C语言结构体用法很多,坑也很多
  4. 三星Galaxy S22售价曝光:国行可能4999元起
  5. 系统测试与端到端测试:哪一个更适合选择?
  6. 【优化算法】水基湍流优化算法(TFWO) 【含Matlab源码 1585期】
  7. 一键备份服务器文件夹权限,教大家一键设置局域网共享文件夹权限
  8. Word 插入参考文献 通过尾注插入并更改尾注罗马数字为阿拉伯数字
  9. Python项目分析:预测双色球福利彩票中奖号码(随便玩玩,不要当真)
  10. python罗盘时钟代码_jQuery css3创意的罗盘时钟代码
  11. linux的命令解释器-----shell
  12. casio计算机隐藏游戏fx-82ES,CASIOlowbar;fx-82ES计算器隐藏功能
  13. electron打开文件的几种实现方式
  14. 令人拍案叫绝的Wasserstein GAN(转载)
  15. 蒙纳士大学 英伟达发布 2021 年医疗视觉问答
  16. 我自己很喜欢的几款文案编辑软件
  17. springboot整合mybatis (三) 一对多配置
  18. 远程桌面瘦客户机的优点和缺点
  19. 基于springboot的小区社区物业管理系统
  20. Google 的怪异域名大全

热门文章

  1. Python技巧之函数拆包裹
  2. apache重定向无效
  3. DevExpress的DateEdit设置显示日期和时间
  4. 百度推出飓风算法,严厉打击恶劣采集
  5. 快要普通话考试了,急需最后一题的根据话题自由讲话的演讲稿!(不要那些已经被用过...
  6. [技术速递]MSDN在线改版,新风格新体验
  7. Cassandra使用 —— 一个气象站的例子
  8. phpstorm设置的快捷键突然失效了,提示: IdeaVim ...
  9. MySQL时间增加、字符串拼接
  10. Android OpenGL ES 入门系列(一) --- 了解OpenGL ES的前世今生