使用mapreduce向hbase1.1.2插入大量数据

原创 2015年12月07日 11:05:00

1、集群环境

hadoop2.5+hbase1.1.2
集群现在有37台slave节点,一个master节点。

2、数据源

每一天的数据压缩成了一个tar.gz包,大概4G,其中大概有6000个zip包,每个zip包中有几个txt文件。
现在采用shell脚本将每天的数据合并成一个txt,大概有几十G。

3、插入要求

现在要将txt文件中的每一行作为一条记录插入hbase。

4、建表

create ‘terminal_data_file’,’cf’,{NUMREGIONS=>37,SPLITALGO=>’HexStringSplit’}
这里在建表时就采用了散列化,在集群上建了37个regions,防止插入时产生热点效应。表建好之后,用浏览器打开hbase的管理页面,可以看到我们新建的表是有37个online regions的。但是,一旦你在shell中使用truncate ‘tablename’之后,这个表的online regions就变成一个了,也就不具备散列化的特性了。这一点要注意。
这里写图片描述

5、代码

代码类似于wordcount,输入目录是hdfs上一个含有多个txt文件的文件夹。直接再map中将数据插入hbase,所以我们不需要reduce。
启动函数:

    public class TextInsert4 {

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{
        Configuration conf = HBaseConfiguration.create();
        conf.addResource(new Path("/usr/local/cluster/hadoop/etc/hadoop/core-site.xml"));
        conf.addResource(new Path("/usr/local/cluster/hadoop/etc/hadoop/hdfs-site.xml"));
        conf.addResource(new Path("/usr/local/cluster/hadoop/etc/hadoop/mapred-site.xml"));
        if(args.length !=1){
            System.out.println("1 args");
            System.exit(2);
        }
//      Job job = new Job(conf,"wordcount");
        Job job = Job.getInstance(conf);
        job.setJobName("insert_hbase");
        job.setJarByClass(TextInsert4.class);
        job.setMapperClass(TokenizerMapper.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));

        job.setMapOutputKeyClass(ImmutableBytesWritable.class);
        job.setMapOutputValueClass(Put.class);
        job.setOutputFormatClass(MultiTableOutputFormat.class);

        TableMapReduceUtil.addDependencyJars(job);
        TableMapReduceUtil.addDependencyJars(job.getConfiguration());
//      job.setReducerClass(IntSumReducer.class);
//      job.setOutputKeyClass(Text.class);
//      job.setOutputValueClass(IntWritable.class);

//      FileOutputFormat.setOutputPath(job, new Path(args[1]));
        job.setNumReduceTasks(0);
        System.exit(job.waitForCompletion(true)?0:1);

    }
}

