非mapreduce生成Hfile,然后导入hbase当中
最近一個群友的boss讓研究hbase,讓hbase的入庫速度達到5w+/s,這可愁死了,4臺個人電腦組成的集群,多線程入庫調了好久,速度也才1w左右,都沒有達到理想的那種速度,然后就想到了這種方式,但是網上多是用mapreduce來實現入庫,而現在的需求是實時入庫,不生成文件了,所以就只能自己用代碼實現了,但是網上查了很多資料都沒有查到,最后在一個網友的指引下,看了源碼,最后找到了生成Hfile的方式,實現了之后,發(fā)現單線程入庫速度才達到1w4左右,和之前的多線程的全速差不多了,百思不得其解之時,調整了一下代碼把列的Byte.toBytes(cols)這個方法調整出來只做一次,速度立馬就到3w了,提升非常明顯,這是我的電腦上的速度,估計在它的集群上能更快一點吧,下面把代碼和大家分享一下。
? ??String tableName = "taglog";
? ? ? ? ? ? byte[] family = Bytes.toBytes("logs");
? ? ? ? ? ? //配置文件設置
? ? ? ? ? ? Configuration conf = HBaseConfiguration.create();
? ? ? ? ? ? conf.set("hbase.master", "192.168.1.133:60000");
? ? ? ? ? ? conf.set("hbase.zookeeper.quorum", "192.168.1.135");
? ? ? ? ? ? //conf.set("zookeeper.znode.parent", "/hbase");
? ? ? ? ? ? conf.set("hbase.metrics.showTableName", "false");
? ? ? ? ? ? //conf.set("io.compression.codecs", "org.apache.hadoop.io.compress.SnappyCodec");
? ? ? ? ? ??
? ? ? ? ? ? String outputdir = "hdfs://hadoop.Master:8020/user/SEA/hfiles/";
? ? ? ? ? ? Path dir = new Path(outputdir);
? ? ? ? ? ? Path familydir = new Path(outputdir, Bytes.toString(family));
? ? ? ? ? ? FileSystem fs = familydir.getFileSystem(conf);
? ? ? ? ? ? BloomType bloomType = BloomType.NONE;
? ? ? ? ? ? final HFileDataBlockEncoder encoder = NoOpDataBlockEncoder.INSTANCE;
? ? ? ? ? ? int blockSize = 64000;
? ? ? ? ? ? Configuration tempConf = new Configuration(conf);
? ? ? ? ? ? tempConf.set("hbase.metrics.showTableName", "false");
? ? ? ? ? ? tempConf.setFloat(HConstants.HFILE_BLOCK_CACHE_SIZE_KEY, 1.0f);
? ? ? ? ? ? //實例化HFile的Writer,StoreFile實際上只是HFile的輕量級的封裝
? ? ? ? ? ? StoreFile.Writer writer = new StoreFile.WriterBuilder(conf, new CacheConfig(tempConf),
? ? ? ? ? ? ? ? ? ? fs, blockSize)
? ? ? ? ? ? ? ? ? ? .withOutputDir(familydir)
? ? ? ? ? ? ? ? ? ? .withCompression(Compression.Algorithm.NONE)
? ? ? ? ? ? ? ? ? ? .withBloomType(bloomType).withComparator(KeyValue.COMPARATOR)
? ? ? ? ? ? ? ? ? ? .withDataBlockEncoder(encoder).build();
? ? ? ? ? ? long start = System.currentTimeMillis();
? ? ? ? ? ??
? ? ? ? ? ? DecimalFormat df = new DecimalFormat("0000000");
? ? ? ? ? ??
? ? ? ? ? ??
? ? ? ? ? ??
? ? ? ? ? ? KeyValue kv1 = null;
? ? ? ? ? ? KeyValue kv2 = null;
? ? ? ? ? ? KeyValue kv3 = null;
? ? ? ? ? ? KeyValue kv4 = null;
? ? ? ? ? ? KeyValue kv5 = null;
? ? ? ? ? ? KeyValue kv6 = null;
? ? ? ? ? ? KeyValue kv7 = null;
? ? ? ? ? ? KeyValue kv8 = null;
? ? ? ? ? ??
? ? ? ? ? ? //這個是耗時操作,只進行一次
? ? ? ? ? ? byte[] cn = Bytes.toBytes("cn");
? ? ? ? ? ? byte[] dt = Bytes.toBytes("dt");
? ? ? ? ? ? byte[] ic = Bytes.toBytes("ic");
? ? ? ? ? ? byte[] ifs = Bytes.toBytes("if");
? ? ? ? ? ? byte[] ip = Bytes.toBytes("ip");
? ? ? ? ? ? byte[] le = Bytes.toBytes("le");
? ? ? ? ? ? byte[] mn = Bytes.toBytes("mn");
? ? ? ? ? ? byte[] pi = Bytes.toBytes("pi");
? ? ? ? ? ??
? ? ? ? ? ? int maxLength = 3000000;
? ? ? ? ? ? for(int i=0;i<maxLength;i++){
? ? ? ? ? ? ? ? String currentTime = ""+System.currentTimeMillis() + df.format(i);
? ? ? ? ? ? ? ? long current = System.currentTimeMillis();
? ? ? ? ? ? ? ? ?//rowkey和列都要按照字典序的方式順序寫入,否則會報錯的
? ? ? ? ? ? ? ? ?kv1 = new KeyValue(Bytes.toBytes(currentTime),?
? ? ? ? ? ? ? ? ? ? ? ? ?family, cn,current,KeyValue.Type.Put,Bytes.toBytes("3"));
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?kv2 = new KeyValue(Bytes.toBytes(currentTime),?
? ? ? ? ? ? ? ? ? ? ? ? ?family, dt,current,KeyValue.Type.Put,Bytes.toBytes("6"));
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?kv3 = new KeyValue(Bytes.toBytes(currentTime),?
? ? ? ? ? ? ? ? ? ? ? ? ?family, ic,current,KeyValue.Type.Put,Bytes.toBytes("8"));
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?kv4 = new KeyValue(Bytes.toBytes(currentTime),?
? ? ? ? ? ? ? ? ? ? ? ? ?family, ifs,current,KeyValue.Type.Put,Bytes.toBytes("7"));
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?kv5 = new KeyValue(Bytes.toBytes(currentTime),?
? ? ? ? ? ? ? ? ? ? ? ? ?family, ip,current,KeyValue.Type.Put,Bytes.toBytes("4"));
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?kv6 = new KeyValue(Bytes.toBytes(currentTime),?
? ? ? ? ? ? ? ? ? ? ? ? ?family, le,current,KeyValue.Type.Put,Bytes.toBytes("2"));
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?kv7 = new KeyValue(Bytes.toBytes(currentTime),?
? ? ? ? ? ? ? ? ? ? ? ? ?family, mn,current,KeyValue.Type.Put,Bytes.toBytes("5"));
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?kv8 = new KeyValue(Bytes.toBytes(currentTime),?
? ? ? ? ? ? ? ? ? ? ? ? ?family,pi,current,KeyValue.Type.Put,Bytes.toBytes("1"));
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? writer.append(kv1);
? ? ? ? ? ? ? ? writer.append(kv2);
? ? ? ? ? ? ? ? writer.append(kv3);
? ? ? ? ? ? ? ? writer.append(kv4);
? ? ? ? ? ? ? ? writer.append(kv5);
? ? ? ? ? ? ? ? writer.append(kv6);
? ? ? ? ? ? ? ? writer.append(kv7);
? ? ? ? ? ? ? ? writer.append(kv8);
? ? ? ? ? ? }
? ? ? ? ? ??
? ? ? ? ? ??
? ? ? ? ? ? writer.close();
? ? ? ? ? ??
? ? ? ? ? ? //把生成的HFile導入到hbase當中
? ? ? ? ? ? HTable table = new HTable(conf,tableName);
? ? ? ? ? ? LoadIncrementalHFiles loader = new LoadIncrementalHFiles(conf);
? ? ? ? ? ? loader.doBulkLoad(dir, table);
最后再附上查看hfile的方式,查詢正確的hfile和自己生成的hfile,方便查找問題。
hbase org.apache.hadoop.hbase.io.hfile.HFile -p -f hdfs://hadoop.Master:8020/user/SEA/hfiles/logs/51aa97b2a25446f89d5c870af92c9fc1
版權聲明:本文為博主原創(chuàng)文章,未經博主允許不得轉載。
轉載于:https://www.cnblogs.com/stark-summer/p/4829787.html
總結
以上是生活随笔為你收集整理的非mapreduce生成Hfile,然后导入hbase当中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android】自定义环形菜单View
- 下一篇: C++ Prime:范围for语句