Elasticsearch实战——Setting

Elasticsearch实战——Setting


索引的配置项按是否可以更改分为static属性与动态属性,所谓的静态配置即索引创建后不能修改。

1. 索引静态配置

  • index.number_of_shards

    索引分片的数量。默认值5,ES支持的最大分片数默认为1024,可以通过修改index.max_number_of_shards属性修改。

  • index.shard.check_on_startup

    分片在打开之前是否检查该分片是否损坏。当检测到分片损坏时,将阻止打开。

    可选值:

    • false:不检测,默认值
    • checksum:只检查物理结构
    • true:检查物理结构和路基损坏,相对比较消耗CPU
    • fix:类同false,7.0版本后将废弃
  • index.codec

    数据存储的压缩算法,默认值LZ4,可选值best_compression,比LZ4可以获得更好的压缩比例(占用较小的磁盘空间,但是存储性能比LZ4)。

  • index.routing_partition_size

    路由分区数

    如果设置了该参数,其路由算法为:

    (hash(_routing)  +  hash(_id) % index.routing_parttion_size  ) % number_of_shards
    

    如果没有设置,路由算法为:

    hash(_routing) % number_of_shardings
    

    _routing默认值为_id

2. 索引动态配置

  • index.number_of_replicas

    索引复制分片的个数,默认值1,该值必须大于等于0,创建索引后该值可以变更。

  • index.auto_expand_replicas

    基于可用节点的数量自动分配副本数量,默认为 false(即禁用此功能),可设置为:0-all

  • index.refresh_interval

    执行刷新操作的频率,该操作可以对索引的最新更改对搜索可见。默认1s。可以设置**-1**禁止刷新。

  • index.max_result_window

    控制分页搜索的总记录数,from+size的大小不能超过该值,默认为10000。

  • index.max_inner_result_window

    用于控制top aggregations,默认100。内部命中和顶部命中聚合占用堆内存,并且时间与from+size成正比,这限制了内存。

  • index.max_rescore_window

    rescore搜索中,rescore请求的window_size的最大值。

  • index.max_docvalue_fields_search

    一次查询最多包含开启doc_values字段的个数,默认100。

  • index.max_script_fields

    查询中允许的最大script_fields数量。默认为32。

  • index.max_ngram_diff

    NGramTokenizerNGramTokenFiltermin_grammax_gram之间允许的最大差异。默认为1。

  • index.max_shingle_diff

    对于ShingleTokenFilter, max_shingle_sizemin_shingle_size之间允许的最大差异。默认为3。

  • index.blocks.read_only

    索引数据、索引元数据是否只读,如果设置为true,则不能修改索引数据,也不能修改索引元数据。

  • index.blocks.read_only_allow_delete

    与index.blocks.read_only基本类似,唯一的区别是允许删除动作。

  • index.blocks.read

    设置为true以禁用对索引数据的读取操作。

  • index.blocks.write

    设置为true以禁用对索引数据的写操作。(针对索引数据,而不是索引元数据)

  • index.blocks.metadata

    设置为true,表示不允许对索引元数据进行读与写。

  • index.max_refresh_listeners

    索引的每个分片上当刷新索引时最大的可用监听器数量。这些侦听器用于实现refresh=wait_for。

  • index.highlight.max_analyzed_offset

    高亮显示的最大字符数。此设置仅在对没有偏移或词向量的索引的文本上适用。默认情况下,此设置在6.x中未设置,默认为-1。

  • index.max_terms_count

    Term查询中可以使用的最大Term数。默认为65536。

  • index.routing.allocation.enable

    控制此索引的分片分配,可选值:

    • all:默认,允许分片所有的分片
    • primaries:只允许分配主分片
    • new_primaries:仅允许分配新创建的主分片
    • none:不允许分配
  • index.routing.rebalance.enable

    为此索引启用分片重新平衡,可选值:

    • all:默认,允许分片重新平衡
    • primaries:只允许主分片重新平衡
    • replicas:只允许副本分片重新平衡
    • none:不允许分片重新平衡
  • index.gc_deletes

    允许已删除文档的版本号,扔可用于进一步版本化操作的时间长度。默认60s。

  • index.max_regex_length

    Regexp Query中可以使用的正则表达式的最大长度,默认为1000。

  • mapping.coerce

    • true:默认值,强制类型转换,把json中的值转为ES中字段的数据类型,譬如,把字符串"5"转为integer的5。
    • false:当json的值与ES字段类型不匹配将会拒绝。

