为什么AWS突然停止接受我对ElasticSearch的写入(put)?

时间:2017-10-04 17:51:18

标签: amazon-web-services elasticsearch clojure elastisch

我们需要将MySQL数据库中的200万条记录非规范化为ElasticSearch。我们的devops人在AWS上设置了ElasticSearch。我写了一个Clojure应用程序,它从MySQL中获取数据,将其聚合成我们想要的格式,然后对ElasticSearch进行了放置。我在我们的EC2实例上设置了这个,devops家伙正确地设置了AWS角色,然后我启动了应用程序运行。 10分钟后我做到了这一点:

curl --verbose  -d '{"query": { "match_all": {} }}' -H 'Content-Type: application/json' -X GET "https://search-samedayes01-ntt7r7b7sfhy3wu.us-east-1.es.amazonaws.com/facts-over-time/_search"

我看到了:

{"took":1,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":14952,"max_score":1.0,"hits": [...

真棒!它的工作原理!我看了一些文件,看起来很好。

另外15分钟过去,我运行与上面相同的查询。可悲的是,我得到了相同的结果:

{"took":1,"timed_out":false,"_shards":    {"total":5,"successful":5,"failed":0},"hits":    {"total":14952,"max_score":1.0,"hits": [...
我喜欢,什么?为什么它会接受14,952条记录然后停止?

我的Clojure函数设置为在出现任何问题时抛出错误;

(defn push-item-to-persistence
  [item db]
  (let [
        denormalized-id (get-in item [:denormalized-id] :no-id)
        item (assoc item :updated-at (temporal/current-time-as-datetime))
        item (assoc item :permanent-holding-id-for-item-instances (java.util.UUID/randomUUID))
        item (assoc item :instance-id-for-this-one-item (java.util.UUID/randomUUID))
        item (assoc item :item-type :deduplication)
        ]
    (if (= denormalized-id :no-id)
      (slingshot/throw+ {
                         :type ::no-denormalized-id-in-push-item-into-database
                         :item item
                         })
      (slingshot/try+
       (esd/put db "facts-over-time" "deduplicaton" (str denormalized-id) item)
       (println "We just put a document in ES.")
       (catch Object o
         (slingshot/throw+ {
                            :type ::push-item-to-persistence
                            :error o
                            :item item
                            :db db
                            }
                           ))))))

如果我查看日志,就没有错误,我一直看到这行打印出来:

We just put a document in ES.    

现在已经超过一个小时了,似乎我们仍然停留在14,952份文件中。

可能出了什么问题?为什么我没有看到错误?

使用Elastisch作为库将Clojure连接到AWS ES。

更新

好的,现在至少我看到了这些例外情况。我不清楚他们被抓到了哪里。在我的代码中的任何地方,我都会重新抛出异常,因为我希望应用程序在第一个异常时死掉。这些都被捕获到某个地方,可能在我正在使用的Elastish库中?或者我偶然发现并登录某处。

但这是一个有点微不足道的问题。更重要的是:

下一个问题是为什么我会得到这些例外。我在哪里调整AWS ElasticSearch,以便以合理的速度接受我们的写入。

Oct 04, 2017 6:53:44 PM org.apache.http.impl.client.DefaultHttpClient tryConnect
INFO: I/O exception (java.net.SocketException) caught when connecting to {s}->https://search-samedayes01-ntsdht7sfhy3wu.us-east-1.es.amazonaws.com:443: Broken pipe (Write failed)

Oct 04, 2017 7:09:06 PM org.apache.http.impl.client.DefaultHttpClient tryConnect
INFO: Retrying connect to {s}->https://search-samedayes01-ntsdht7sfhy3wu.us-east-1.es.amazonaws.com:443

Oct 04, 2017 6:54:13 PM org.apache.http.impl.client.DefaultHttpClient tryConnect
INFO: I/O exception (java.net.SocketException) caught when connecting to {s}->https://search-samedayes01-ntsdht7sfhy3wu.us-east-1.es.amazonaws.com:443: Broken pipe (Write failed)

Oct 04, 2017 7:09:09 PM org.apache.http.impl.client.DefaultHttpClient tryConnect
INFO: Retrying connect to {s}->https://search-samedayes01-ntsdht7sfhy3wu.us-east-1.es.amazonaws.com:443

更新2

我重新开始了。大约有920份文件成功投入ElasticSearch。然后我得到了:

:hostname "UnknownHost"
:type java.io.EOFException
:message "SSL peer shut down incorrectly"

什么?

此外,写作似乎疯狂。也许每秒10次操作。 AWS中必须有一些我可以调整的东西,这将使我们的ElasticSearch节点接受更多的写入?我希望每秒至少获得1,000次写入。

更新3

所以现在我已经到了这个应用程序主要工作的地步,但它以我能想象的最奇怪的方式工作。

我收到了一条“破管”的消息,引导我来到这里:

SSL peer shut down incorrectly in Java

按照这个建议我这样做了:

(System/setProperty "https.protocols" "TLSv1.1")

这似乎没有效果。

但现在我的应用程序执行此操作:

  1. 以冰川速度移动,每秒可能有1次写入ElasticSearch。
  2. 引发“破管”例外。
  3. 像火箭一样起飞并开始每分钟向ElasticSearch写入大约15,000个请求。
  4. 我很高兴它终于工作了,但我不知道为什么它不起作用。

    此外,每分钟15,000个请求实际上并不那么快。移动200万份文件时,这需要2个多小时,这很糟糕。但是,Amazon仅支持ElasticSearch的REST接口。我读过原生协议的速度要快8倍左右。这听起来像我们需要的。

0 个答案:

没有答案