kylin_client_tool 提供了对cube进行BUILD,REBUILD,MERGE功能,其中REBUILD却不能达到预期的效果按照指定的segment执行。
场景:
当我在kylin web页面对cube进行两次构建(分别是2000-01-01——2017-12-01, 2017-12-01——2017-12-02),我要对第二个段进行重构,执行python kylin_client_tool.py -P project_name -M REBUILD -C cube_name -T 2017-12-01 -E 2017-12-02,并没有按照预想的结果只对segment:2017-12-01——2017-12-02重构,反而对段2000-01-01——2017-12-01, 2017-12-01——2017-12-02都进行了重构,这里源代码有个bug,稍微做下修改即可。
解决方案:
需要修改的源代码:kylin_client_tool/scheduler/workers/cube.py 第115行determine_segment_range方法
114 @staticmethod
115 def determine_segment_range(segments, dt_start, dt_end):
116 pointer_dt_start = (int(time.mktime(parser.parse(dt_start).timetuple())) - time.timezone) * 1000
117 pointer_dt_end = (int(time.mktime(parser.parse(dt_end).timetuple())) - time.timezone) * 1000
118
119 if(pointer_dt_start > pointer_dt_end):
120 raise Exception("Start date (%s) is older than end date (%s)!" % (str(pointer_dt_start), str(pointer_dt_end)))
121
122 segments_to_refresh = []
123 for segment in segments:
124 if((pointer_dt_start <= segment.date_range_start and segment.date_range_end <= pointer_dt_end) or # |..|
125 (segment.date_range_start <= pointer_dt_start and pointer_dt_start <= segment.date_range_end) or # .|.|
126 (pointer_dt_end <= segment.date_range_start and segment.date_range_end <= pointer_dt_end) ): # |.|.
127 segments_to_refresh.append(segment)
138 return sorted(segments_to_refresh, key = lambda x: x.date_range_start)
去掉124-127行,for循环里换成下面两行代码:
segment.date_range_start = pointer_dt_start
segment.date_range_end = pointer_dt_end