将手机上网日志文件批量导入到Hbase中。操作步骤:

1、将日志文件(请下载附件)上传到HDFS中,利用hadoop的操作命令上传:hadoop  fs -put input  /

2、创建Hbase表,通过Java操作

  1. package com.jiewen.hbase;
  2. import java.io.IOException;
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.hbase.HBaseConfiguration;
  5. import org.apache.hadoop.hbase.HColumnDescriptor;
  6. import org.apache.hadoop.hbase.HTableDescriptor;
  7. import org.apache.hadoop.hbase.client.Get;
  8. import org.apache.hadoop.hbase.client.HBaseAdmin;
  9. import org.apache.hadoop.hbase.client.HTable;
  10. import org.apache.hadoop.hbase.client.Put;
  11. import org.apache.hadoop.hbase.client.Result;
  12. import org.apache.hadoop.hbase.client.ResultScanner;
  13. import org.apache.hadoop.hbase.client.Scan;
  14. import org.apache.hadoop.hbase.util.Bytes;
  15. public class HbaseDemo {
  16. public static void main(String[] args) throws IOException {
  17. String tableName = "wlan_log";
  18. String columnFamily = "cf";
  19. HbaseDemo.create(tableName, columnFamily);
  20. // HbaseDemo.put(tableName, "row1", columnFamily, "cl1", "data");
  21. // HbaseDemo.get(tableName, "row1");
  22. // HbaseDemo.scan(tableName);
  23. // HbaseDemo.delete(tableName);
  24. }
  25. // hbase操作必备
  26. private static Configuration getConfiguration() {
  27. Configuration conf = HBaseConfiguration.create();
  28. conf.set("hbase.rootdir", "hdfs://hadoop1:9000/hbase");
  29. // 使用eclipse时必须加入这个,否则无法定位
  30. conf.set("hbase.zookeeper.quorum", "hadoop1");
  31. return conf;
  32. }
  33. // 创建一张表
  34. public static void create(String tableName, String columnFamily)
  35. throws IOException {
  36. HBaseAdmin admin = new HBaseAdmin(getConfiguration());
  37. if (admin.tableExists(tableName)) {
  38. System.out.println("table exists!");
  39. } else {
  40. HTableDescriptor tableDesc = new HTableDescriptor(tableName);
  41. tableDesc.addFamily(new HColumnDescriptor(columnFamily));
  42. admin.createTable(tableDesc);
  43. System.out.println("create table success!");
  44. }
  45. }
  46. // 加入一条记录
  47. public static void put(String tableName, String row, String columnFamily,
  48. String column, String data) throws IOException {
  49. HTable table = new HTable(getConfiguration(), tableName);
  50. Put p1 = new Put(Bytes.toBytes(row));
  51. p1.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes
  52. .toBytes(data));
  53. table.put(p1);
  54. System.out.println("put'" + row + "'," + columnFamily + ":" + column
  55. + "','" + data + "'");
  56. }
  57. // 读取一条记录
  58. public static void get(String tableName, String row) throws IOException {
  59. HTable table = new HTable(getConfiguration(), tableName);
  60. Get get = new Get(Bytes.toBytes(row));
  61. Result result = table.get(get);
  62. System.out.println("Get: " + result);
  63. }
  64. // 显示全部数据
  65. public static void scan(String tableName) throws IOException {
  66. HTable table = new HTable(getConfiguration(), tableName);
  67. Scan scan = new Scan();
  68. ResultScanner scanner = table.getScanner(scan);
  69. for (Result result : scanner) {
  70. System.out.println("Scan: " + result);
  71. }
  72. }
  73. // 删除表
  74. public static void delete(String tableName) throws IOException {
  75. HBaseAdmin admin = new HBaseAdmin(getConfiguration());
  76. if (admin.tableExists(tableName)) {
  77. try {
  78. admin.disableTable(tableName);
  79. admin.deleteTable(tableName);
  80. } catch (IOException e) {
  81. e.printStackTrace();
  82. System.out.println("Delete " + tableName + " 失败");
  83. }
  84. }
  85. System.out.println("Delete " + tableName + " 成功");
  86. }
  87. }