3. Merging

  • index.merge.scheduler.max_thread_count

    当个分片节点合并的最大线程数,默认值

    Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2))

    如果是非SSD盘,建议设置为1。

  • index.merge.policy.max_merged_segment

    指定单个segment的最大容量,默认值5GB,可以考虑适当降低此值。

  • index.merge.policy.segments_per_tier

    该属性指定了每层分段的数量,取值越小则segment越少,因此需要merge的操作更多,可以考虑适当增加此值。默认为10,其应该大于等于index.merge.poliycy.max_merge_at_once

4. Show Log

4.1 Search Show Log

ES提供在查询阶段(Query)和数据获取阶段(Fetch)设置阈值,超过改阈值则记录日志。

4.1.1 查询阶段支持参数
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.threshold.query.info: 5s
index.search.slowlog.threshold.query.debug: 2s
index.search.slowlog.threshold.query.trace: 500ms

上述定义查询阶段(Query)阈值,分别表示执行超过10s,打印警告日志。超过5s打印info日志。

4.1.2 数据获取阶段支持参数
index.search.slowlog.threshold.fetch.warn: 1s
index.search.slowlog.threshold.fetch.info: 800ms
index.search.slowlog.threshold.fetch.debug: 500ms
index.search.slowlog.threshold.fetch.trace: 200ms

上述定义数据获取阶段(Fetch)阈值,分别表示执行超过1s,打印警告日志。超过800ms打印info日志。

4.1.3 日志输出级别

定义日志输出级别为info,不输出debug、trace级别的日志。

index.search.slowlog.level: info

注意:上述日志级别为分片日志。

4.1.4 log4j配置

在log4j中定义日志输出器和输出路径等,相关配置如下:

appender.index_search_slowlog_rolling.type = RollingFile
appender.index_search_slowlog_rolling.name = index_search_slowlog_rolling
appender.index_search_slowlog_rolling.fileName = ${sys:es.logs}_index_search_slowlog.log
appender.index_search_slowlog_rolling.layout.type = PatternLayout
appender.index_search_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] [%node_name]%marker %.10000m%n
appender.index_search_slowlog_rolling.filePattern = ${sys:es.logs}_index_search_slowlog-%d{yyyy-MM-dd}.log
#文件切割方案,属于log4j的语法
appender.index_search_slowlog_rolling.policies.type = Policies    
#基于时间切割,log4j还支持按大小切割,其类为SizeBasedTriggeringPolicy。
appender.index_search_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy
#1小时切割成一个文件
appender.index_search_slowlog_rolling.policies.time.interval = 1                         
#是否修正时间范围, 如果设置为true,则从0时开始计数
appender.index_search_slowlog_rolling.policies.time.modulate = true                      

logger.index_search_slowlog_rolling.name = index.search.slowlog
logger.index_search_slowlog_rolling.level = trace
logger.index_search_slowlog_rolling.appenderRef.index_search_slowlog_rolling.ref = index_search_slowlog_rolling
logger.index_search_slowlog_rolling.additivity = false

4.2 Index Show Log

4.2.1 索引慢日志配置
index.indexing.slowlog.threshold.index.warn: 10s
index.indexing.slowlog.threshold.index.info: 5s
index.indexing.slowlog.threshold.index.debug: 2s
index.indexing.slowlog.threshold.index.trace: 500ms
index.indexing.slowlog.level: info
index.indexing.slowlog.source: 1000 

index.indexing.slowlog.source参数用来记录文档 _source字段字符的个数,默认1000,表示只记录_source的前1000个字符,可以设置为true,表示输出_source字段全部内容,设置为false,表示不记录_source字段的内容。

默认情况下,会对_source字段的输出进行格式化,通常使用一行输出,如果想阻止格式化,可以通过index.indexing.slowlog.reformat设置为false来避免。

4.2.2 log4j配置

在logg4j配置文件中定义日志的输出。

appender.index_indexing_slowlog_rolling.type = RollingFile
appender.index_indexing_slowlog_rolling.name = index_indexing_slowlog_rolling
appender.index_indexing_slowlog_rolling.fileName = ${sys:es.logs}_index_indexing_slowlog.log
appender.index_indexing_slowlog_rolling.layout.type = PatternLayout
appender.index_indexing_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] [%node_name]%marker %.-10000m%n
appender.index_indexing_slowlog_rolling.filePattern = ${sys:es.logs}_index_indexing_slowlog-%d{yyyy-MM-dd}.log
appender.index_indexing_slowlog_rolling.policies.type = Policies
appender.index_indexing_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.index_indexing_slowlog_rolling.policies.time.interval = 1
appender.index_indexing_slowlog_rolling.policies.time.modulate = true

