使用面向对象将Kafka数据导入hbase

pom导包

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka-clients</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka_2.11</artifactId>
  <version>2.0.0</version>
</dependency>
<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka-streams</artifactId>
  <version>2.0.0</version>
</dependency>
<dependency>
  <groupId>org.apache.hbase</groupId>
  <artifactId>hbase-client</artifactId>
  <version>2.4.0</version>
</dependency>
<dependency>
  <groupId>org.apache.hbase</groupId>
  <artifactId>hbase-server</artifactId>
  <version>2.4.0</version>
</dependency>
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>3.7.0</version>
</dependency>

 先写接口Iworker

package oop.handle.Write;

import java.io.IOException;

public interface Iworker {
    // 抽象方法,用于填充数据,抛出IOException异常
 abstract void fillData() throws IOException;
}

 IWrite接口

 

package oop.handle.Write;
import org.apache.kafka.clients.consumer.ConsumerRecords;

import java.io.IOException;

public interface IWrite {
    // 向ConsumerRecords中写入数据
   void write(ConsumerRecords<String,String> records) throws IOException;
}

 HbaseWorker类实现连接Kafka和导数据

 

package oop.handle.Write;

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.io.IOException;
import java.time.Duration;
import java.util.Collections;
import java.util.Properties;

public class HbaseWorker implements Iworker {
    KafkaConsumer<String,String> consumer;
    IWrite write;
    // 构造函数,初始化KafkaConsumer和IWrite对象
    public HbaseWorker(String topicName,String consumerGroupName,IWrite write){
        this.write= write;
        // 创建Properties对象,用于配置KafkaConsumer
        Properties prop = new Properties();
        // 设置Kafka集群的地址
        prop.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.52.146:9092");
        // 设置key的反序列化类
        prop.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        // 设置value的反序列化类
        prop.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class);
        // 设置是否自动提交offset
        prop.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,"false");
        // 设置从何处开始消费
        prop.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,"earliest");
        // 设置消费组的名称
        prop.put(ConsumerConfig.GROUP_ID_CONFIG,consumerGroupName);
        // 设置自动提交offset的时间间隔
        prop.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG,"1000");
        // 创建KafkaConsumer对象
        consumer = new KafkaConsumer<>(prop);
        // 订阅指定的topic
        consumer.subscribe(Collections.singleton(topicName));
    }
    // 实现fillData方法,从Kafka中拉取数据并写入Hbase
    @Override
    public void fillData() throws IOException {
        while (true){
            // 从Kafka中拉取数据
            ConsumerRecords<String,String> records = consumer.poll(Duration.ofMillis(100));
            // 将数据写入Hbase
            write.write(records);
        }
    }
}

 HbaseWrite类,实现连接hbase

 

package oop.handle.Write;

import oop.handle.IParseRecord;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.kafka.clients.consumer.ConsumerRecords;

import java.io.IOException;
import java.util.ArrayList;

public class HbaseWrite implements IWrite {
    BufferedMutator mutator;
    IParseRecord handler;
    // 构造函数,传入目标表名、处理记录的handler、主机名、端口、hdfs路径
    public HbaseWrite(String targetTableName, IParseRecord handler, String host, String port, String hdfspath)throws IOException {
        this.handler=handler;
        // 创建HBase配置
        Configuration conf = HBaseConfiguration.create();
        // 设置Zookeeper主机名
        conf.set("hbase.zookeeper.quorum",host);
        // 设置Zookeeper客户端端口
        conf.set("hbase.zookeeper.property.clientPort",port);
        // 设置HBase根目录
        conf.set("hbase.rootdir",hdfspath);
        // 创建HBase连接
        Connection connection = ConnectionFactory.createConnection(conf);
        // 获取目标表名
        TableName tableName = TableName.valueOf(targetTableName);
        // 创建BufferedMutator异常监听器
        BufferedMutator.ExceptionListener listener = new BufferedMutator.ExceptionListener() {
            @Override
            public void onException(RetriesExhaustedWithDetailsException e, BufferedMutator bufferedMutator) throws RetriesExhaustedWithDetailsException {
                // 获取异常数量
                int nums = e.getNumExceptions();
                // 遍历异常
                for (int i = 0; i < nums; i++) {
                    // 打印异常信息
                    System.out.println("失败 保存"+e.getRow(i)+".");
                }
            }
        };
        // 创建BufferedMutator参数
        BufferedMutatorParams params = new BufferedMutatorParams(tableName);
        // 设置写缓冲区大小
        params.writeBufferSize(1024*1024);
        // 设置异常监听器
        params.listener(listener);
        // 获取BufferedMutator
        BufferedMutator mutator = connection.getBufferedMutator(params);
    }
    // 构造函数,传入目标表名、处理记录的handler
    public HbaseWrite(String targetTableName, IParseRecord handler) throws IOException {
      // 调用另一个构造函数,传入默认的主机名、端口、hdfs路径
      this(targetTableName,handler,"192.168.52.146","2181","hdfs://localhost:9000/hbase");
}
    // 重写write方法,传入ConsumerRecords
    @Override
    public void write(ConsumerRecords<String, String> records) throws IOException {
        // 如果records不为空且handler不为空
        if (records.count()>0 && handler!=null){
            // 解析records
            ArrayList<Put>list=handler.parse(records);
            // 如果解析结果不为空
            if (list.size()>0){
                // 保存解析结果
                mutator.mutate(list);
            }
        }
    }
}

