不使用es-hadoop的saveToES,与scala版本冲突问题太多。
不使用bulkprocessor,异步提交,es容易oom,速度反而不快。
使用BulkRequestBuilder同步提交。

主要代码

public static void main(String[] args){
System.setProperty("hadoop.home.dir", "D:\\hadoop");
System.setProperty("es.set.netty.runtime.available.processors", "false");
SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("SendRecord");
conf.set("spark.streaming.backpressure.enabled", "true");
conf.set("spark.streaming.receiver.maxRate", "1000");
conf.set("spark.streaming.kafka.maxRatePerPartition", "1000");
conf.set("es.nodes", "eshost");
conf.set("es.port", "9200");
JavaStreamingContext ssc = new JavaStreamingContext(conf, Durations.seconds(2)); Map<String, Object> kafkaParams = new HashMap<>();
kafkaParams.put("bootstrap.servers", "kafkahost:9092");
kafkaParams.put("key.deserializer", StringDeserializer.class);
kafkaParams.put("value.deserializer", StringDeserializer.class);
kafkaParams.put("group.id", "sparkGroup4");
kafkaParams.put("auto.offset.reset", "latest");
kafkaParams.put("enable.auto.commit", false); Collection<String> topics = Arrays.asList("users");
JavaInputDStream<ConsumerRecord<String, String>> stream = KafkaUtils.createDirectStream
(ssc, LocationStrategies.PreferConsistent(), ConsumerStrategies.<String, String>Subscribe(topics, kafkaParams)); JavaDStream<User> kafkaDStream = stream.map(new Function<ConsumerRecord<String, String>, User>() {
@Override
public User call(ConsumerRecord<String, String> record) throws Exception {
Gson gson = new Gson();
return gson.fromJson(record.value(), User.class);
}
}); kafkaDStream.foreachRDD(new VoidFunction<JavaRDD<User>>() {
@Override
public void call(JavaRDD<User> userJavaRDD) throws Exception {
userJavaRDD.foreachPartition(new VoidFunction<Iterator<User>>() {
@Override
public void call(Iterator<User> userIterator) throws Exception {
TransportClient client = ESClient.getClient();
BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
Map<String, Object> map = new HashMap<>();
while(userIterator.hasNext()){
User user = userIterator.next();
map.put("name", user.getName());
map.put("age", user.getAge());
map.put("desc", user.getDescription());
IndexRequest request = client.prepareIndex("users", "info").setSource(map).request();
bulkRequestBuilder.add(request);
}
if(bulkRequestBuilder.numberOfActions() > 0){
BulkResponse bulkItemResponses = bulkRequestBuilder.execute().actionGet();
}
}
});
}
});
ssc.start(); try {
// Wait for the computation to terminate.
ssc.awaitTermination();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

  

ESClient:

public class ESClient {
public static TransportClient getClient(){
return Holder.client;
} private static class Holder{
private static TransportClient client;
static{
try {
Settings setting = Settings.builder()
.put("cluster.name", "es")
.put("client.transport.sniff", false)
.put("client.transport.ping_timeout", "60s")
.put("client.transport.nodes_sampler_interval", "60s")
.build();
client = new PreBuiltTransportClient(setting);
client.addTransportAddress(new TransportAddress(new InetSocketAddress("eshost",9300)));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}

  

sparkstreaming消费kafka后bulk到es的更多相关文章

  1. SparkStreaming消费kafka中数据的方式

    有两种:Direct直连方式.Receiver方式 1.Receiver方式: 使用kafka高层次的consumer API来实现,receiver从kafka中获取的数据都保存在spark exc ...

  2. SparkStreaming消费Kafka,手动维护Offset到Mysql

    目录 说明 整体逻辑 offset建表语句 代码实现 说明 当前处理只实现手动维护offset到mysql,只能保证数据不丢失,可能会重复 要想实现精准一次性,还需要将数据提交和offset提交维护在 ...

  3. spark-streaming集成Kafka处理实时数据

    在这篇文章里,我们模拟了一个场景,实时分析订单数据,统计实时收益. 场景模拟 我试图覆盖工程上最为常用的一个场景: 1)首先,向Kafka里实时的写入订单数据,JSON格式,包含订单ID-订单类型-订 ...

  4. Spark streaming消费Kafka的正确姿势

    前言 在游戏项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从kafka中不 ...

  5. [Golang] 消费Kafka的日志提交到ElasticSearch

    0x0 需求 消费Kafka的日志并写入ElasticSearch供查询 0x1 依赖库 golang版Kafka客户端 https://github.com/Shopify/sarama golan ...

  6. SparkStreaming获取kafka数据的两种方式:Receiver与Direct

    简介: Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式,可以简单理解成: Receiver方式是通过zookeeper来连接kafka队列, Dire ...

  7. 【Spark】SparkStreaming和Kafka的整合

    文章目录 Streaming和Kafka整合 概述 使用0.8版本下Receiver DStream接收数据进行消费 步骤 一.启动Kafka集群 二.创建maven工程,导入jar包 三.创建一个k ...

  8. 图解SparkStreaming与Kafka的整合,这些细节大家要注意!

    前言 老刘是一名即将找工作的研二学生,写博客一方面是复习总结大数据开发的知识点,一方面是希望帮助更多自学的小伙伴.由于老刘是自学大数据开发,肯定会存在一些不足,还希望大家能够批评指正,让我们一起进步! ...

  9. SparkStreaming和Kafka基于Direct Approach如何管理offset实现exactly once

    在之前的文章<解析SparkStreaming和Kafka集成的两种方式>中已详细介绍SparkStreaming和Kafka集成主要有Receiver based Approach和Di ...

随机推荐

  1. H3C 帧中继配置示例

  2. KMP未优化模板、

    要理解KMP最重要的一点就是防止重复的回溯. !!!很重要!!!很重要!!!很重要 要了解KMP可以去:http://www.cnblogs.com/dolphin0520/archive/2011/ ...

  3. Hibernate @OneToOne懒加载实现解决方案

    在hibernate注解(三)中,我提高过一对一(@OneToOne)懒加载失效的问题.虽然给出了解决方法,但并没有给出完整的解决方案.今天我专门针对该问题进行讨论.至于懒加载失效的原因,在之前的文章 ...

  4. HDU 6438"Buy and Resell"(贪心+优先级队列)

    传送门 •参考资料 [1]:HDU6438(优先队列+思维) •题意 有n个城市,第 i 天你会达到第 i 个城市: 在第 i 个城市中,你可以用 ai 元购买一个物品,或者用 ai 元卖掉一个物品, ...

  5. P1038 间谍入侵

    题目描述 爱丽丝魔法王国成立10周年,于是决定矩形国庆大阅兵. 在国庆大阅兵期间,为了防止暗黑王国的间谍乔装成平民混入,需要对每一个进城的人做检测. 因为暗黑王国的人长得和爱丽丝魔法王国的人长得很像, ...

  6. linux 快速和慢速处理

    老版本的 Linux 内核尽了很大努力来区分"快速"和"慢速"中断. 快速中断是那些能够很 快处理的, 而处理慢速中断要特别地长一些. 慢速中断可能十分苛求处理 ...

  7. sqlyog提示:没有执行查询。请在 SQL 窗口中输入查询或将光标放在一个查询上。

    以下内容纯属猜测: sqlyog 在执行输入的sql语句时,对已经执行过的语句,是不会再执行的,所以出现这个问题,很可能是sql语句没有修改,就试图执行第二遍.

  8. HDU - 1005 Number Sequence (矩阵快速幂)

    A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mo ...

  9. 14.python类型总结,集合,字符串格式化

    借鉴:https://www.cnblogs.com/linhaifeng/articles/5935801.html  https://www.cnblogs.com/wupeiqi/article ...

  10. javascript数组大全(一张图列出数组的所有方法)

    把所有数组的方法列在了一张图上,为了自己温故一下,也为了以后忘记时好查阅. 如果大家在上面查阅方法,可以找到对应的方法名,看前面简单的注释,还是不能明白的话,可以看一下官网说明,地址给大家列出来,MD ...