小编apa*_*day的帖子

ElasticSearch 1.6似乎在高可用性测试期间丢失了文档

作为使用ElasticSearch作为可靠文档存储的调查的一部分,我从Java应用程序运行基本HA测试,如下所示:

我使用ElasticSearch 1.6(https://registry.hub.docker.com/_/ elasticsearch )的现成Docker镜像设置了一个最小集群,其中:

  • 2个主/数据节点
  • 1个客户端节点(总是有人连接到)

然后我运行一个小型加载器应用程序,每个文件插入500,000个文件,每个约1KB.

我的机器大约需要1分半钟.在此期间,我重新启动当前主节点(docker restart).

在运行结束时,Java API已经对100%的查询做出了响应,但是当我使用curl请求检查文档计数时,缺少一些文档(根据我的运行,在2到10之间)

即使索引上有明确的"_refresh"请求,我的文档计数也是一样的.

我当然主要担心的是,崩溃期间无法存储某些文档,而是API返回的正面结果(特别是因为我正在使用WriteConsistencyLevel.ALL进行测试).

我知道这张票,但不确定它是否适用于我的基本场景

我的插入操作如下:

client.prepareUpdate("test", "test", id)
      .setDoc(doc).setUpsert(doc)
      .setConsistencyLevel(WriteConsistencyLevel.ALL)
      .execute.get.isCreated == true
Run Code Online (Sandbox Code Playgroud)

其余的代码可以在这里找到:https: //github.com/joune/nosql/blob/master/src/main/scala/ap.test.nosql/Loader.scala

如果您认为我做的事情明显错误,请告知.

(我知道有些人会回答说,考虑到ElasticSearch作为一个可靠的文档存储是完全错误的,但这是研究的目标,而不是我期望的那种答案)


按照Andrei Stefan的要求更新其他日志

> grep discovery.zen.minimum_master_nodes elasticsearch.yml
discovery.zen.minimum_master_nodes: 2

> curl -XPUT 'http://localhost:9200/_cluster/settings' -d '{"transient":{"logger._root":"DEBUG"}}'
{"acknowledged":true,"persistent":{},"transient":{"logger":{"_root":"DEBUG"}}}%
> curl -XPUT 'http://localhost:9200/_cluster/settings' -d '{"transient": {"logger.index.translog":"TRACE"}}'
{"acknowledged":true,"persistent":{},"transient":{"logger":{"index":{"translog":"TRACE"}}}}%
Run Code Online (Sandbox Code Playgroud)

使用200,000个条目运行测试:

0 KO | 200000 OK
> curl -XGET 'localhost:9200/test/test/_count?preference=_primary'
{"count":199991,"_shards":{"total":5,"successful":5,"failed":0}}%  
Run Code Online (Sandbox Code Playgroud)

我把日志放在这里:https://gist.github.com/ab1ed844f2038c30e63b

high-availability elasticsearch

15
推荐指数
2
解决办法
875
查看次数

scala classloaders混乱

请考虑以下测试程序(使用scala 2.9.0.1)

object test
{
  def main(args:Array[String]) = {
    println(ClassLoader.getSystemClassLoader.getResource("toto"))
    println(this.getClass.getClassLoader.getResource("toto"))
    println(classOf[Object].getClassLoader)
  }
}
Run Code Online (Sandbox Code Playgroud)

我编译它并使用包含文件"toto"的"-cp/tmp"运行它,我得到以下输出:

null
file:/tmp/toto
null
Run Code Online (Sandbox Code Playgroud)

=>系统类加载器不包含类路径

=> Object类没有类加载器!

我在那里遗漏了什么,或者它是scala中的(大)错误?!

谢谢,阿琼

scala classloader

9
推荐指数
1
解决办法
6316
查看次数

Spark 数据框到密封特征类型

我有一些数据存储为镶木地板文件和与数据模式匹配的案例类。Spark 可以很好地处理常规产品类型,所以如果我有

case class A(s:String, i:Int)
Run Code Online (Sandbox Code Playgroud)

我可以轻松做到

spark.read.parquet(file).as[A]
Run Code Online (Sandbox Code Playgroud)

但据我了解,Spark 不处理析取类型,因此当我的 parquet 中有枚举(之前编码为整数)和 scala 表示形式时,如

sealed trait E
case object A extends E
case object B extends E
Run Code Online (Sandbox Code Playgroud)

我不能做

spark.read.parquet(file).as[E]
// java.lang.UnsupportedOperationException: No Encoder found for E
Run Code Online (Sandbox Code Playgroud)

到目前为止是有道理的,但后来,可能太天真了,我尝试

implicit val eEncoder = new org.apache.spark.sql.Encoder[E] {
 def clsTag = ClassTag(classOf[E])
 def schema = StructType(StructField("e", IntegerType, nullable = false)::Nil)
}
Run Code Online (Sandbox Code Playgroud)

我仍然得到相同的“没有找到 E 的编码器”:(

我现在的问题是,为什么范围内隐式缺失?(或者不被识别为编码器[E]),即使它被识别,这样的接口如何让我真正解码数据?我仍然需要将值映射到正确的案例对象。

我确实读过一个相关的答案,上面写着“TL;DR 目前没有好的解决方案,并且考虑到 Spark SQL/数据集的实现,在可预见的将来不太可能有一个解决方案。” 但我很难理解为什么自定义编码器无法做到这一点。

scala apache-spark apache-spark-sql

6
推荐指数
1
解决办法
1668
查看次数