logger.index_indexing_slowlog.name = index.indexing.slowlog.index
logger.index_indexing_slowlog.level = trace
logger.index_indexing_slowlog.appenderRef.index_indexing_slowlog_rolling.ref = index_indexing_slowlog_rolling
logger.index_indexing_slowlog.additivity = false

5. Store

  • index.store.type,表示存储类型,该值为静态参数,在索引创建时指定,无法更改。

    可选值:

    • fs

      默认文件系统实现,根据当前操作系统选择最佳存储方式

    • simplefs

      简单的FS类型,使用随机访问文件实现文件系统存储(映射到Lucene SimpleFsDirectory)。并发性能很差(多线程会出现瓶颈)。当需要索引持久性时,通常最好使用niofs

    • niofs

      基于NIO实现的文件系统,该类型使用NIO在文件系统上存储碎片索引(映射到Lucene NIOFSDirectory)。它允许多个线程同时从同一个文件中读取数据。

    • mmapfs

      基于文件内存映射机制实现的文件系统实现,该方法将文件映射到内存(MMap)来存储文件系统上的碎片索引(映射到Lucene MMapDirectory)。内存映射使用进程中与被映射文件大小相同的部分虚拟内存地址空间。

      可通过node.store.allow_mmapfs属性来禁用基于内存映射机制,如果节点所在的操作系统没有大量虚拟内存,则可以使用该属性明确禁止使用该文件实现。

  • index.store.preload,预加载数据到文件系统缓存

    如果ES主机重启,则文件系统缓存将清空,此时搜索会比较慢,可以使用index.store.preload设置,通过指定文件扩展名,显示的告诉操作系统应该将哪些文件加载到内存中。

    例如,配置到elasticsearch.yml文件中:

    index.store.preload: ["nvd","dvd"]
    

    或者在创建索引的时候设置:

    {
        "settings":{
            "index.store.preload":["nvd","dvd"]
        }
    }
    

6. Translog

由于Lucene提交的开销很大,不能每个变更就提交一次(刷写磁盘),所以每个分片复制都有一个事务日志,称为translog。所有索引和删除操作都是在被内部Lucene索引处理只会写入translog的。在发生崩溃的情况下,当索引恢复的时候,可以通过回放translog中的数据进行恢复。

Translog日志有点类似于mysqlredo日志。

6.1 Translog相关配置(索引级别)

  • index.translog.durability

    translog刷盘方式,可选值:requestasync

    • request:即每请求一次刷盘,也就是客户端发起一个增删改操作时,会在主分片和副本分片全部刷盘成功后,才会返回成功,是ES的默认模式。
    • async:异步刷盘模式,此模式频率由index.translog.sync_interval设置,其默认值为5s,该模式会存在数据丢失的可能。
  • index.translog.sync_interval

    如果index.translog.durability设置为async,用该值来设置刷盘的频率,默认为5s

  • index.translog.flush_threshold_size

    ES强制刷新的另外一个维度,如果translog的大小达到该值,则强制将为刷盘的数据强制刷新到Lucene中,默认512M

  • index.translog.retention.size

    保存跨日志文件的总大小。也就是translog日志文件flush后,并不马上删除,而是保留一段时间,但最新的translog文件已经存储的内容与待删除的文件的间隔不超过改参数设置的值,默认为512M

  • index.translog.retention.age

    保存translog文件的最大持续时间,默认12h

7. 关注我

