Java往hbase写数据

本文详细介绍了如何使用Java API将HDFS中的数据写入HBase,包括配置HBase环境、创建表、批量写入数据等关键步骤,并分享了实际操作中遇到的问题及解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上篇读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秒

 

 

 

 

转载于:https://www.cnblogs.com/Springmoon-venn/p/7256014.html

### 使用 Java API 向 HBase 写入数据HBase 写入数据可以通过 HBase 提供的 Java API 实现。以下是详细的说明和示例代码。 #### 1. 添加 Maven 依赖 为了使用 HBaseJava API,需要在项目中引入必要的依赖项。通常情况下,这包括 `hbase-client` 和 `hadoop-client` 库[^5]: ```xml <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.4.2</version> </dependency> ``` #### 2. 配置 HBase 连接 在写入数据之前,需要建立与 HBase 数据库的连接。可以使用 `Configuration` 类来设置 HBase 的配置参数,并通过 `Connection` 对象访问数据库[^4]。 ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; public class HBaseExample { public static Connection getConnection() throws Exception { Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "localhost"); config.set("hbase.zookeeper.property.clientPort", "2181"); return ConnectionFactory.createConnection(config); } } ``` #### 3. 创建表并写入数据 假设已经有一个名为 `my_table` 的表,其中包含一个列族 `cf`。下面是一个完整的示例,展示如何向该表插入一行或多行数据。 ```java import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; public class WriteDataToHBase { public static void main(String[] args) throws IOException, InterruptedException { try (Connection connection = HBaseExample.getConnection()) { TableName tableName = TableName.valueOf("my_table"); // 获取 Table 对象 try (Table table = connection.getTable(tableName)) { // 插入单条记录 Put putSingle = new Put(Bytes.toBytes("row1")); putSingle.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("qualifier1"), Bytes.toBytes("value1")); table.put(putSingle); System.out.println("单条记录已成功插入!"); // 批量插入多条记录 Put putMultiple1 = new Put(Bytes.toBytes("row2")); putMultiple1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("qualifier2"), Bytes.toBytes("value2")); Put putMultiple2 = new Put(Bytes.toBytes("row3")); putMultiple2.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("qualifier3"), Bytes.toBytes("value3")); Put putMultiple3 = new Put(Bytes.toBytes("row4")); putMultiple3.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("qualifier4"), Bytes.toBytes("value4")); table.put(Arrays.asList(putMultiple1, putMultiple2, putMultiple3)); System.out.println("批量记录已成功插入!"); } catch (Exception e) { e.printStackTrace(); } } } } ``` 上述代码展示了两种方式: - **单条记录插入**:通过 `Put` 对象构建一条记录,并调用 `table.put()` 方法完成插入。 - **批量记录插入**:将多个 `Put` 对象放入列表中,再通过 `table.put(List<Put>)` 方法一次性提交。 #### 4. 关闭资源 每次操作完成后,务必关闭 `Table` 和 `Connection` 资源以释放内存。 --- ### 注意事项 - 确保 Zookeeper 地址和服务端口正确无误。 - 如果需要处理大量数据,建议启用批处理模式或结合 MapReduce 工具进行高效导入[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值