3、将日志文件导入Hbase表wlan_log中:

  1. import java.text.SimpleDateFormat;
  2. import java.util.Date;
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.hbase.client.Put;
  5. import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;
  6. import org.apache.hadoop.hbase.mapreduce.TableReducer;
  7. import org.apache.hadoop.hbase.util.Bytes;
  8. import org.apache.hadoop.io.LongWritable;
  9. import org.apache.hadoop.io.NullWritable;
  10. import org.apache.hadoop.io.Text;
  11. import org.apache.hadoop.mapreduce.Counter;
  12. import org.apache.hadoop.mapreduce.Job;
  13. import org.apache.hadoop.mapreduce.Mapper;
  14. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  15. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
  16. public class HbaseBatchImport {
  17. public static void main(String[] args) throws Exception {
  18. final Configuration configuration = new Configuration();
  19. // 设置zookeeper
  20. configuration.set("hbase.zookeeper.quorum", "hadoop1");
  21. // 设置hbase表名称
  22. configuration.set(TableOutputFormat.OUTPUT_TABLE, "wlan_log");
  23. // 将该值改大,防止hbase超时退出
  24. configuration.set("dfs.socket.timeout", "180000");
  25. final Job job = new Job(configuration, "HBaseBatchImport");
  26. job.setMapperClass(BatchImportMapper.class);
  27. job.setReducerClass(BatchImportReducer.class);
  28. // 设置map的输出,不设置reduce的输出类型
  29. job.setMapOutputKeyClass(LongWritable.class);
  30. job.setMapOutputValueClass(Text.class);
  31. job.setInputFormatClass(TextInputFormat.class);
  32. // 不再设置输出路径。而是设置输出格式类型
  33. job.setOutputFormatClass(TableOutputFormat.class);
  34. FileInputFormat.setInputPaths(job, "hdfs://hadoop1:9000/input");
  35. job.waitForCompletion(true);
  36. }
  37. static class BatchImportMapper extends
  38. Mapper<LongWritable, Text, LongWritable, Text> {
  39. SimpleDateFormat dateformat1 = new SimpleDateFormat("yyyyMMddHHmmss");
  40. Text v2 = new Text();
  41. protected void map(LongWritable key, Text value, Context context)
  42. throws java.io.IOException, InterruptedException {
  43. final String[] splited = value.toString().split("\t");
  44. try {
  45. final Date date = new Date(Long.parseLong(splited[0].trim()));
  46. final String dateFormat = dateformat1.format(date);
  47. String rowKey = splited[1] + ":" + dateFormat;
  48. v2.set(rowKey + "\t" + value.toString());
  49. context.write(key, v2);
  50. } catch (NumberFormatException e) {
  51. final Counter counter = context.getCounter("BatchImport",
  52. "ErrorFormat");
  53. counter.increment(1L);
  54. System.out.println("出错了" + splited[0] + " " + e.getMessage());
  55. }
  56. };
  57. }
  58. static class BatchImportReducer extends
  59. TableReducer<LongWritable, Text, NullWritable> {
  60. protected void reduce(LongWritable key,
  61. java.lang.Iterable<Text> values, Context context)
  62. throws java.io.IOException, InterruptedException {
  63. for (Text text : values) {
  64. final String[] splited = text.toString().split("\t");
  65. final Put put = new Put(Bytes.toBytes(splited[0]));
  66. put.add(Bytes.toBytes("cf"), Bytes.toBytes("date"), Bytes
  67. .toBytes(splited[1]));
  68. // 省略其它字段,调用put.add(....)就可以
  69. context.write(NullWritable.get(), put);
  70. }
  71. };
  72. }
  73. }

4、查看导入结果:

