HBase与MapReducer集成官方帮助文档:http://archive.cloudera.com/cdh5/cdh/5/hbase-1.2.0-cdh5.14.0/book.html


需求

在HBase先创建一张表myuser2 —— create 'myuser2','f1',然后读取myuser表中的数据,将myuser表中f1列族name列age列的数据写入到表myuser2中


步骤

一、创建maven工程,导入jar包

  1. <repositories>
  2. <repository>
  3. <id>cloudera</id>
  4. <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
  5. </repository>
  6. </repositories>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.apache.hadoop</groupId>
  10. <artifactId>hadoop-client</artifactId>
  11. <version>2.6.0-mr1-cdh5.14.0</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.apache.hbase</groupId>
  15. <artifactId>hbase-client</artifactId>
  16. <version>1.2.0-cdh5.14.0</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.apache.hbase</groupId>
  20. <artifactId>hbase-server</artifactId>
  21. <version>1.2.0-cdh5.14.0</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>junit</groupId>
  25. <artifactId>junit</artifactId>
  26. <version>4.12</version>
  27. <scope>test</scope>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.testng</groupId>
  31. <artifactId>testng</artifactId>
  32. <version>6.14.3</version>
  33. <scope>test</scope>
  34. </dependency>
  35. </dependencies>
  36. <build>
  37. <plugins>
  38. <plugin>
  39. <groupId>org.apache.maven.plugins</groupId>
  40. <artifactId>maven-compiler-plugin</artifactId>
  41. <version>3.0</version>
  42. <configuration>
  43. <source>1.8</source>
  44. <target>1.8</target>
  45. <encoding>UTF-8</encoding>
  46. <!-- <verbal>true</verbal>-->
  47. </configuration>
  48. </plugin>
  49. <plugin>
  50. <groupId>org.apache.maven.plugins</groupId>
  51. <artifactId>maven-shade-plugin</artifactId>
  52. <version>2.2</version>
  53. <executions>
  54. <execution>
  55. <phase>package</phase>
  56. <goals>
  57. <goal>shade</goal>
  58. </goals>
  59. <configuration>
  60. <filters>
  61. <filter>
  62. <artifact>*:*</artifact>
  63. <excludes>
  64. <exclude>META-INF/*.SF</exclude>
  65. <exclude>META-INF/*.DSA</exclude>
  66. <exclude>META-INF/*/RSA</exclude>
  67. </excludes>
  68. </filter>
  69. </filters>
  70. </configuration>
  71. </execution>
  72. </executions>
  73. </plugin>
  74. </plugins>
  75. </build>

二、开发MapReduce程序

定义一个main类——HbaseReadWrite

  1. package cn.itcast.mr.demo1;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.conf.Configured;
  4. import org.apache.hadoop.hbase.HBaseConfiguration;
  5. import org.apache.hadoop.hbase.client.Put;
  6. import org.apache.hadoop.hbase.client.Scan;
  7. import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
  8. import org.apache.hadoop.io.Text;
  9. import org.apache.hadoop.mapreduce.Job;
  10. import org.apache.hadoop.util.Tool;
  11. import org.apache.hadoop.util.ToolRunner;
  12. public class HbaseReadWrite extends Configured implements Tool {
  13. @Override
  14. public int run(String[] args) throws Exception {
  15. //创建Job对象
  16. Job job = Job.getInstance(super.getConf(), "HbaseMapReduce");
  17. //创建Scan对象,这里如果不设置过滤器,就是全表查询,因为在Mapper类中已经设置了判断条件,所以这里不需要设置过滤器
  18. Scan scan = new Scan();
  19. /**
  20. * 这是自定义Map逻辑的工具类
  21. * 这里需要五个参数:
  22. * tablename 就是 要读取数据的表名
  23. * scan 就是 HBASE 在java代码 实现增删改查时用来设置过滤器,获取数据等的
  24. * 接着就是自己定义的Mapper类,k2和v2的输出类型
  25. * 最后是Job对象
  26. */
  27. TableMapReduceUtil.initTableMapperJob("myuser",scan,HbaseReadMapper.class, Text.class, Put.class,job);
  28. /**
  29. * 这是自定义Reduce逻辑的工具类
  30. * 这里只需要三个参数即可
  31. * tablename 就是要写入数据的表名
  32. * 然后一个自定义的reduce类和job对象
  33. */
  34. TableMapReduceUtil.initTableReducerJob("myuser2",HbaseWriteReducer.class,job);
  35. //提交任务
  36. boolean b = job.waitForCompletion(true);
  37. return b?0:1;
  38. }
  39. /**
  40. * main方法,负责run的退出
  41. * @param args
  42. * @throws Exception
  43. */
  44. public static void main(String[] args) throws Exception {
  45. Configuration configuration = HBaseConfiguration.create();
  46. //一定记得要在configuration中设置zookeeper的地址,否则无法连接
  47. configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
  48. int run = ToolRunner.run(configuration, new HbaseReadWrite(), args);
  49. System.exit(run);
  50. }
  51. }

