天天看点

Kylin中Segments overlap的解决办法

        我们公司的有初具规模的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)
        
           

注意:优先使用 kylin的 WEB控制台的 system 页签下的 Action  “reload metadata“来加载数据试一试,不行再走下面的过程。

(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昨天的问题数据了。

继续阅读