Hbase调用JavaAPI实现批量导入操作的更多相关文章

  1. 批量导入数据到HBase

    hbase一般用于大数据的批量分析,所以在很多情况下需要将大量数据从外部导入到hbase中,hbase提供了一种导入数据的方式,主要用于批量导入大量数据,即importtsv工具,用法如下:   Us ...

  2. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的javaAPI应用

    实验目的 进一步了解hbase的操作 熟悉使用IDEA进行java开发 熟悉hbase的javaAPI 实验原理 前面已经了解通过hbase的shell操作hbase,确实比较难以使用,另外通过hiv ...

  3. python操作数据库之批量导入

    python操作数据库之批量导入 Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进. Python具有丰富和强大的库.它常被昵称为胶水语言,能够把用其他语言制作的 ...

  4. HBase结合MapReduce批量导入(HDFS中的数据导入到HBase)

    HBase结合MapReduce批量导入 package hbase; import java.text.SimpleDateFormat; import java.util.Date; import ...

  5. Hbase笔记:批量导入

    工作中可能会有对HBase的复杂操作,我们现在对HBase的操作太简单了.复杂操作一般用HBaseScan操作,还有用框架对HBase进行复杂操作,iparler,sharker.我们说HBase是数 ...

  6. ADO.NET 对数据操作 以及如何通过C# 事务批量导入数据

    ADO.NET 对数据操作 以及如何通过C# 事务批量导入数据   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  7. Hadoop之——HBASE结合MapReduce批量导入数据

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46463889 废话不多说.直接上代码,你懂得 package hbase; imp ...

  8. Spark:DataFrame批量导入Hbase的两种方式(HFile、Hive)

    Spark处理后的结果数据resultDataFrame可以有多种存储介质,比较常见是存储为文件.关系型数据库,非关系行数据库. 各种方式有各自的特点,对于海量数据而言,如果想要达到实时查询的目的,使 ...

  9. 数据批量导入HBase

    测试数据: datas 1001 lilei 17 13800001111 1002 lily 16 13800001112 1003 lucy 16 13800001113 1004 meimei ...

随机推荐

  1. 离线功能对比:service worker和applicationCache

    SW 复杂,事件驱动,可以拦截请求,和缓存这些请求的响应数据,实现的效果更加灵活 AppCache 简单易用,声明式的将要缓存的文件清单声明在一个文件中.由于设计上的原因,它存在一些问题,导致难以运用 ...

  2. c++-string-1

    解答注意: 我写的时候考虑了: 1) "     my"(设置flag,为true时表示上一个是非空格字符) 2) "hello John"(最后不是空格结尾, ...

  3. CodeForces 699C - Vacations

    题目链接:http://codeforces.com/problemset/problem/699/C C. Vacations time limit per test1 second memory ...

  4. Python 描述符(Descriptor) 附实例

    在 Python 众多原生特性中,描述符可能是最少被自定义的特性之一,但它在底层实现的方法和属性却无时不刻被使用着,它优雅的实现方式体现出 Python 简洁之美. 定义 一个描述符是一个有" ...

  5. git 的右键快捷菜单恢复

    最近装了个vs 2017 的社区版的,发现之前安装的git的右键快捷方式不见了,因此在此写备注,只要是git的安装位置是默认位置的,也可以使用此注册表恢复,其他路径请自行修改reg文件 主要是针对gi ...

  6. 2,格式化输出and编码基础

    格式化输出: input格式化输出: name = input('请输入姓名:') name = input('请输入姓名:') Age = int(input('请输入年龄:')) job = in ...

  7. 剑指offer面试题43:n个筛子的点数

    题目描述: 把n个筛子扔在地上,所有筛子朝上的一面点数之和为s,输入n,打印出s的所有可能的值出线的概率. 书上给了两种解法,第一种递归的方法由于代码太乱,没有看懂=.= 第二种方法很巧妙,lz已经根 ...

  8. Disqus 升级到3.0以上版本的评论同步问题

    Disqus从2.*升级3.*时,Knowlege Base的文章不显示Disqus评论, 解决方法:在Disqus的Advanced Settings中勾选Render Comments JavaS ...

  9. linux系统管理员 第五部分 1认识系统服务

    linux系统管理员 一 认识系统服务 二认识与分析登录文件 三启动流程.模组管理与loader 四网络设定与备份策略 五软件的安装  源代码与tarball 六软件的安装rpm   srpm与yum ...

  10. 雅图CAD

    今天培训了雅图CAD. 由辅助线确定下一步的位置,是个好思想.