搜索微信公众号:java架构强者之路
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个项目实战的目标是使用Java版本的Spark将Hive表的数据写入Elasticsearch。具体步骤如下: 1. 首先,需要在Spark中创建一个JavaSparkContext对象,并且设置相关的配置,比如Elasticsearch的地址和端口号等。 2. 接下来,需要使用HiveContext对象来读取Hive表的数据。可以使用HiveContext的sql方法来执行Hive SQL语句,或者使用HiveContext的table方法来读取Hive表的数据。 3. 读取Hive表的数据后,需要将数据转换成Elasticsearch的格式。可以使用JavaRDD的map方法来实现数据的转换。 4. 转换完成后,需要将数据写入Elasticsearch。可以使用JavaRDD的foreachPartition方法来实现数据的批量写入。 5. 最后,记得关闭JavaSparkContext对象。 以上就是使用Java版本的Spark将Hive表的数据写入Elasticsearch的步骤。需要注意的是,具体实现过程中还需要考虑一些细节问题,比如数据类型的转换、数据的去重等。 ### 回答2: 在实现Spark将Hive表的数据写入Elasticsearch的过程中,首先需要搭建好相关的环境,包括Hadoop、Hive和Elasticsearch等。然后,根据Spark的API接口,可以编写相关的Java代码来实现将Hive表的数据写入Elasticsearch的操作。 具体实现步骤如下: 1. 导入相关依赖:在Maven项目中,需要添加以下依赖: ```xml <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_${scalaVersion}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scalaVersion}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-20_2.11</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>${hive.version}</version> </dependency> ``` 其中,${scalaVersion}、${spark.version}、${elasticsearch.version}和${hive.version}需要根据实际情况进行替换。 2. 初始化SparkConf和SparkSession对象:在Java代码中,需要先初始化SparkConf和SparkSession对象: ```java SparkConf conf = new SparkConf().setAppName("Spark-Hive-Elasticsearch"); SparkSession spark = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate(); ``` 其中,setAppName用于设置Spark应用程序的名称,getOrCreate用于获取一个已有的Spark或创建一个新的Spark。 3. 读取Hive表的数据:可以使用SparkSession的read方法读取Hive表的数据,如下所示: ```java DataFrame df = spark.read().table("mytable"); ``` 其中,mytable为Hive表的名称。 4. 配置Elasticsearch索引:在将Hive表的数据写入Elasticsearch时,需要配置相关的索引,如下所示: ```java Map<String, String> esConfig = new HashMap<>(); esConfig.put("es.nodes", "localhost"); esConfig.put("es.port", "9200"); esConfig.put("es.resource", "myindex/mytype"); ``` 其中,es.nodes和es.port用于配置Elasticsearch的地址和端口,es.resource用于指定Elasticsearch的索引名称和类型名称。 5. 将Hive表的数据写入Elasticsearch:可以使用DataFrame的write方法将Hive表的数据写入Elasticsearch,如下所示: ```java df.write().format("org.elasticsearch.spark.sql").mode(SaveMode.Append).options(esConfig).save(); ``` 其中,format指定了保存的格式为Elasticsearch格式,mode指定了保存的模式为Append,options指定了保存的配置项。 通过上述步骤,即可实现Spark将Hive表的数据写入Elasticsearch的操作。当然,在实际应用过程中,还需要根据具体需求进行相关的优化和调整。 ### 回答3: 这个项目实战的主要目的是将Hive表的数据写入到Elasticsearch。Hive是Hadoop中的数据仓库,而Elasticsearch则是一个高性能的搜索和分析引擎。将这两个系统结合起来可以实现更好的数据分析和可视化。 在开始实现之前,需要先搭建好Hadoop和Elasticsearch环境,并且熟悉Java编程语言和Spark框架。接下来,可以按照以下步骤进行实现。 第一步:配置Maven项目并添加Spark和Elasticsearch的依赖库。在pom.xml文件中添加以下代码: ``` <!-- Spark --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.4.5</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.4.5</version> </dependency> <!-- Elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-20_2.11</artifactId> <version>7.6.2</version> </dependency> ``` 第二步:编写代码读取Hive表的数据。使用Spark SQL读取Hive表数据并将其转换为DataFrame,例如: ``` String tableName = "hive_table_name"; Dataset<Row> df = sparkSession.table(tableName); ``` 第三步:将DataFrame中的数据写入Elasticsearch。使用Elasticsearch Spark库提供的API来将数据写入Elasticsearch,例如: ``` // 配置Elasticsearch参数 Map<String, String> esConfigs = new HashMap<>(); esConfigs.put("es.nodes", "localhost"); esConfigs.put("es.port", "9200"); esConfigs.put("es.mapping.id", "id"); // 写入数据 df.write().format("org.elasticsearch.spark.sql") .options(esConfigs).mode("overwrite") .save("index_name/document_type"); ``` 最后一步:运行代码并验证数据是否已经成功写入Elasticsearch。可以使用Kibana界面进行数据可视化展示和分析。 通过以上步骤,就可以成功实现将Hive表的数据写入Elasticsearch的功能。这个项目实战可以帮助开发人员更好地理解和应用Spark和Elasticsearch技术,并且提升数据分析和可视化的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值