接上篇读HDFS

上面读完了HDFS,当然还有写了。

先上代码:

WriteHBase

public class WriteHBase {

    public static void writeHbase(String content){
     // HDFS 数据是一行一条记录
String[] lines = content.split("\n");
int userSize = 0;
List<Put> puts = new ArrayList<Put>();
Put put;
for(String line : lines){
       //只有两列,以#号分割,一列rowkey,一列value,一个value是很多列数据拼接起来的。
if(line.contains("#")){
String[] arr = line.split("#");
// 添加一行,
put = new Put(Bytes.toBytes(arr[0]));
         // 给行添加列 cf column value
put.add(Bytes.toBytes(Constant.CF), Bytes.toBytes(Constant.COLUMN), Bytes.toBytes(arr[1]));
puts.add(put);
}else{
continue;
}
lines[userSize] = null;
++userSize;
// write when list have 1000 没1000 条提交一次,已经改的 5000
if (userSize % Constant.BATCH ==0){
writeDate(userSize, puts);
}
}
writeDate(userSize, puts);
HDFSReadLog.writeLog("analysis " +userSize +" users");
} private static void writeDate(int userSize, List<Put> puts) {
try {
table.put(puts);
HDFSReadLog.writeLog("write "+userSize + " item.");
} catch (IOException e) {
e.printStackTrace();
HDFSReadLog.writeLog("write "+userSize + " error.");
HDFSReadLog.writeLog(e.getMessage());
}
} static HTable table = null;
// static HTablePool pool = null;
static{
try {
        // 创建HTable对象,对应hbase 的table
table = new HTable(HBaseConf.getConf(),Constant.HBASE_TABLE);
        // 如果表不存在就创建一个
fitTable(Constant.HBASE_TABLE);
} catch (IOException e) {
e.printStackTrace();
HDFSReadLog.writeLog("create table error.");
HDFSReadLog.writeLog(e.getMessage());
}
} /**
* if table is not exists, create it
* @param tab
* @throws IOException
*/
private static void fitTable(String tab) throws IOException { HBaseAdmin admin = new HBaseAdmin(HBaseConf.getConf());
if (admin.tableExists(tab)) {
HDFSReadLog.writeLog(tab + " exists");
} else {
        
HTableDescriptor tableDesc = new HTableDescriptor(tab);
        // 建表的使用要指定 column family
tableDesc.addFamily(new HColumnDescriptor("cf"));
admin.createTable(tableDesc);
HDFSReadLog.writeLog(tab + " create success");
} } }

HBaseConfig(z这个必须,不然会卡在table.put 上面,没有报错,就是卡)

public class HBaseConf {

    public static Configuration conf = null;
public static Configuration getConf(){
if (conf == null){
conf = new Configuration();
String path = Constant.getSysEnv("HBASE_HOME") +"/conf/";
HDFSReadLog.writeLog("Get HBase home : " + path); // hbase conf
conf.setClassLoader(HBaseConf.class.getClassLoader());
conf.addResource(path + "hbase-default.xml");
conf.addResource(path + "hbase-site.xml");
conf = HBaseConfiguration.create(conf);
HDFSReadLog.writeLog("hbase.zookeeper.quorum : " + conf.get("hbase.zookeeper.quorum"));
}
    // 如果配置文件读不到,set这两个参数,也可以读
/*conf.set("hbase.zookeeper.quorum", "ip,ip,ip");
conf.set("hbase.zookeeper.property.clientPort", "port");*/
return conf;
} }  

注: hbase的配置文件很重要,如果读不到 “hbase.zookeeper.quorum” 会默认到 localhost,然后在table.put 的时候,卡住。

table.put(),不止可以put 一个Put,也可以put 一个Put的list,这样算是到底批量提交了。

一个一个写,太慢了。这边的结果:334403 条数据,写了112秒

 

