Spark将Json数据写入ES报权限错误:action [cluster:monitor/nodes/info] is unauthorized for user

编程入门 行业动态 更新时间:2024-10-06 21:22:22

Spark将Json数据写入ES报<a href=https://www.elefans.com/category/jswz/34/1771295.html style=权限错误:action [cluster:monitor/nodes/info] is unauthorized for user"/>

Spark将Json数据写入ES报权限错误:action [cluster:monitor/nodes/info] is unauthorized for user

使用org.elasticsearch.spark.rdd.EsSpark的API

EsSpark.saveJsonToEs(mergeData, esIndexName, esConf)

将Json数据写入ES集群,报错信息如下:

org.elasticsearch.hadoop.rest.EsHadoopInvalidRequest: org.elasticsearch.hadoop.rest.EsHadoopRemoteException: security_exception: action [cluster:monitor/nodes/info] is unauthorized for user [XXXXX]

解决方案为:

参数es.nodes.wan.only,由默认的false改为true

添加参数es.nodes.discovery: false

原理如下:

es.nodes.wan.only: false,默认为false es.nodes.discovery: true,默认为true

采用以上默认配置时,Spark会通过访问es.nodes中指定的host(可以为多个) 得到ES集群所有开启HTTP服务节点的ip和port,后续对数据的访问会直接访问分片数据所在的节点上,这样的话需要保证ES集群所有节点都能够被Spark集群访问到。

这种方式适合es node全部用ip来设置的情况,但是并不安全。

----------------------------------------------------------------------------------------------

所以公司后来改为用域名来访问ES集群,只访问master节点,不再通过访问每个Es工作节点的ip来连接Es集群;

即访问的ipAndPort由(ip1,ip2,ip3:端口号),改成了(域名:端口号),直接访问Es的master节点,再由master节点来分发任务连接工作节点。

这两个参数还是用默认配置的话,如果不是supser权限,就会出现访问Es节点权限受限的问题,改动代码里的conf参数如下:

es.nodes.wan.only: true,es.nodes.discovery: false(或不设置)

这样Spark发送给ES的所有请求,都需要通过这个Spark程序的Executor节点进行转发,效率相对比低一些,但是实测数据写入耗时也并没有怎么增加,完美解决了Spark程序往Es集群写入数据时,探活机制导致的权限异常的错误。

ps:测试发现单独设置es.nodes.discovery: false,还是会报权限错误,但是单独设置es.nodes.wan.only: true就可以。

----------------------------------------------------------------------------------------------

采用es.nodes.wan.only: true后,相当于,不管写请求还是读请求,ES都会强制通过master进行任务的分发,

1. 写请求(通过EsSpark.saveJsonToEs(mergeData, esIndexName, esConf) 这个API写数据):

每一批次,每条数据写入ES时,都会依据_id被master节点分发写到指定的data节点的分片上,会做一层负载均衡,避免写请求时,某个data节点负载过高导致宕机。

如果es.nodes.wan.only设置为false,往ES集群写数据时,相当于绕过master节点,不在通过client节点进行请求的转发,直接往data节点写,client节点只用来服务普通的查询,速率会快很多,但是不太安全(实际上也没出现过宕机情况)。

如果es.nodes.wan.only设置为true,往ES集群写数据时,每个写请求都会被master进行分发,写到指定的data节点分片中,如果数据量不是特别大,一般没有太大影响,亲测每天大约运行800G的数据时,入库ES时间被master分发和直接访问data节点,耗时差不多。

 

2. 读请求:

读请求也会被master节点将请求分发给不同的data节点的分片,这样读取速率要快,如果没有master进行分发,读请求耗时基本上要扩大3-5倍。

更多推荐

Spark将Json数据写入ES报权限错误:action [cluster:monitor/nodes/info] is unauthorized for us

本文发布于:2024-02-14 00:20:15,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1761294.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:权限   错误   数据   ES   Json

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!