https://issues.apache.org/jira/browse/HIVE-2573

Hive 에서 UDF 를 관리하는 FunctionRegistry 클래스는 singleton 으로 하나만 생성되며 HiveServer 와 같이 클라이언트/서버 방식으로 사용하는 경우라면 결과적으로 모든 클라이언트가 하나의 registry 를 share 하게 된다. Hive 에는 UDF 를 등록/제거하는 API 를 제공하고 있는데, 이는 누군가가 UDF 를 재정의 하면 이것이 모든 클라이언트에게 반영된다는 것을 의미한다.

당연히 말도 안되는 문제이고 hive-0.9 시절부터 패치를 만들었지만, 그동안 아무도 관심을 안 가져서 묻혀있던 이슈의 하나이다. 2011 년 11월에 등록했으니 무려 3년 가까이 된..

기본적으로 system function 용 registry 와 session registry 를 따로 만들어 create/drop temporary function 는 session registry 를, create/drop function 은 system registry 를 수정하는 것으로 패치는 엄청 크지만 컨셉도 간단하고 명확하며 구현도 어려울 것이 없음. 

그러나 그동안 permanent function(HIVE-6047) 이라는 요상한 기능이 create/drop function 문법을 먼저 차지해 버리면서 이대로 커밋하는 것이 불가능하게 되었다. 이게 제대로 된 spec 도 없이 대충 만들어 지다 보니 만든 사람도 이게 뭔지 제대로 모르는 것 같음. permanent function 이라는 이름부터가 말도 안되는 것으로, Hortonworks 가 망친 것 중 하나로 꼽을 수 있을 듯.

여튼 이 똥같은 코드와 의미를 새로 정의하느라 일주일 정도 걸린 듯.

신고
Posted by navis94

output commit

2014.10.27 09:43

(Utilities.taskTmpPrefix : "_task_tmp."  , Utilities.tmpPrefix : "_tmp.")


spec_path : ~/_ext-10001

tmpPath : ~/_tmp._ext-10001/

final-paths : tmpPath/taskId 

                    : ~/_tmp._ext-10001/_tmp_~  

taskOutputTempPath : new Path(spec.getParent(), taskTmpPrefix + spec.getName() 
                                        : ~/_task_tmp._ext-10001/

output-paths : new Path(taskOutputTempPath, tmpPrefix + taskId) 

                         : ~/_task_tmp._ext-10001/_tmp_~  


output -> final 은 FileSinkOperator 가 close 될때, final -> spec 은 jobClose 가 호출될때 수행됨(Utilities.mvFileToFinalPath).

신고
Posted by navis94

예전에 구현한 pseudo-MR 이 몇몇 테스트에서 FAIL 을 발생시켜서 내용을 조사. 


기본적으로 기존 jobClose 는 parent operator 의 상태와 관계없이 child 에게 전부 전파하는 방식으로 구현되어 있었는데, 우리는 이걸 partially jobClose 를 할 필요가 있으므로 모든 parent 들이 jobClose 된 상태인 경우에만 전파하게 하였다. 8시간짜리 테스트를 돌려서 결과를 보니 auto_join, bucket_mapjoin 등의 결과가 누락되는 문제 발생. 웃긴건 실제 환경에서는 아무 문제가 없는데 qtest 에서만 문제가 생김.

1. mapper 가 수행되기 전에 기존 root-operator 들을 MapOperator 라는 runtime operator 의 child 로 등록을 하는데, in-memory 상황에서는 이것이 그대로 남다보니 jobClose 가 아예 전파되지 않음.
2. 몇몇 top operator 들은 MapWork 의 aliasToWork mapping 에 존재하지 않음. 이들에 대해서 jobClose 가 전파되지 않음.
3. reducer operator 의 parents 들의 children 은 null 로 setting 되는데, reducer operator 의 parent 는 null setting 되지 않고 남은 상태 이므로 reducer 에 대해 호출된 jobClose 가 전파되지 않음.

벼라별 삽질 끝에, ExecDriver 에서 jobClose 를 호출하기 전에 전체를 싹 다 뒤져서 top-operator 를 추출하고 순서대로 jobClose 를 호출하게 수정. 오늘밤 테스트 예정.

추가

4. MapOperator 에서는 필요한 input 에 해당하는 operator 들만 자신의 child 로 등록을 하는데, 여기에 해당하지 않는 operator 들의 parent 로도 자신을 등록을 하여 jobClose 가 되지 않는다. 

신고
Posted by navis94

카테고리

분류 전체보기 (31)
Apache Hive (29)

최근에 달린 댓글

최근에 받은 트랙백

태그목록

달력

«   2014/10   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

티스토리 툴바