自定义Mapper逻辑,定义一个Mapper类——HbaseReadMapper

  1. package cn.itcast.mr.demo1;
  2. import org.apache.hadoop.hbase.Cell;
  3. import org.apache.hadoop.hbase.client.Put;
  4. import org.apache.hadoop.hbase.client.Result;
  5. import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
  6. import org.apache.hadoop.hbase.mapreduce.TableMapper;
  7. import org.apache.hadoop.hbase.util.Bytes;
  8. import org.apache.hadoop.io.Text;
  9. import java.io.IOException;
  10. import java.util.List;
  11. public class HbaseReadMapper extends TableMapper<Text, Put> {
  12. /**
  13. *
  14. * @param key ke2输出类型为Text,因为是rowKey
  15. * @param result v2输出类型为Put,因为Hbase插入数据都是Put对象
  16. * @param context
  17. * @throws IOException
  18. * @throws InterruptedException
  19. */
  20. @Override
  21. protected void map(ImmutableBytesWritable key, Result result, Context context) throws IOException, InterruptedException {
  22. //获取Hbase表中rowKey的字节
  23. byte[] rowKeyBytes = key.get();
  24. //将rowKey字节转换为字符串,因为k2输出类型为Text
  25. String rowKey = Bytes.toString(rowKeyBytes);
  26. //新建Put对象
  27. Put put = new Put(rowKeyBytes);
  28. //获取Hbase所有数据
  29. List<Cell> cells = result.listCells();
  30. //循环遍历到每一条数据
  31. for (Cell cell : cells) {
  32. //获取cell的列族
  33. byte[] family = cell.getFamily();
  34. //获取cell的列
  35. byte[] qualifier = cell.getQualifier();
  36. //判断cell的列族和列值,拿到需要的数据
  37. if ("f1".equals(Bytes.toString(family))){
  38. if ("name".equals(Bytes.toString(qualifier)) || "age".equals(Bytes.toString(qualifier))){
  39. put.add(cell);
  40. }
  41. }
  42. }
  43. //判断Put是否为空
  44. if (!put.isEmpty()){
  45. context.write(new Text(rowKey),put);
  46. }
  47. }
  48. }

自定义Reducer逻辑,定义一个Reducer类——HbaseWriterReduce

  1. package cn.itcast.mr.demo1;
  2. import org.apache.hadoop.hbase.client.Put;
  3. import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
  4. import org.apache.hadoop.hbase.mapreduce.TableReducer;
  5. import org.apache.hadoop.io.Text;
  6. import java.io.IOException;
  7. public class HbaseWriteReducer extends TableReducer<Text, Put, ImmutableBytesWritable> {
  8. /**
  9. *
  10. * @param key 输入值,k2为Text,也就是rowKey
  11. * @param values 输入值,v2为Put
  12. * @param context
  13. * @throws IOException
  14. * @throws InterruptedException
  15. */
  16. @Override
  17. protected void reduce(Text key, Iterable<Put> values, Context context) throws IOException, InterruptedException {
  18. // ImmutableBytesWritable是用来封装rowKey的
  19. ImmutableBytesWritable immutableBytesWritable = new ImmutableBytesWritable();
  20. // key就是rowKey
  21. immutableBytesWritable.set(key.getBytes());
  22. // 循环遍历拿到每一个put对象,输出即可
  23. for (Put put : values) {
  24. context.write(immutableBytesWritable,put);
  25. }
  26. }
  27. }

三、运行结果