EventAttendeeToHb2启动类,调用类方法就可以了

 

package oop.handle.Write;

import oop.handle.EventAttendeeHandler;

import java.io.IOException;

public class EventAttendeeToHb2 {
    public static void main(String[] args) throws IOException {
        // 创建一个HbaseWrite对象,用于写入数据到Hbase数据库中
        IWrite write=new HbaseWrite("events_db:event_attendee",new EventAttendeeHandler());
        // 创建一个HbaseWorker对象,用于处理数据
        Iworker worker=new HbaseWorker("train","train_group1",write);
        // 填充数据
        worker.fillData();
    }
}

 使用面向对象可以在后续开发时更好进行特定修改和扩展

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,通过Flink将Kafka数据存入HBase: ``` import org.apache.flink.api.common.functions.MapFunction import org.apache.flink.api.common.serialization.SimpleStringSchema import org.apache.flink.streaming.api.scala._ import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer import org.apache.flink.streaming.connectors.hbase.* import org.apache.hadoop.hbase.client.Put import org.apache.hadoop.hbase.util.Bytes object KafkaToHBase { def main(args: Array[String]): Unit = { val env = StreamExecutionEnvironment.getExecutionEnvironment val kafkaProps = new Properties() kafkaProps.setProperty("bootstrap.servers", "localhost:9092") kafkaProps.setProperty("group.id", "test") val kafkaConsumer = new FlinkKafkaConsumer[String]("topic", new SimpleStringSchema(), kafkaProps) val hbaseProps = new Properties() hbaseProps.setProperty("zookeeper.quorum", "localhost:2181") hbaseProps.setProperty("zookeeper.znode.parent", "/hbase-unsecure") hbaseProps.setProperty("write.buffer.max.size", "20971520") // 20 MB val hbaseOutputFormat = new HBaseOutputFormat(new org.apache.hadoop.hbase.client.ConnectionConfiguration(hbaseProps)) val stream = env .addSource(kafkaConsumer) .map(new MapFunction[String, Put] { val cfBytes = Bytes.toBytes("cf") override def map(value: String): Put = { val rowkey = "some row key" val put = new Put(Bytes.toBytes(rowkey)) put.addColumn(cfBytes, Bytes.toBytes("data"), Bytes.toBytes(value)) put } }) .output(hbaseOutputFormat) env.execute("Kafka to HBase") } } ``` 需要注意的点: 1. 在HBaseOutputFormat实例化时需要传入一个org.apache.hadoop.hbase.client.ConnectionConfiguration对象,用于与HBase进行连接。 2. 在map函数Kafka数据转化为HBase Put对象时需要指定一个rowkey。这个rowkey可以按照需要进行设计,例如可以设置成Kafka数据的某个字段。 3. 在map函数Kafka数据转化为HBase Put对象时需要指定column family和column qualifier以及对应的value。这里使用了一个名为“cf”的column family和一个名为“data”的column qualifier。如果需要根据业务需要进行更改。 4. HBaseOutputFormat默认是批量写入模式,需要在HBase配置文件指定write ahead log的大小,以及每次写入的缓冲区大小等。如果需要进行实时写入,则需要将批量写入模式关闭。可以通过在HBase连接配置设置"HBASE_CLIENT_OPERATION_TIMEOUT"来达到此目的。单位是毫秒,设置为0表示禁用批处理模式。 5. 在实际使用时需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值