`

非mapreduce生成Hfile,然后导入hbase当中

阅读更多

最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,都没有达到理想的那种速度,然后就想到了这种方式,但是网上多是用mapreduce来实现入库,而现在的需求是实时入库,不生成文件了,所以就只能自己用代码实现了,但是网上查了很多资料都没有查到,最后在一个网友的指引下,看了源码,最后找到了生成Hfile的方式,实现了之后,发现单线程入库速度才达到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

0
0
分享到:
评论

相关推荐

    MapReduce生成HFile入库到HBase 可能需要的jar包

    MapReduce生成HFile入库到HBase 可能需要的jar包,一共有3个 可以直接放在每台机器的${HADOOP_HOME}/lib下 hadoopHadoop 1.1.2 + hbase 0.94.6.1

    hadoop mr file2hfile2hbase

    2. **编写Mapper**:Map阶段,你需要编写一个Mapper类,这个类负责读取输入文件中的每一行数据,解析出行键、列族、列限定符和值,然后生成HBase的Put对象。Put对象表示对HBase表的一次写操作。 3. **编写Reducer**...

    java从本地读文件并上传Hbase

    在处理每一行数据时,你可以将其拆分为键(row key)和值(value),然后使用`Table`对象写入HBase: ```java Table table = connection.getTable(TableName.valueOf(tableName)); // 假设每一行格式为"key\tvalue...

    将hdfs上的文件导入hbase的源代码

    如果数据量非常大,可以使用HBase的批处理接口`TableOutputFormat`和`BulkLoad`功能,将数据先写入HDFS的临时目录,然后使用`HFile`格式进行批量导入,提高效率。 5. **错误处理和重试机制**:在导入过程中,可能会...

    Hbase几种入库方式

    HFile 是 Hbase 的存储文件格式,预先生成 HFile 后,可以将其直接加载到 Hbase 中。这是一种高效的入库方式,尤其是在大规模数据集的情况下。预先生成 HFile 入库的优点是快捷、可靠,缺点是需要提前生成 HFile,...

    MR程序Bulkload数据到hbase

    因此,我们通常采用Bulkload机制,它允许将数据预先处理成HBase友好的格式,然后一次性加载到表中,极大地提高了导入效率。 描述提到这是一个博客配套文件,包含了一个具体的示例,展示了如何使用MapReduce来实现...

    How-to: Use HBase Bulk Loading, and Why

    为了解决这个问题,HBase提供了批量加载(Bulk Loading)机制,它允许我们将数据预先转换成HFile格式,然后一次性地快速加载到表中,极大地提高了数据导入速度。 批量加载的基本流程如下: 1. **生成SequenceFile*...

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

    2. **使用HFileOutputFormat**:HBase提供了HFileOutputFormat类,可以将数据直接写入HFile格式,跳过HBase的内部流程,从而提高数据导入效率。这种方法适用于离线大批量数据导入场景。 3. **并行导入**:利用...

    HBaseBulkImportXML:如何将 XML 文件中的数据批量导入 HBase 表的示例

    HBaseBulkImportXML 如何将数据从 XML 文件批量导入 HBase 表的示例。hbase-bulk-import-XML-example 执照Apache 许可。 HBase 提供对大数据的... 使用 LoadIncrementalHFiles.doBulkLoad 将 HFile 导入 HBase MapRe

    hbase+批量上传jar包

    4. **运行bulk load命令**:通过HBase的shell或者Java API执行`hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles`命令,指定待导入的HFile所在的目录和目标HBase表名。 5. **清理工作**:批量导入...

    Hadoop数据迁移--从Hadoop向HBase载入数据

    HBase集群通常会与Hadoop集群设置在同一个集群中,这意味着HBase使用的分布式文件系统(HDFS)就是生成HFile文件的MapReduce任务所在的同一集群。这样设置的好处是减少了数据迁移过程中的网络传输,并且可以利用...

    hfile-to-hbase:处女发表

    3. **HFile到HBase的导入过程**:当HBase表的数据被刷入磁盘时,会生成HFile。在特殊情况下,如数据恢复或批量导入,开发者可能需要直接操作HFile。这通常涉及使用HBase的Admin API创建表,然后使用HFile工具将数据...

    Hbase:HBase MapReduce投影

    这个格式会将输出结果先写入HDFS上的HFile,然后通过HBase的bulk load功能加载到表中,以提高写入效率。 5. **Java编程**:由于HBase MapReduce主要基于Java实现,所以开发过程中需要掌握Java编程。此外,理解HBase...

    java解决hive快速导数据到Hbase代码

    5. **执行MapReduce作业**:编写一个MapReduce作业,该作业使用HFileOutputFormat作为输出格式,将上一步骤中写入HDFS的数据转化为HBase可读的HFile格式。 6. **加载HFiles**:最后,通过HBase的Admin API或者HBase...

    BigGeoDataHBaseLoader:HBase矢量大数据快速入库工具

    3、运行MapReduce程序生成HFile hadoop -jar BigGeoDataHbaseLoader.jar class路径 -Dhbase.zookeeper.quorum=zookeeper集群地址 输入空间数据tsv文件路径 输出HFile路径 空间数据表名 4、将HFile添加到HBase表中 ...

    hbase1.0.3_part2

    3. **HBase的Compaction**:Compaction是HBase中用于合并HFile的过程,目的是减少Region内的文件数量,提高读取效率。有两种类型的Compaction:Minor和Major,前者只合并同一Region的小文件,后者会合并所有文件,...

    HBaseBulkLoad:使用 MapReduce 作业从文本文件加载 HBase

    通过MapReduce作业,我们可以将大量文本数据转换成这种格式,然后一次性地加载到HBase中,避免了单条插入的性能瓶颈。 要实现这个过程,我们需要以下步骤: 1. **数据预处理**:首先,我们需要对源文本文件进行...

    hbase导入测试数据集

    或者,使用MapReduce任务将ORDER_INFO.txt转换为HFile格式,然后使用`importtsv`命令批量导入。 4. **验证导入**:导入完成后,可以通过`get`或`scan`命令检查数据是否正确导入。 ```bash hbase(main):004:0&gt; ...

    hbase-2.0.2-bin.tar

    5. **MapReduce支持**: HBase与Hadoop的MapReduce框架紧密集成,方便进行大规模批处理作业,如数据导入、统计分析等。 6. **RESTful接口**: HBase提供REST接口,使其能被任何支持HTTP的编程语言访问,增加了其应用...

    Apache HBase ™ Reference Guide

    直接在批量导入过程中写入 HFile**:介绍了一种在批量导入过程中直接写入HFile的方法。 - **49. 行计数示例**:通过一个简单的例子来演示如何使用MapReduce来计算HBase表中的行数。 - **50. Map 任务分割**:解释了...

Global site tag (gtag.js) - Google Analytics