Java往hbase写数据的更多相关文章

  1. Hbase写数据,存数据,读数据的详细过程

    Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 出发Compact合并操作 -> 多 ...

  2. HBase写数据

    1 多HTable并发写 创建多个HTable客户端用于写操作,提高写数据的吞吐量,一个例子: static final Configuration conf = HBaseConfiguration ...

  3. java向文件写数据的3种方式

    下边列举出了三种向文件中写入数据的方式,当然还有其他方式,帮助自己理解文件写入类的继承关系.类的关系: file->fileoutputstream->outputstreamWriter ...

  4. 线上问题排查-HBase写数据出现NotServingRegionException(Region ... is not online)异常

    今天线上遇到一个问题:有一台服务器的cpu持续冲高,排查发现是我们的一个java应用进程造成的,该进程在向hbase中写入数据时,日志不断地打印下面的异常: org.apache.hadoop.hba ...

  5. 在Windows下MyEclipse运行JAVA程序连接HBASE读取数据出错

    运行环境:Hadoop-2.5.0+Hbase-0.98.6 问题描述: 15/06/11 15:35:50 ERROR Shell: Failed to locate the winutils bi ...

  6. java向excel写数据

    package pymongo1; import java.io.File;import java.io.IOException;import java.io.OutputStream; import ...

  7. HBase读写数据的详细流程及ROOT表/META表介绍

    一.HBase读数据流程 1.Client访问Zookeeper,从ZK获取-ROOT-表的位置信息,通过访问-ROOT-表获取.META.表的位置,然后确定数据所在的HRegion位置: 2.Cli ...

  8. 【hbase】——HBase 写优化之 BulkLoad 实现数据快速入库

    1.为何要 BulkLoad 导入?传统的 HTableOutputFormat 写 HBase 有什么问题? 我们先看下 HBase 的写流程: 通常 MapReduce 在写HBase时使用的是 ...

  9. 【原创】大叔问题定位分享(16)spark写数据到hive外部表报错ClassCastException: org.apache.hadoop.hive.hbase.HiveHBaseTableOutputFormat cannot be cast to org.apache.hadoop.hive.ql.io.HiveOutputFormat

    spark 2.1.1 spark在写数据到hive外部表(底层数据在hbase中)时会报错 Caused by: java.lang.ClassCastException: org.apache.h ...

随机推荐

  1. 枚举+最短路 poj1062

    这里有个非常坑的地方,还有比酋长地位还更高的人,我也是看了论坛才知道... 在这里我把编号1看成终点,优惠价格看成相应的替代品编号到可替代品编号的权值,比如说有了2再加8000就到了1,那么2到1的弧 ...

  2. tcp/ip通信第5期之客户机端程序

    /*此程序是tcp/ip通信的客户机端程序, 测试运行在redhat6系统上 重构readline函数,解决粘包问题——利用“\n”识别一个消息边界 */ #include<stdio.h> ...

  3. 【Android端 adb相关】adb相关总结

    一.什么是adb? adb的全称是:Android Debug Bridge,adb命令的构成是三部分,分别是:服务器.客户端.后台程序: (1)客户端:一个在PC上运行的客户端.可以通过shell端 ...

  4. HDU 1166 敌兵布阵(线段树单点更新,区间查询)

    描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...

  5. css重要知识点

    1.float:left;表示靠左显示.它是相对于距离最近的且以relative作为position的父元素而言的. 2.块级元素和行内元素 块级元素:占据了一个矩形框的元素,display属性的值为 ...

  6. python调试工具pdb

    pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++). 命令 简写命令 作用 break b 设置断点 continue c 继续执行程序 list l 查看当前行的代码段 step ...

  7. 【gRPC使用问题2】按照问题1操作生成出来的代码,import的proto内定义的message未生成出来

    1.问题 其实元数据proto里是有定义message,但是 这个message的定义是在另一个 proto文件内,被 api.proto导入,事实上 我是对 api.proto 进行命令行生成代码的 ...

  8. linux minitools+minicom 安装及使用

    1,通过SSH将minitools的安装包传到ubuntu 文件下, 2,   解压minitools.tgz  (具体方法见上一篇) 3,命令安装minicom  :   apt-get insta ...

  9. C# Request.RawUrl与Request.Url的区别

    RawUrl——不包含域名及端口的地址 Url——包含域名,最全

  10. C++命名空间学习笔记

    1 模块化和界面 任何实际程序都是有一些部分组成的.通过将程序进行模块化可以使我们的程序更加清晰,有助于多人合作和维护. 将一个程序进行模块化以后,当其中一个模块调用另一个模块时,它不需要知道其具体实 ...