kafka topic 发送消息到 hbase

Kafka消费者数据处理并存储到HBase
该代码示例展示了如何配置Kafka消费者从指定主题消费数据,然后将数据处理后存入HBase数据库。首先配置Kafka消费者连接信息,然后设置HBase的连接参数。数据处理过程中,将消费到的用户ID和朋友ID拆分并创建Put对象写入HBase表。程序在一个无限循环中持续消费和处理数据,每次处理一批数据后更新计数并休眠10毫秒。

目录

一、配置kafka信息

二、配置hbase信息,连接hbase数据库

需要先在hbase创建对应的命令空间和table

Put对象,按照不同需求,从文件中截取对应字段

三、完整代码


一、配置kafka信息

        Properties properties = new Properties();
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.91.180:9092");
        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);

        properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");  // 手动提交
        properties.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");   // 自动提交时,提交时间
        properties.put(ConsumerConfig.GROUP_ID_CONFIG, "userfriend_group2");
        properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");

        // 配置Kafka信息。消费消息
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);
        consumer.subscribe(Collections.singleton("user_friends"));

二、配置hbase信息,连接hbase数据库

需要先在hbase创建对应的命令空间和table

Put对象,按照不同需求,从文件中截取对应字段

     // 配置Kafka信息。消费消息
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties
<think>我们使用Flink消费Kafka数据,然后写入HBase。这里需要以下步骤: 1. 创建Flink环境,设置Kafka source。 2. 定义HBase sink,将数据写入HBase。 3. 执行作业。 假设Kafka中的数据是字符串格式(例如JSON),我们将其解析为需要的格式,然后写入HBase。 这里我们使用Flink 1.14版本,Kafka connector和HBase connector。注意:Flink官方没有直接提供HBase connector,但我们可以通过自定义RichSinkFunction来实现。 步骤: 1. 添加依赖(在pom.xml中): - Flink Kafka connector - Flink HBase connector(实际上,Flink没有官方的HBase connector,所以我们需要自己实现,或者使用第三方库。这里我们自己实现一个sink) - HBase客户端依赖 2. 编写代码: - 创建Flink执行环境 - 设置Kafka消费者 - 数据转换(根据业务需求,将Kafka中的字符串转换为HBase的Put操作) - 自定义HBase sink 3. 自定义HBase sink:继承RichSinkFunction,在open方法中初始化HBase连接,在invoke方法中执行写入,在close方法中关闭连接。 注意:HBase的连接使用ConnectionFactory创建,并且使用连接池(通常一个TaskManager一个连接,每个并行度实例使用同一个连接)。 示例代码: 假设Kafka中的数据格式为:{"rowkey":"1", "name":"Alice", "age":25},我们要写入HBase表"user_info",列族为"cf",列名为"name"和"age"。 步骤: 1. 解析JSON字符串,得到rowkey和各个字段。 2. 构建HBase的Put对象。 3. 将Put对象写入HBase。 由于Flink没有内置的HBase sink,我们自定义一个。 代码结构: - 主类:FlinkKafkaToHBase - 自定义HBase sink:HBaseSink 依赖(Maven): ```xml <dependencies> <!-- Flink Core --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId> <version>1.14.4</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java_2.11</artifactId> <version>1.14.4</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-clients_2.11</artifactId> <version>1.14.4</version> </dependency> <!-- Kafka Connector --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_2.11</artifactId> <version>1.14.4</version> </dependency> <!-- HBase Client --> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.4.9</version> </dependency> <!-- JSON解析 --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-json</artifactId> <version>1.14.4</version> </dependency> </dependencies> ``` 代码实现:</think>### Flink消费Kafka数据存储到HBase的解决方案 #### 核心思路 1. **数据流**:Kafka → Flink(数据转换) → HBase 2. **关键组件**: - Kafka Consumer:订阅Kafka主题 - HBase Sink:自定义写入逻辑 - 连接管理:使用HBase连接池 #### 完整代码实现 ```java import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.configuration.Configuration; import org.apache.flink.streaming.api.functions.sink.RichSinkFunction; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import java.util.Properties; public class KafkaToHBaseJob { public static void main(String[] args) throws Exception { // 1. 创建Flink环境 final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 2. 配置Kafka消费者 Properties kafkaProps = new Properties(); kafkaProps.setProperty("bootstrap.servers", "kafka-server:9092"); kafkaProps.setProperty("group.id", "flink-hbase-group"); FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>( "input-topic", new SimpleStringSchema(), kafkaProps ); // 3. 添加Kafka源 DataStream<String> stream = env.addSource(kafkaConsumer); // 4. 数据转换(示例:解析JSON) DataStream<UserData> userStream = stream.map(new MapFunction<String, UserData>() { @Override public UserData map(String value) throws Exception { // 实际项目中使用JSON解析库(如Jackson) String[] parts = value.split(","); return new UserData( parts[0], // userID parts[1], // name Integer.parseInt(parts[2]) // age ); } }); // 5. 写入HBase userStream.addSink(new HBaseSink()); // 6. 执行任务 env.execute("Kafka to HBase Job"); } // 自定义数据结构 public static class UserData { public String userID; public String name; public int age; public UserData(String userID, String name, int age) { this.userID = userID; this.name = name; this.age = age; } } // 自定义HBase Sink public static class HBaseSink extends RichSinkFunction<UserData> { private Connection connection; private BufferedMutator mutator; @Override public void open(Configuration parameters) throws Exception { org.apache.hadoop.conf.Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "zk1:2181,zk2:2181,zk3:2181"); // 创建HBase连接池 connection = ConnectionFactory.createConnection(config); // 配置缓冲写 BufferedMutatorParams params = new BufferedMutatorParams(TableName.valueOf("user_table")) .writeBufferSize(2 * 1024 * 1024); // 2MB缓冲区 mutator = connection.getBufferedMutator(params); } @Override public void invoke(UserData user, Context context) throws Exception { // 构建Put对象 Put put = new Put(Bytes.toBytes(user.userID)); // RowKey = userID put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("name"), Bytes.toBytes(user.name)); put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("age"), Bytes.toBytes(user.age)); // 异步写入 mutator.mutate(put); } @Override public void close() throws Exception { if (mutator != null) mutator.flush(); if (connection != null) connection.close(); } } } ``` #### 代码解释 1. **Kafka消费者配置**: - `FlinkKafkaConsumer` 订阅指定主题 - 使用`SimpleStringSchema`解析消息为字符串 - 支持消费者组和故障恢复 2. **数据转换**: - `MapFunction`将原始字符串转换为结构化数据 - 实际项目中应使用JSON解析库(如Jackson) 3. **HBase Sink核心**: - **连接管理**: - 在`open()`中创建HBase连接池 - 使用`BufferedMutator`提高写入性能 - **异步写入**: - `mutate()`方法实现批量提交 - 缓冲区大小可配置(默认2MB) - **异常处理**: - 在`close()`中确保资源释放 - 自动处理连接重试 4. **HBase表结构**: ```bash # 创建示例表 create 'user_table', 'cf' ``` - RowKey: userID - 列族: cf - 列: name (String), age (Int) #### 优化建议 1. **性能优化**: - 增大`writeBufferSize`(但需考虑内存) - 设置`setAutoFlush(false)` - 使用异步连接池(AsyncConnection) 2. **容错机制**: ```java // 在invoke方法中添加重试逻辑 for (int i = 0; i < 3; i++) { try { mutator.mutate(put); break; } catch (IOException e) { if (i == 2) throw e; Thread.sleep(1000); } } ``` 3. **数据一致性**: - 启用Flink检查点机制 - 实现`CheckpointedFunction`接口 - 在检查点时强制刷新缓冲区 #### 部署注意事项 1. **依赖管理**: - 需包含HBase客户端JAR(hbase-client) - 添加Kafka连接器依赖(flink-connector-kafka) - 注意Hadoop/HBase版本兼容性 2. **配置建议**: ```yaml # flink-conf.yaml 关键配置 taskmanager.numberOfTaskSlots: 4 parallelism.default: 8 execution.checkpointing.interval: 60000 ``` 3. **监控指标**: - 监控Flink的`numRecordsOut`(输出记录数) - 跟踪HBase的`writeRequests`(写入请求) - 设置缓冲区溢出报警
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值