我们公司的有初具规模的Hadoop、Spark集群,用来做离线数据统计与分析。今年初引入Kylin来进行成熟业务的与计算,当然用Hbase来存储Kylin的结果数据了。由于业务数据规模增长较快,处理日志的时候越来越慢了,于昨日进行部分硬件升级。升级过程中,直接是将hadoop等集群直接关闭的,但是出了一个严重纰漏,先关闭的HDFS,再关闭的Hbase,导致HBASE中可能有数据没有刷新到磁盘,在今天进行KYLIN增量计算的时候,都失败了,在手动刷新的时候,一直报:Segments overlap错误,几经折腾终于是弄好了,特记录下整个过程已作参考。
(1)错误表现形式
2017-11-01 22:51:08,285 ERROR [http-bio-7070-exec-12] controller.CubeController:296 : Segments overlap: cube_logs_app_event_lodate_eventkey_channel_version_param[201710310000
00_20171101000000] and cube_logs_app_event_lodate_eventkey_channel_version_param[20171031000000_20171101000000]
java.lang.IllegalStateException: Segments overlap: cube_logs_app_event_lodate_eventkey_channel_version_param[20171031000000_20171101000000] and cube_logs_app_event_lodate_eve
ntkey_channel_version_param[20171031000000_20171101000000]
at org.apache.kylin.cube.CubeValidator.validate(CubeValidator.java:85)
at org.apache.kylin.cube.CubeManager.updateCubeWithRetry(CubeManager.java:401)
at org.apache.kylin.cube.CubeManager.updateCube(CubeManager.java:353)
at org.apache.kylin.cube.CubeManager.appendSegment(CubeManager.java:472)
at org.apache.kylin.cube.CubeManager.appendSegment(CubeManager.java:459)
at org.apache.kylin.rest.service.JobService.submitJob(JobService.java:210)
(2)处理过程
最开始是根本摸不着头脑,在KYLIN的WEB控制台的Monitor面板根本看不到任何失败或者处理中的JOB,但是反复多次Rebuild、Merage、Refresh等都是提示一样的错误。接下来就找度娘和Google求助,没有找到有效信息。 最开始想到的就是 删除掉 Segments后再重新BUILD,于是找到了 Rest API接口来操作,命令如下:
curl -X DELETE -H "Content-Type:application/json;charset=UTF-8" -H "Authorization: Basic YWRtaW416S1lMSU4=" http://HOST55:7070/kylin/api/cubes/cube_logs_advert_logdate_advert_id_terminal_type/segs/20171031000000_20171101000000
但是上述失败了,只能删除有效的Segment,并且还只能删除头或尾的短,像我这里的处于不正常状态的Segment(kylin 的metadata存在,但是对应的HBASE中不存在表,存储空间为0)是删除不掉的。
接下来就考虑是否可以直接删除元数据。
直接备份元数据: ./bin/metastore.sh backup (这一步太重要了,否则KYLIN的数据一不小心就没啦)
检查元数据:./bin/metastore.sh clean
清除无效数据: ./bin/metastore.sh clean --delete true
上述操作下来,问题还是照旧,没有任何变化。
接下来就只能考虑直接手动修改元数据,再恢复了。
执行下述命令,找到可能的错误点:
fgrep -r 20171031000000_20171101000000 ./$KYLIN_HOME/meta_backups_OK/meta_2017_11_01_19_30_49
在文件 $KYLIN_HOME/meta_backups/meta_2017_11_01_19_30_49/cube]$vi cube_logs_advert_logdate_advert_id_terminal_type.json 的末尾找到如下数据,直接删除掉后再保存。
, {
"uuid" : "32eb368f-d75f-4ea8-951f-0ace62958215",
"name" : "20171031000000_20171101000000",
"storage_location_identifier" : "KYLIN_2AOZN2GZX3",
"date_range_start" : 1509408000000,
"date_range_end" : 1509494400000,
"source_offset_start" : 0,
"source_offset_end" : 0,
"status" : "NEW",
"size_kb" : 0,
"input_records" : 0,
"input_records_size" : 0,
"last_build_time" : 0,
"last_build_job_id" : null,
"create_time_utc" : 1509492601706,
"cuboid_shard_nums" : { },
"total_shards" : 0,
"blackout_cuboids" : [ ],
"binary_signature" : null,
"dictionaries" : null,
"snapshots" : null,
"rowkey_stats" : [ ]
}
接下来就是清理掉KYLIN的元数据,再用修改后的元数据恢复。
./bin/metastore.sh reset
./bin/metastore.sh restore $KYLIN_HOME/meta_backups/meta_xxxx_xx_xx_xx_xx_xx
至此问题才得以解决,KYLIN又可以欢快的Rebuild昨天的问题数据了。