elasticsearch批量提交数据两种方式Python和curl(带用户名和密码)

elasticsearch批量提交数据两种方式Python和curl

(带用户名和密码)

1.使用Python批量提交数据

import requests
from apscheduler.schedulers.blocking import BlockingScheduler
from elasticsearch import Elasticsearch
from elasticsearch import helpers
def post_dga():
    es = Elasticsearch()
    actions = []
    f = open("文件名",'r')
    for line in f:
        line = line.strip().split('\t')
        action = {
            "_index": "dga",
            "_source": {
                "dga_family": line[0],
                "domian": line[1],
                "start_valid_time": line[2],
                "end_valid_time": line[3]
            }
        }
        actions.append(action)
        #凑够五百个发一次
        if (len(actions) == 500):
            helpers.bulk(es, actions)
        #清理已经发送的数据,防止内存溢出
			del actions[0:len(actions)]
	#最后的数据不一定是500的整数倍,剩下的数据最后再发一次
    if (len(actions) > 0):
        helpers.bulk(es, actions)
if __name__ == '__main__':
    #定时提交数据
    scheduler = BlockingScheduler()
    scheduler.add_job(post_dga,'cron',hour=23,minute=55)
    scheduler.start()
    post_dga()

数据展示

nymaim	iirkrd.net	2020-08-05 00:00:00	2020-08-05 23:59:59
nymaim	islzzlmjw.org	2020-08-05 00:00:00	2020-08-05 23:59:59
nymaim	ugnupdsgfbk.com	2020-08-05 00:00:00	2020-08-05 23:59:59
nymaim	eflpufxiqi.biz	2020-08-05 00:00:00	2020-08-05 23:59:59
nymaim	fhcmfhdd.com	2020-08-05 00:00:00	2020-08-05 23:59:59
nymaim	pjotjjnagb.com	2020-08-05 00:00:00	2020-08-05 23:59:59

这种方式可以连接没有密码的elasticsearch,那么有密码应该什么办呢?
只需要将:

es = Elasticsearch(

换成

es = Elasticsearch(hosts="https://用户名:密码@host:9200",timeout=30, use_ssl=False,
                                    verify_certs=False, ssl_show_warn=False

使用curl批量提交数据

1、将自己的数据处理成标准的json格式
处理前的数据:

nymaim	iirkrd.net	2020-08-05 00:00:00	2020-08-05 23:59:59
nymaim	islzzlmjw.org	2020-08-05 00:00:00	2020-08-05 23:59:59
nymaim	ugnupdsgfbk.com	2020-08-05 00:00:00	2020-08-05 23:59:59
nymaim	eflpufxiqi.biz	2020-08-05 00:00:00	2020-08-05 23:59:59
nymaim	fhcmfhdd.com	2020-08-05 00:00:00	2020-08-05 23:59:59
nymaim	pjotjjnagb.com	2020-08-05 00:00:00	2020-08-05 23:59:59

目标数据

{"index":{"_index":"dga"}}
{"dga_family": "nymaim", "domian": "wyloyr.info", "start_valid_time": "2020-08-06 00:00:00", "end_valid_time": "2020-08-06 23:59:59"}
{"index":{"_index":"ti-dga"}}
{"dga_family": "nymaim", "domian": "acjsrn.net", "start_valid_time": "2020-08-06 00:00:00", "end_valid_time": "2020-08-06 23:59:59"}
{"index":{"_index":"ti-dga"}}
{"dga_family": "nymaim", "domian": "ftbsnmphv.com", "start_valid_time": "2020-08-06 00:00:00", "end_valid_time": "2020-08-06 23:59:59"}

第一行是index,第二行是键值对

f = open("dga.txt",'r')
list1 = '{"index":{"_index":"dga"'
i =1
for line in f:
    line = line.strip().split('\t')
    action = {
    "dga_family": line[0],
    "domian": line[1],
    "start_valid_time": line[2],
    "end_valid_time": line[3]
    }
    res_1 = list1 + '}}' + '\n'
    # print(res_1)
    a = open(r"out.json", "a", encoding='UTF-8')
    a.write(res_1)
    # 第偶数行,写入键值对
    res_2 = str(action)+'\n'
    #写进去的键值对有单引号,这里全部换成双引号,注意转义字符
    res_2 = res_2.replace("\'","\"")
    a = open(r"out.json", "a", encoding='UTF-8')
    a.write(res_2)
    i +=1
    print(i)
a.close()
print("处理完毕")

这样第一步就完成了,已经将数据处理完毕

2、使用curl,利用bulk提交数据

curl -XPOST "http://localhost:9200/_bulk?pretty" -H "Content-Type: application/json;charset=UTF-8" --data-binary @out.json

同样的问题,这里的curl可以连接没有密码的es
有密码的情况应该如何处理呢:

curl -XPOST -k "https://用户名:密码@localhost:9200/_bulk?pretty" -H "Content-Type: application/json;charset=UTF-8" --data-binary @out.json 

注意:

这里的json文件不能太大,我一次提交50w条json是可以的,但是一次几百万条会报错,猜测应该是和es的配置和机器性能有关系,并未求证过。
-k参数很重要,可以忽略证书,跳过HTTPS验证
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值