获取kafka最新offset-java
之前笔者曾经写过通过scala的方式获取kafka最新的offset
但是大多数的情况我们需要使用java的方式进行获取最新offset
scala的方式可以参考: http://www.cnblogs.com/weishao-lsv/p/8159396.html
以下是通过java代码获取kafka最新offset
GetOffsetShellWrap
public class GetOffsetShellWrap { private static Logger log = LoggerFactory.getLogger(GetOffsetShellWrap.class); private String topic; private int port; private String host; private int time; public GetOffsetShellWrap(String topic,int port,String host,int time) { this.topic = topic; this.port = port; this.host = host; this.time = time; } public Map<String, String> getEveryPartitionMaxOffset() { //1.获取topic所有分区 以及每个分区的元数据 => 返回 Map<分区id,分区元数据> TreeMap<Integer, PartitionMetadata> partitionIdAndMeta = findTopicEveryPartition(); Map<String, String> map = new HashMap<String, String>(); for (Entry<Integer, PartitionMetadata> entry : partitionIdAndMeta.entrySet()) { int leaderPartitionId = entry.getKey(); //2.根据每个分区的元数据信息 ==> 获取leader分区的主机 String leadBroker = entry.getValue().leader().host(); String clientName = "Client_" + topic + "_" + leaderPartitionId; SimpleConsumer consumer = new SimpleConsumer(leadBroker, port,100000, 64 * 1024, clientName); //3.从leader主机获取分区的offset long readOffset = getLastOffset(consumer, topic, leaderPartitionId, clientName); map.put(String.valueOf(leaderPartitionId), String.valueOf(readOffset)); if (consumer != null) consumer.close(); } return map; } private TreeMap<Integer, PartitionMetadata> findTopicEveryPartition(){ TreeMap<Integer, PartitionMetadata> map = new TreeMap<Integer, PartitionMetadata>(); SimpleConsumer consumer = null; try { consumer = new SimpleConsumer(host, port, 100000, 64 * 1024,"leaderLookup" + new Date().getTime()); List<String> topics = Collections.singletonList(topic); TopicMetadataRequest req = new TopicMetadataRequest(topics); kafka.javaapi.TopicMetadataResponse resp = consumer.send(req); List<TopicMetadata> metaData = resp.topicsMetadata(); if(metaData!=null && !metaData.isEmpty()){ TopicMetadata item = metaData.get(0); for (PartitionMetadata part : item.partitionsMetadata()) { map.put(part.partitionId(), part); } } } catch (Exception e) { e.printStackTrace(); } finally { if (consumer != null) consumer.close(); } return map; } private long getLastOffset(SimpleConsumer consumer, String topic,int leaderPartitionId, String clientName) { TopicAndPartition topicAndPartition = new TopicAndPartition(topic,leaderPartitionId); Map<TopicAndPartition, PartitionOffsetRequestInfo> requestInfo = new HashMap<TopicAndPartition, PartitionOffsetRequestInfo>(); requestInfo.put(topicAndPartition, new PartitionOffsetRequestInfo(time, 1)); kafka.javaapi.OffsetRequest request = new kafka.javaapi.OffsetRequest(requestInfo, kafka.api.OffsetRequest.CurrentVersion(),clientName); OffsetResponse response = consumer.getOffsetsBefore(request); if (response.hasError()) { log.error("Error fetching data Offset Data the Broker. Reason: "+ response.errorCode(topic, leaderPartitionId)); return 0; } long[] offsets = response.offsets(topic, leaderPartitionId); return offsets[0]; } }
GetOffsetShellWrapJavaTest
public class GetOffsetShellWrapJavaTest { public static void main(String[] args) { int port = 9092; String topic = "2017-11-6-test"; int time = -1; GetOffsetShellWrap offsetSearch = new GetOffsetShellWrap(topic,port,"hadoop-01",time); Map<String, String> map = offsetSearch.getEveryPartitionMaxOffset(); for (String key : map.keySet()) { System.out.println(key+"---"+map.get(key)); } } }
结果输出:
0---16096 1---15930 2---16099
获取kafka最新offset-java的更多相关文章
- 获取kafka最新offset-scala
无论是在spark streaming消费kafka,或是监控kafka的数据时,我们经常会需要知道offset最新情况 kafka数据的topic基于分区,并且通过每个partition的主分区可以 ...
- sparkStreaming获取kafka数据(java版本)
环境 spark-2.2.0 kafka_2.11-0.10.0.1 jdk1.8 配置好jdk,创建项目并将kafka和spark的jar包添加到项目中,除此之外还需要添加spark-streami ...
- 工具篇-Spark-Streaming获取kafka数据的两种方式(转载)
转载自:https://blog.csdn.net/weixin_41615494/article/details/7952173 一.基于Receiver的方式 原理 Receiver从Kafka中 ...
- Spark-Streaming获取kafka数据的两种方式:Receiver与Direct的方式
简单理解为:Receiver方式是通过zookeeper来连接kafka队列,Direct方式是直接连接到kafka的节点上获取数据 Receiver 使用Kafka的高层次Consumer API来 ...
- SparkStreaming获取kafka数据的两种方式:Receiver与Direct
简介: Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式,可以简单理解成: Receiver方式是通过zookeeper来连接kafka队列, Dire ...
- spark-streaming获取kafka数据的两种方式
简单理解为:Receiver方式是通过zookeeper来连接kafka队列,Direct方式是直接连接到kafka的节点上获取数据 一.Receiver方式: 使用kafka的高层次Consumer ...
- 获取Kafka每个分区最新Offset的几种方法
目录 脚本方法 Java 程序 参考资料 脚本方法 ./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhos ...
- 关于怎么获取kafka指定位置offset消息(转)
1.在kafka中如果不设置消费的信息的话,一个消息只能被一个group.id消费一次,而新加如的group.id则会被“消费管理”记录,并指定从当前记录的消息位置开始向后消费.如果有段时间消费者关闭 ...
- 如何获取流式应用程序中checkpoint的最新offset
对于流式应用程序,保证应用7*24小时的稳定运行,是非常必要的.因此对于计算引擎,要求必须能够适应与应用程序逻辑本身无关的问题(比如driver应用失败重启.网络问题.服务器问题.JVM崩溃等),具有 ...
随机推荐
- vuex 管理状态
来分析下vuex的管理状态吧,如果你用过react中的redux的管理树,那我觉得vuex对你来说很容易掌握 如果你还是不太熟悉vuex是什么,那先看下官网https://vuex.vuejs.org ...
- javaIO--数据流之IO流与字节流
0.IO流 0.1.IO(Input Output)流的概念 Java中将不同设备之间的数据传输抽象为“流”:Stream设备指的是:磁盘上的文件,网络连接,另一个主机等等 按流向分:输入流,输出流: ...
- c语言数组那些骚事儿
找出最大和第二大值#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { , , ...
- buuctf@test_your_nc
测试你的 nc 技巧 :)
- The Preliminary Contest for ICPC Asia Shanghai 2019 B. Light bulbs
题目:https://nanti.jisuanke.com/t/41399 思路:差分数组 区间内操作次数为奇数次则灯为打开状态 #include<bits/stdc++.h> using ...
- [CF11D]A Simple Task 题解
题解 我们从最简单的思路开始考虑,首先看到题目发现\(n\)非常小,于是很容易想到状态压缩. 我们考虑比较直觉的状态,f[i][j][k]表示以i为起点,当前在j,之前去过的点状态为k的简单环的方案数 ...
- 编译高博十四讲代码遇到依赖项g2o和cholmod的坑
1. 找不到g2o库!在CMakeLists.txt中使用指令 message(STATUS "${G2O_FOUND}") 打印结果为NO. 问题描述: CMakeLists.t ...
- JMS学习六(ActiveMQ消息传送模型)
ActiveMQ 支持两种截然不同的消息传送模型:PTP(即点对点模型)和Pub/Sub(即发布 /订阅模型),分别称作:PTP Domain 和Pub/Sub Domain. 一.PTP消息传送模型 ...
- Java 生成二进制加减法题目
日常算数,有益身心健康. int a; int b; int result; int symbol; int count = 50; Random random = new Random(); for ...
- 根据linux自带的JDK,配置JAVA_HOME目录
在配置hadoop是,进行格式化hadoop的时候,出现找不到jdk 我用centos6.5是64位的, 发现本机有java ,就找了一下其位置 找到了jdk-1.7.0_75 which java ...