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

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值