ITPub博客

首页 > 大数据 > > 实验Hbase的test中的TestTableMapReduce类--修改成简单易懂点的

实验Hbase的test中的TestTableMapReduce类--修改成简单易懂点的

作者:浪花小雨滴 时间:2020-05-18 17:57:00 0 删除 编辑

不积跬步,无以至千里!

这几天狂看mapreduce对hbase进行操作的例子,消化吸收,熟能生巧,掌握mapreduce和hbase交互的各个细节,以及整体流程等,整体流程等年前写一篇总结下,这几天先狂看吧

看,复制,修改,运行,遇到各种问题,解决,慢慢的就熟了。

这个类是干啥的呢,其实就是对hbase的某表进行简单操作,不过用的是mapreduce,即效率高,当然,看这个,主要吸收其用mapreduce操作hbase的思路及如何编程。

这个类功能是:将表中所有行 列族f1的某列q1的值倒序后放在另一列族f2的列q2,所谓倒序即 abc变成cba,456变成654,其中q1和q2是可以相同的,因为不同列族嘛。

上代码了:

  1. package mapreduce.hbase;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.util.Map;  
  6. import java.util.NavigableMap;  
  7.   
  8. import org.apache.commons.logging.Log;  
  9. import org.apache.commons.logging.LogFactory;  
  10. import org.apache.hadoop.conf.Configuration;  
  11. import org.apache.hadoop.fs.FileUtil;  
  12. import org.apache.hadoop.fs.Path;  
  13. import org.apache.hadoop.hbase.HBaseConfiguration;  
  14. import org.apache.hadoop.hbase.HConstants;  
  15. import org.apache.hadoop.hbase.client.HTable;  
  16. import org.apache.hadoop.hbase.client.Put;  
  17. import org.apache.hadoop.hbase.client.Result;  
  18. import org.apache.hadoop.hbase.client.Scan;  
  19. import org.apache.hadoop.hbase.io.ImmutableBytesWritable;  
  20. import org.apache.hadoop.hbase.mapreduce.IdentityTableReducer;  
  21. import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;  
  22. import org.apache.hadoop.hbase.mapreduce.TableMapper;  
  23. import org.apache.hadoop.hbase.util.Bytes;  
  24. import org.apache.hadoop.io.Writable;  
  25. import org.apache.hadoop.mapreduce.Job;  
  26. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  27.   
  28.   
  29. public class TestMRHBase {  
  30.   
  31.     private static final Log LOG = LogFactory.getLog(TestMRHBase.class);  
  32.     static final String MULTI_REGION_TABLE_NAME = "mr_test"; // 表名   
  33.     static final byte[] INPUT_FAMILY = Bytes.toBytes("contents");// 原列族名   
  34.     static final byte[] OUTPUT_FAMILY = Bytes.toBytes("text");// 写入的列族名   
  35.     static final byte[] QUALIFIER_NAME = Bytes.toBytes("data");// 列名   
  36.   
  37.       
  38.     public static class TestMap extends  
  39.             TableMapper {  
  40.           
  41.         protected void map(ImmutableBytesWritable key, Result value,  
  42.                 Context context) throws IOException, InterruptedException {  
  43.             if (value.size() != 1) {  
  44.                 throw new IOException("There should only be one column! ");  
  45.             }  
  46.             Map<byte[], NavigableMap<byte[], NavigableMapbyte[]>>> cf = value  
  47.                     .getMap();  
  48.             if (!cf.containsKey(INPUT_FAMILY)) {  
  49.                 throw new IOException("Wrong input columns. Missing: '"  
  50.                         + Bytes.toString(INPUT_FAMILY) + "'.");  
  51.             }  
  52.             // Get the original value and reverse it   
  53.             String originalValue = new String(value.getValue(INPUT_FAMILY,  
  54.                     QUALIFIER_NAME), HConstants.UTF8_ENCODING);  
  55.             StringBuilder newValue = new StringBuilder(originalValue);  
  56.             newValue.reverse();  
  57.             // Now set the value to be collected   
  58.             Put outval = new Put(key.get());  
  59.             outval.add(OUTPUT_FAMILY, QUALIFIER_NAME, Bytes.toBytes(newValue  
  60.                     .toString()));  
  61.             context.write(key, outval);  
  62.         }  
  63.   
  64.     }  
  65.   
  66.       
  67.     public void testMultiRegionTable() throws IOException,  
  68.             InterruptedException, ClassNotFoundException {  
  69.         Configuration conf = HBaseConfiguration.create();  
  70.         conf.set("hbase.zookeeper.quorum", "node2,node4,node3");  
  71.         runTestOnTable(new HTable(new Configuration(conf),  
  72.                 MULTI_REGION_TABLE_NAME));  
  73.     }  
  74.   
  75.     private void runTestOnTable(HTable table) throws IOException,  
  76.             InterruptedException, ClassNotFoundException {  
  77.   
  78.         Job job = null;  
  79.         try {  
  80.             LOG.info("Before map/reduce startup");  
  81.             job = new Job(table.getConfiguration(), "process column contents");  
  82.             job.setNumReduceTasks(1);  
  83.             job.setJarByClass(TestMRHBase.class);  
  84.             Scan scan = new Scan();  
  85.             scan.addFamily(INPUT_FAMILY);  
  86.             TableMapReduceUtil.initTableMapperJob(Bytes.toString(table  
  87.                     .getTableName()), scan, TestMap.class,  
  88.                     ImmutableBytesWritable.class, Put.class, job);  
  89.             TableMapReduceUtil.initTableReducerJob(Bytes.toString(table  
  90.                     .getTableName()), IdentityTableReducer.class, job);  
  91.             FileOutputFormat.setOutputPath(job, new Path("test"));  
  92.             LOG.info("Started " + Bytes.toString(table.getTableName()));  
  93.             job.waitForCompletion(true);  
  94.             LOG.info("After map/reduce completion");  
  95.   
  96.             // verify map-reduce results   
  97.             // verify(Bytes.toString(table.getTableName()));   
  98.         } finally {  
  99.             // mrCluster.shutdown();   
  100.             if (job != null) {  
  101.                 FileUtil.fullyDelete(new File(job.getConfiguration().get(  
  102.                         "hadoop.tmp.dir")));  
  103.             }  
  104.         }  
  105.     }  
  106.   
  107.       
  108.     public static void main(String[] args) throws Exception {  
  109.         TestMRHBase testMRHBase = new TestMRHBase();  
  110.         testMRHBase.testMultiRegionTable();  
  111.   
  112.     }  
  113. }  


过程中遇到一些异常,唉…… 一定要长记性啊,否则,大好青春不能总被同样的错误耗费掉啊

1.classnotfoundexception:又是这个,这次的错误是因为没job.setJarByClass

2.java.lang.NoSuchMethodException: mapreduce.hbase.TestMRHBase$TestMap.()

这是为什么呢?

因为类中类TestMap没有设置成static类型,结果map任务时找不到此map的init,只要类中map类设成static即可

其他的一个小问题就不说了。

在拿来别人的东西时,如果想修改下,一定要读透了

取其精华,去其糟粕

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21975563/viewspace-1119803/,如需转载,请注明出处,否则将追究法律责任。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3150941/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: NoSql数据库
下一篇: TiDB 整体架构
请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39904