Elasticsearch学习之(一)线上迁移数据方案_elasticsearch 在线迁移

throw new IllegalArgumentException(“索引名称前缀为空! prefix:”+indexPrefix);
}

List indexNames = new ArrayList<>();
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTimeInMillis(start);

Calendar endCalendar = Calendar.getInstance();
endCalendar.setTimeInMillis(end);

SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyyMM”);

// 计算开始和结束的年份
int startYear = startCalendar.get(Calendar.YEAR);
int endYear = endCalendar.get(Calendar.YEAR);

// 遍历每个年份的月份,生成索引名称
for (int year = startYear; year <= endYear; year++) {
Calendar tempCalendar = Calendar.getInstance();
tempCalendar.set(Calendar.YEAR, year);
tempCalendar.set(Calendar.MONTH, Calendar.JANUARY); // 一月份

// 对于开始年份,从开始的月份开始遍历
int startMonth = year == startYear ? startCalendar.get(Calendar.MONTH) : Calendar.JANUARY;

// 对于结束年份,到结束的月份结束遍历
int endMonth = year == endYear ? endCalendar.get(Calendar.MONTH) : Calendar.DECEMBER;

for (int month = startMonth; month <= endMonth; month++) {
tempCalendar.set(Calendar.MONTH, month);
indexNames.add( indexPrefix + dateFormat.format(tempCalendar.getTime()));
}
}

return indexNames;
}

2、数据访问

1、每个月的最后几天生成下个月的索引

注意点:
1、因为月份最后几天不确定,所以从28-31 都计算一下
2、创建索引的配置indexConfiguration自己写个json文件然后放到容器中读取即可

@Scheduled(cron = “0 0 10 28-31 * ?”)
public void createIndex() throws IOException {
//判断是否是最后一天
if(!DateUtil.isLastDayOfMonth()){
log.warn(“索引初始化|判断不是本月最后一天|不进行处理”);
return;
}

// 每月最后一天生成下个月的索引
Calendar instance = Calendar.getInstance();
instance.add(Calendar.MONTH,1);
instance.set(Calendar.DAY_OF_MONTH,1);

String indexName = ElasticsearchUtil.getIndexNameByTimeStamp(newIndexPrefix, instance.getTimeInMillis());
GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
if(exists){
log.warn(“索引初始化|索引已存在|index:{}”,indexName);
return;
}
if(StringUtils.isEmpty(indexConfiguration)){
log.error(“索引初始化|获取索引初始化配置为空|setting:{}”,indexConfiguration);
return;
}
CreateIndexRequest request = new CreateIndexRequest(indexName);
// 初始化索引
request.source(indexConfiguration,XContentType.JSON);
CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
boolean acknowledged = response.isAcknowledged();
log.info(“索引初始化|初始化完成|所有节点是否都已确认:{}”,acknowledged);

}

index初始化的配置
从resource下读取配置文件

@Bean(“indexConfiguration”)
public String initIndexConfiguration() throws IOException {
String indexConfiguration= initEsIndexSetting(“indexInitialization.json”);
log.info(“索引初始化|初始化索引配置文件:{}”,indexConfiguration);
return indexConfiguration;
}

private String initEsIndexSetting(String resource) throws IOException {
ClassPathResource classPathResource = new ClassPathResource(resource);
try (InputStream in = classPathResource.getInputStream()) {
return StreamUtils.copyToString(in, StandardCharsets.UTF_8);
}catch (IOException e){
throw new IOException(e);
}
}

2、数据查询

很明显根据时间戳确定索引名称然后查询就行了

public List queryLisNewt(int from, int pageSize, BoolQueryBuilder queryBuilder,FeedbackReport entity) {

Listresults=new ArrayList<>();

if( StringUtils.isEmpty(entity.getStartDate()) || StringUtils.isEmpty(entity.getEndDate()) ){
log.error(“queryLisNewt|查询错误|开始或结束时间为空|startDate:{}|endDate:{}”,entity.getStartDate(),entity.getEndDate());
return results;
}
long start=DateUtil.parseDateString(entity.getStartDate()).getTime();
long end=DateUtil.parseDateString(entity.getEndDate()).getTime();
if(start <=0l || end <=0l){
log.error(“queryLisNewt|查询错误|解析日期错误:param:{}”,entity);
return results;
}
List indexNames = ElasticsearchUtil.getAllIndexNameByTimeStampRange(newIndexPrefix, start, end);
if(CollectionUtils.isEmpty(indexNames)){
log.error(“queryLisNewt|查询错误|获取索引名称为空:{}”,entity);
return results;
}
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder
.query(queryBuilder)
.from(from)
.size(pageSize)
.sort(SortBuilders.fieldSort(“createTime”)
.order(SortOrder.DESC));

SearchRequest searchRequest = new SearchRequest(indexNames.toArray(new String[]{}),searchSourceBuilder);
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
builder.setHttpAsyncResponseConsumerFactory(new HttpAsyncResponseConsumerFactory
.HeapBufferedResponseConsumerFactory(200*1024*1024));
try {
SearchResponse response = restHighLevelClient.search(searchRequest, builder.build());
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
Map map = hit.getSourceAsMap();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-BIEVLJEh-1712516371377)]

要通过Logstash从Elasticsearch迁移数据,你可以使用Logstash的`elasticsearch`插件。这个插件允许Logstash连接到Elasticsearch,读取数据,并将其输出到其他系统或服务中。以下是一个简单的示例,展示了如何使用Logstash从一个Elasticsearch集群迁移数据到另一个Elasticsearch集群。 首先,确保你已经安装了Logstash,并且有适当的权限从源Elasticsearch集群读取数据,以及将数据写入目标Elasticsearch集群。 接下来,创建一个Logstash配置文件(例如:`migrate.conf`),配置如下: ```conf input { elasticsearch { hosts => ["source-elasticsearch-host:port"] index => "source-index-pattern" query => '{ "query": { "match_all": {} } }' scroll => "2m" size => 1000 } } output { elasticsearch { hosts => ["target-elasticsearch-host:port"] index => "target-index-name" # user => "username" # password => "password" } } ``` 在这个配置文件中,`input`部分定义了从源Elasticsearch集群读取数据的设置。你需要指定源集群的主机和端口、要迁移的索引模式以及要使用的查询。`scroll`参数用于在滚动搜索中保持搜索上下文,这对于处理大量数据很有用。`size`参数指定了每次从Elasticsearch查询返回的文档数。 `output`部分定义了将数据写入目标Elasticsearch集群的设置。同样地,你需要指定目标集群的主机和端口以及目标索引名称。如果目标Elasticsearch集群需要认证,你还需要指定`user`和`password`。 在运行Logstash之前,请确保配置文件是正确的,并且所有必要的选项都已根据你的环境进行设置。 运行Logstash,如下命令: ```bash logstash -f migrate.conf ``` Logstash将开始从源Elasticsearch集群读取数据,并将其迁移到目标Elasticsearch集群。这个过程会一直进行,直到所有符合条件的数据都被迁移
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值