实际这是很久之前的问题了,当时没时间记录

这里简单回顾

项目基于

数据架构不方便说太细,最精简的

somedata-> [kafka]->spark-stream->elasticsearch

在 spark-streaming 引用了elasticsearch-hadoop(实际用的是为支持upsert doc自已打包的,见elasticsearch-hadoop 扩展定制 官方包以支持 update upsert doc)

问题是somedata定入kafka 200w条,最后到elasticsearch 190w条,有10w条不见了,也不报任何错误,批处理任务都是成功的。

首先排入kafka的消费问题,基于kafka自已实现了一套offset偏移维护的机制,不可能在消费kafka这一步丢数

唯一可能的就是 elasticsearch-hadoop 写 elasticsearch 这一步了

class SparkDStreamFunctions(ds: DStream[_]) extends Serializable {
def saveToEs(resource: String): Unit = { EsSparkStreaming.saveToEs(ds, resource) }
def saveToEs(resource: String, cfg: Map[String, String]): Unit = { EsSparkStreaming.saveToEs(ds, resource, cfg) }
def saveToEs(cfg: Map[String, String]): Unit = { EsSparkStreaming.saveToEs(ds, cfg) }
}

写入es调用包内的saveToEs方法,scala Unit 类似java 的void 这个方法是无返回值的。这里看不出什么线索

隐约能感觉到问题在哪里。

elasticsearch 是以乐观锁,版本号来实现基本的事务控制

操作elasticsearch时,相信大部分人都遇到过版本冲突的问题,报错类似

{
"error" : "VersionConflictEngineException[[website][2] [blog][1]:
version conflict, current [2], provided [1]]",
"status" : 409
}

但saveToEs这个方法是没有返回值的????也就是说能保证不会碰到这个错误?

当然不是,查看源码后发现

saveToEs无返回值,不代表就这批数据就完全成功了

实际会打印错误日志,不过只是在对这个包开启debug后才会打印,默认的情况下是不开的。包的开发者们认为这种版本冲突的错,如果抛到顶层,让整个任务失败太小题大作了,因此也不会往外抛,只会对比较"大"的异常才会抛到顶层。

实际上 elasticsearch-hadoop 会在一批任务写入失败后,隔一段时间重试,重试几次后,直接跳过这组数据,这数据等于就丢弃了。(代码就不贴了,因为github上最新的代码和我当时排查时不一样,可能有变化,问题已经解决,这次回顾也没精力细究了,如果贴错了还误人子弟)

官方的配置文档

https://www.elastic.co/guide/en/elasticsearch/hadoop/current/configuration.html

es.batch.write.retry.count (default )
Number of retries for a given batch in case Elasticsearch is overloaded and data is rejected. Note that only the rejected data is retried. If there is still data rejected after the retries have been performed, the Hadoop job is cancelled (and fails). A negative value indicates infinite retries; be careful in setting this value as it can have unwanted side effects.
es.batch.write.retry.wait (default 10s)
Time to wait between batch write retries that are caused by bulk rejections.

这两个参数就是重试相关的配置。

加了这3个参数后,就解决丢数的问题

"es.batch.write.retry.count" -> "-1",
"es.batch.write.retry.wait" -> "60s",
"es.batch.size.entries" -> "50"

es.batch.write.retry.count 表示无限重试,这个得谨慎着用最主要是改这个,我手里这套系统正好可以这么用。

es.batch.write.retry.wait 重试间隔由默认的10s改为60s,这个只是优化的

es.batch.size.entries也是优化的

es.batch.size.entries (default )
Size (in entries) for batch writes using Elasticsearch bulk API - ( disables it). Companion to es.batch.size.bytes, once one matches, the batch update is executed. Similar to the size, this setting is per task instance; it gets multiplied at runtime by the total number of Hadoop tasks running.

elasticsearch集群本身不提供权限控制,大部分架构都会在之前加个nginx

如果单个文档都很大的话,默认的1000个,可能会超过nginx 限制的单独http的body大小,nginx直接就让请求失败了,把这个数改小,是为了避免这种情况。