map函数

    public class TokenizerMapper extends Mapper<LongWritable,Text,ImmutableBytesWritable,Put>{
//      private final static IntWritable one = new IntWritable(1);
//      private Text word = new Text();

//      public static Configuration cfg = HBaseConfiguration.create();
//      public static Table table2= null;
//      public static final Connection conn=null;
        public void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException{
//              Connection conn = ConnectionFactory.createConnection();
//              table2 = conn.getTable(TableName.valueOf("play_record_file5"));
            String item = value.toString();
            String[] detail = item.split("\\|"); //     

//      the 16bit md5 values of userId and current timestmap as the rowkey 
            String collectTime = detail[0];

            byte[] bytes = Bytes.toBytes(collectTime); //collect time
            String hashPrefix = MD5Hash.getMD5AsHex(bytes).substring(0,8); //time hash
            byte[] time = Bytes.toBytes(System.currentTimeMillis());  //system time
            byte[] bytes2 = Bytes.toBytes(hashPrefix);
            byte[] rowKey =Bytes.add(bytes2, bytes, time);
//          byte[] timestamp = DigestUtils.md5(Long.toString(System.currentTimeMillis()));
//          byte[] userIdHash = DigestUtils.md5(detail[5]);
//          byte[] rowKey = new byte[timestamp.length+userIdHash.length];
//          int offset = 0;
//          offset = Bytes.putBytes(rowKey, offset, userIdHash, 0, userIdHash.length);
//          Bytes.putBytes(rowKey,offset,timestamp,0,timestamp.length);
            Put p1 = new Put(rowKey);
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("collect_time"), Bytes.toBytes(detail[0]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("stb_id"), Bytes.toBytes(detail[1]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("stb_ip"), Bytes.toBytes(detail[2]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("region1"), Bytes.toBytes(detail[3]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("region2"), Bytes.toBytes(detail[4]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("user_id"), Bytes.toBytes(detail[5]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("pppoe_id"), Bytes.toBytes(detail[6]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("auth_id"), Bytes.toBytes(detail[7]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cpu_use_rate"), Bytes.toBytes(detail[8]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("memory_use_rate"), Bytes.toBytes(detail[9]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("harddisk_use_rate"), Bytes.toBytes(detail[10]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("play_error_numbers"), Bytes.toBytes(detail[11]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("multi_req_numbers"), Bytes.toBytes(detail[12]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("multi_fail_numbers"), Bytes.toBytes(detail[13]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("multi_abend_numbers"), Bytes.toBytes(detail[14]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("vod_req_numbers"), Bytes.toBytes(detail[15]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("vod_fail_numbers"), Bytes.toBytes(detail[16]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("vod_abend_numbers"), Bytes.toBytes(detail[17]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("uni_avg_packet_lost_rate"), Bytes.toBytes(detail[18]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("uni_avg_bit_rate"), Bytes.toBytes(detail[19]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("auth_numbers"), Bytes.toBytes(detail[20]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("auth_fail_numbers"), Bytes.toBytes(detail[21]));
            p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("http_req_num"), Bytes.toBytes(detail[22]));
            try {
                p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("http_req_fail_num"), Bytes.toBytes(detail[23]));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                p1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("http_req_fail_num"), Bytes.toBytes(""));
            }
            if(!p1.isEmpty()){
                ImmutableBytesWritable ib = new ImmutableBytesWritable();
                ib.set(Bytes.toBytes("terminal_data_file1"));
                context.write(ib, p1);
            }
//          
//          StringTokenizer itr = new StringTokenizer(value.toString());
//          while(itr.hasMoreElements()){
//              word.set(itr.nextToken());
//              context.write(word, one);
//          }
        }
    }

6、结果

这里写图片描述

Hbase之批量数据写入

/**  * Created by similarface on 16/8/16.  */   import java.io.IOException;   im...
  • hxpjava1
  • hxpjava1
  • 2017-01-20 12:39:56
  • 975

Hbase1.1.2采用javaAPI插入批量数据

最近在做采用javaAPI批量往Hbase插值的工作,记录一下Configuration cfg = HbaseConfiguration.create(); Connnection conn = C...
  • GYQJN
  • GYQJN
  • 2015-11-13 14:40:18
  • 2281

java hbase api 批量高效写入数据(线程池方式)

笔者尝试各种方法写入HBase,其中使用线程池方式写入数据最为快速。测试环境:hbase 1.2.4, hadoop 2.7 单条数据大小1kb,7台服务器24核48g内存千兆网卡,测试1000w数据...
  • jack85986370
  • jack85986370
  • 2017-01-05 22:53:12
  • 11521

hbase海量数据导入

最近有个需求要对mysql的全量数据迁移到hbase,虽然hbase的设计非常利于高效的读取,但是它的compaction实现对海量数据写入造成非常大的影响,数据到一定量之后,就开始抽风。  分析h...
  • qq_26091271
  • qq_26091271
  • 2016-06-29 17:56:58
  • 182

hbase海量数据的全量导入方法

  • 2013年05月10日 06:26
  • 60KB
  • 下载

eclipse+hadoop2.7.5的map-reduce的API的配置

1.环境配置: a.将map reduce所需架包全部加载到eclipse下, b.将 键:HADOOP_USER_NAME 值:hadoop 配置到系统环境中,需要重新启动。 c.将架包...
  • qq_33202508
  • qq_33202508
  • 2017-12-03 13:03:56
  • 203

[Hbase] Hbase shell 操作数据

清空表 hbase(main):048:0> truncate 'tmp' Truncating 'tmp' table (it may take a while): - Disabling tab...
  • LRjava
  • LRjava
  • 2016-09-27 15:25:53
  • 216

HBase shell执行脚本(批量添加数据)

HBase shell执行脚本(批量添加数据) 上一篇文章中(http://blog.csdn.net/wild46cat/article/details/53214159)写了一些如何在H...
  • wild46cat
  • wild46cat
  • 2016-11-21 10:17:21
  • 6617

MapReduce功能实现四---小综合(从hbase中读取数据统计并在hdfs中降序输出Top 3)

方法一: 在Hbase中建立相应的表1: create 'hello','cf' put 'hello','1','cf:hui','hello world' put 'hello','2','cf...
  • m0_37739193
  • m0_37739193
  • 2017-07-25 18:05:55
  • 654

MapReduce操作Hbase史上最完整范例

Hbase里的数据量一般都小不了,因此MapReduce跟Hbase就成了天然的好搭档。本文中,本博主将给出最详细的用MR读取Hbase中数据的实例。1.ZK授权表首先一点来说,Hbase是强依赖于Z...
  • bitcarmanlee
  • bitcarmanlee
  • 2017-03-14 20:50:26
  • 8084
收藏助手
不良信息举报
您举报文章:使用mapreduce向hbase1.1.2插入大量数据
举报原因:
原因补充:

(最多只允许输入30个字)