天天看點

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昨天的問題資料了。

繼續閱讀