【HBase】HBase与MapReduce的集成案例的更多相关文章

  1. HBase与Sqoop集成案例

    HBase与Sqoop集成 案例:将RDBMS中的数据抽取到HBase中 Step1.配置sqoop-env.sh如下: Step2.在Mysql中创建一张数据库library,一张表book CRE ...

  2. MapReduce 单词统计案例编程

    MapReduce 单词统计案例编程 一.在Linux环境安装Eclipse软件 1.   解压tar包 下载安装包eclipse-jee-kepler-SR1-linux-gtk-x86_64.ta ...

  3. hadoop笔记之MapReduce的应用案例(利用MapReduce进行排序)

    MapReduce的应用案例(利用MapReduce进行排序) MapReduce的应用案例(利用MapReduce进行排序) 思路: Reduce之后直接进行结果合并 具体样例: 程序名:Sort. ...

  4. hadoop笔记之MapReduce的应用案例(WordCount单词计数)

    MapReduce的应用案例(WordCount单词计数) MapReduce的应用案例(WordCount单词计数) 1. WordCount单词计数 作用: 计算文件中出现每个单词的频数 输入结果 ...

  5. Apache的HBase与cdh的sqoop集成(不建议不同版本之间的集成)

    1.修改sqoop的配资文件 2.从mysql导入到hbase(import) bin/sqoop import \ --connect jdbc:mysql://linux-hadoop3.ibei ...

  6. 基于Hbase数据的Mapreduce程序环境开发

    一.实验目标 编写Mapreduce程序,以Hbase表数据为Map输入源,计算结果输出到HDFS或者Hbase表中. 在非CDH5的Hadoop集群环境中,将编写好的Mapreduce程序整个工程打 ...

  7. hbase自带mapreduce计数表行数功能

    $HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘tablename’ mapreduce来计数,很快的!!!

  8. Hbase理论&&hbase shell&&python操作hbase&&python通过mapreduce操作hbase

    一.Hbase搭建: 二.理论知识介绍: 1Hbase介绍: Hbase是分布式.面向列的开源数据库(其实准确的说是面向列族).HDFS为Hbase提供可靠的底层数据存储服务,MapReduce为Hb ...

  9. 076 Apache的HBase与cdh的sqoop集成(不建议不同版本之间的集成)

    1.修改sqoop的配资文件 2.从mysql导入到hbase(import) bin/sqoop import \ --connect jdbc:mysql://linux-hadoop3.ibei ...

随机推荐

  1. [译]谈谈SpringBoot 事件机制

    要"监听"事件,我们总是可以将"监听器"作为事件源中的另一个方法写入事件,但这将使事件源与监听器的逻辑紧密耦合. 对于实际事件,我们比直接方法调用更灵活.我们可 ...

  2. 如何让一张图片变成二值图像?python+opencv图像处理

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:张熹熹 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...

  3. week homework: 大家来找茬

    上周课程主题为用户体验,每位同学也根据自己使用APP的体验,例举出一些手机或电脑客户端软件的bug或用户体验非常不好的地方: Tianfu: GitHub.com:界面不够直观,有许多功能不知道入口在 ...

  4. Matlab学习-(1)

    1. 认识Matlab (1)MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simul ...

  5. Jwt认识与攻击

    今天看到2018强网杯的题目,因此总结一下. Json Web Token Json Web Token简称jwt 那么怎么样可以让HTTP记住曾经发生的事情呢? 这里的选择可以很多:cookie,s ...

  6. IDEA惊天bug:进程已结束,退出代码-1073741819 (0xC0000005)

    由于昨天要写的文章没有写完,于是今天早上我四点半就"自然醒"了,心里面有事,睡觉也不安稳.洗漱完毕后,我打开电脑,正襟危坐,摆出一副要干架的态势,不能再拖了. 要写的文章中涉及到一 ...

  7. Android 中 OkHttp 三步实现生命周期绑定

    简介 OkHttps 是 OkHttp 增强版的超轻量封装包. 和 Retrofit 相比,它更加轻量(只有 59Kb),是 Retrofit (124Kb)的一半,而且更加的开箱即用,API 更加自 ...

  8. [Qt] Release模式下产生调试信息

    分两步,设置Qt配置文件,设置VS. https://blog.csdn.net/itas109/article/details/83652387 F:\Qt\Qt5.7.1\5.7\msvc2015 ...

  9. .net 使用TCP模拟UDP广播通信加强广播通信的稳定性

    应用场景:当每一台终端开启程序后发出消息,其他终端必须收到消息然后处理 思路1:使用UDP广播.     缺点:UDP广播信号不稳定,无法确定每一台机器能接收到信号 思路2:将一台主机作为服务器,使用 ...

  10. pynlpir.License过期问题解决方案

    报错信息:pynlpir.LicenseError: Your license appears to have expired. Try running "pynlpir update&qu ...