作为使用ElasticSearch作为可靠文档存储的调查的一部分,我从Java应用程序运行基本HA测试,如下所示:
我使用ElasticSearch 1.6(https://registry.hub.docker.com/_/ elasticsearch )的现成Docker镜像设置了一个最小集群,其中:
然后我运行一个小型加载器应用程序,每个文件插入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)
请考虑以下测试程序(使用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中的(大)错误?!
谢谢,阿琼
我有一些数据存储为镶木地板文件和与数据模式匹配的案例类。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/数据集的实现,在可预见的将来不太可能有一个解决方案。” 但我很难理解为什么自定义编码器无法做到这一点。