以elasticsearch-hadoop 向elasticsearch 导数,丢失数据的问题排查的更多相关文章

  1. 基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

    基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎 网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并 ...

  2. 我的ElasticSearch集群部署总结--大数据搜索引擎你不得不知

    摘要:世上有三类书籍:1.介绍知识,2.阐述理论,3.工具书:世间也存在两类知识:1.技术,2.思想.以下是我在部署ElasticSearch集群时的经验总结,它们大体属于第一类知识“techknow ...

  3. elasticsearch REST API方式批量插入数据

    elasticsearch REST API方式批量插入数据 1:ES的服务地址  http://127.0.0.1:9600/_bulk 2:请求的数据体,注意数据的最后一行记得加换行 { &quo ...

  4. [搜索]ElasticSearch Java Api(一) -添加数据创建索引

    转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...

  5. Hadoop vs Elasticsearch – Which one is More Useful

    Hadoop vs Elasticsearch – Which one is More Useful     Difference Between Hadoop and Elasticsearch H ...

  6. elasticsearch river 从数据库中导入数据

    Elasticsearch中使用reiver-jdbc导入数据 2014-05-13 15:10 本站整理 浏览(3384)     Elasticsearch中使用reiver-jdbc导入数据,有 ...

  7. 【ElasticSearch篇】--ElasticSearch从初识到安装和应用

    一.前述 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,在企业中全文搜索时,特别常用. 二.常用概念 clu ...

  8. Kafka丢失数据问题优化总结

    数据丢失是一件非常严重的事情事,针对数据丢失的问题我们需要有明确的思路来确定问题所在,针对这段时间的总结,我个人面对kafka 数据丢失问题的解决思路如下: 是否真正的存在数据丢失问题,比如有很多时候 ...

  9. 【原创】《从0开始学Elasticsearch》—初识Elasticsearch

    目录 1. Elasticsearch 是什么2. Elasticsearch 中基本概念3. Elasticsearch 安装4. 访问 Elasticsearch 1. Elasticsearch ...

随机推荐

  1. UVALive 4794 Sharing Chocolate DP

    这道题目的DP思想挺先进的,用状态DP来表示各个子巧克力块.原本是要 dp(S,x,y),S代表状态,x,y为边长,由于y可以用面积/x表示出来,就压缩到了只有两个变量,在转移过程也是很巧妙,枚举S的 ...

  2. 吴裕雄--天生自然MySQL学习笔记:MySQL 元数据

    你可能想知道MySQL以下三种信息: 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数. 数据库和数据表的信息: 包含了数据库及数据表的结构信息. MySQL服务器信息: ...

  3. 吴裕雄--天生自然MySQL学习笔记:MySQL PHP 语法

    MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP. 在这些语言中,Mysql在PHP的web开发中是应用最广泛. PHP提供了多种方式来访问和操作Mysql数据库记 ...

  4. Access修改窗体的名称,用于VBA代码的调用

  5. A - Color the ball HDU - 1556 (差分数组+前缀和)

    思路等引自博客 https://blog.csdn.net/johnwayne0317/article/details/84928568 对数组a[7]: a[0]=1; = d[0] a[1]=1; ...

  6. CodeForces-1100C NN and the Optical Illusion 简单数学

    题目链接:https://vjudge.net/problem/CodeForces-1100C 题意: 题目给出外部圆的数目n和内部圆的半径r,要求求出外部圆的半径以满足图片要求. 显然这是一道数学 ...

  7. 自动生成返回Json数据的toString()方法

    平时书写实体类方法的时候,想要获取的值直接返回Json字符串,以便使用,可以直接在Eclipse里面生成. 实现步骤: 1.快捷键Alt+S 2.选择Edit 3.添加字段,名称随意(我的为JsonS ...

  8. 搭建zookeeper环境

    zookeeper是一个强一致的分布式数据库,由多个节点共同组成一个分布式集群,挂掉任意一个节点,数据库仍然可以正常工作. 独立模式 下载zookeeper打包文件,并进行解压 ➜ ~ tar -xv ...

  9. 吴裕雄--天生自然Linux操作系统:Linux 忘记密码解决方法

    忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步骤如下: 重启linux系统 3 秒之内要按一下 ...

  10. c# 异常处理 try --catch

    初学 try---catch 语法 try { 可能会出现异常的代码; 异常出现的那行代码下面的代码全不会执行,直接跳到catch中执行 ... ... } //try和catch之间不能有其他的代码 ...