es的java bulk load

本文介绍了一个使用Java实现的Elasticsearch批量导入工具,通过9300端口进行TCP通信,相较于HTTP接口提高了10倍以上的导入速度,达到每秒约4万条记录的索引速率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

es的java bulk load,直接贴代码

public class BulkLoad {

    public static void main(String[] args) {

        if (args.length != 5) {
            System.out.println("参数集群名字");
            System.out.println("参数集群其中一个节点的ip");
            System.out.println("参数需要导入的文件的位置");
            System.out.println("参数所以名字");
            System.out.println("参数批量导入的patch");
            return ;
        }

        String cluster = args[0];
        String ip = args[1];
        String path = args[2];
        String index = args[3];
        int patch = Integer.parseInt(args[4]);

        Settings settings = Settings.settingsBuilder().put("cluster.name"cluster)
                .put("client.transport.sniff", true).build();
        TransportClient client = TransportClient.builder().settings(settings).build();
        try {
            client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip)9300));
        catch (UnknownHostException e) {
            System.out.println("es集群主机名错误");
            e.printStackTrace();
        }


        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(new File(path)));
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        String line = null;
        int count = 1;
        try {
            BulkRequestBuilder bulkRequest = client.prepareBulk();
            long start = System.currentTimeMillis();
            while ((line = br.readLine()) != null) {
                bulkRequest.add(client.prepareIndex(index"nature").setSource(buildXContentBuilder(line)));
                // 5w条提交一次
                if (count % patch == 0) {
                    bulkRequest.execute().actionGet();
                    bulkRequest = client.prepareBulk();
                    System.out.println("提交了+ count + "");
                }
                count++;
            }
            bulkRequest.execute().actionGet();
            long end = System.currentTimeMillis();
            System.out.println("插入完毕耗时+ (end - start) + "ms");
        catch (IOException e) {
            e.printStackTrace();
        finally {
            if (client != null) {
                client.close();
            }
            if (br != null) {
                try {
                    br.close();
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static XContentBuilder buildXContentBuilder(String line) throws IOException{
            String[] row = line.trim().split("\t");
            return jsonBuilder()
                    .startObject()
                    .field("field1"row[0])
                    .field("field2"row[1])
                    .endObject();
    }
}

利用的是9300的tcp端口,相对于9200的http接口导入速度大概会提高10倍以上,每秒4w左右的索引速度。
注意点:bulkRequest.execute().actionGet()之后需要再次调用prepareBulk,否则client中的数据越积越多,每次bulk之后需要先清空
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值