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倍。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值