ElasticSearch千万级数据同步方案

(原创)针对于将数据同步到ES中,有HttpHost、BulkProcessor等方式,怎么才能更高效的加载数据
在我开发测试过程中,一直觉得这些方式效率都不是很好
1、IndexResponse的方式,经过测试(Linux环境)一次时间开销在时间在200ms-300ms左右

  IndexResponse response = client.prepareIndex("stu", "doc","1")
	    	                .setSource(
	    	                        XContentFactory.jsonBuilder()
	    	                                .startObject()
	    	                                .field("stu_id", "001")
	    	                                .field("stu_name", "apple1")
	    	                                .endObject()
	    	                ).get();

2、在client有缓存处理的操作,经过测试(Linux环境)100w数据需要60s

public BulkProcessor bulkProcessor() throws UnknownHostException {

		Settings settings = Settings.builder()
				.put("cluster.name", "myes").build();

		Client client = new PreBuiltTransportClient(settings)
				.addTransportAddress(new InetSocketTransportAddress(InetAddress
						.getByName("172.16.44.28"), Integer
						.parseInt("9300")));


		return BulkProcessor
				.builder(client, new BulkProcessor.Listener() {

					@Override
					public void afterBulk(long arg0, BulkRequest arg1,
							BulkResponse arg2) {
						// TODO Auto-generated method stub
					}
					@Override
					public void afterBulk(long arg0, BulkRequest arg1,
							Throwable arg2) {
						// TODO Auto-generated method stub
					}

					@Override
					public void beforeBulk(long arg0, BulkRequest arg1) {
						// TODO Auto-generated method stub
					}

				})
				.setBulkActions(1000)
				.setBulkSize(new ByteSizeValue(5, ByteSizeUnit.MB))
				.setFlushInterval(TimeValue.timeValueSeconds(5))
				.setConcurrentRequests(1)
				.setBackoffPolicy(
						BackoffPolicy.exponentialBackoff(
								TimeValue.timeValueMillis(100), 3)).build();
	}
	

上述方法都不能达到预期的目标,通过对ElasticSearch支持的数据载入的方式调研发现,采用curl http 传送文件的方式更为合理,官方建议文件大小在10M左右,对于数据库中的CLOB字段就会有限制,一般的集群规模百兆左右文件同步的时候就会报错。
在我开发过程中因为数据的来源是之间访问的底层数据库的存储文件,基于HDFS处理大数据的分布式数据库,将文件的数据加载到ElasticSearch中进行分词检索,向用户提供全文检索功能。

架构图大概如下:
ElasticSearch千万级数据同步方案_第1张图片
文件有若干份,根据当前机器的CPU核数配置可以同时并发读写的线程个数,每个线程负责一个文件,将文件内容读取处理生产一份小文件单元,置于队列中,这里采取异步读写方式,当前线程只处理写的操作,另外配置若干个消费者来扫描同步单元队列,将生产的若干份文件单元送至ES分词处理。
当前方案测试结果:

数据量(万) 平均使用时间(s)
800 40
1600 80
3200 150
6400 400
9600 900

你可能感兴趣的:(ElasticSearch)