hive PTF-WINDOWING

2015.01.22 11:12

까먹기 전에..

TABLE-DEF 는 WINDOW-DEF 와 PTF-DEF 로 나뉜다. WINDOW-DEF 는 일반적인 윈도우 선언을 사용하는 function 들이고 PTF-DEF 는 사용자가 임의의 테이블을 만들어 내는 function 으로 script operator 와 동일한 성격을 가진다고 보면 된다 (noop/noopwithmap/matchpath 등이 있는데 몇개 없음). OpConf 내의 정의와 실제 evaluation 되는 순서는 반대이므로 주의.

PartitionedTableFunctionDef : TABLE-DEF2 -> TABLE-DEF1 -> INPUT-TABLE

PTFInvocation : INPUT -> TABLE-DEF1 -> TABLE-DEF2

* 기본적으로 각 DEF 에 대해 start-partition -> process-row* -> finish-partition 순서로 진행

target partition 이 처리되는 방식에 따라 input streaming mode 와 non-input-streaming mode 로 나눌 수 있다. input streaming 은 partition 내의 row 를 하나씩 넣으면서 결과를 뽑아내는 방식이고 non-input-streaming 는 전체 파티션을 다 읽어 partition iterator 를 만든 후 이를 처리하는 방식이다. 이 중에 input streaming mode 가 좀 더 효율적이라 할 수 있다. non-input-streaming mode 는 결과값을 만들어 내는 방식에 따라 다시 iterator-out mode 와 partition-out mode 로 나뉜다.

우선 TABLE-DEF 들이 input streaming mode 가 가능 한지를 검사 (TableFunctionEvaluator.setCanAcceptInputAsStream()) 하여 모든 하위 function 들이 아래와 같은 범주에 속하는 경우에는 input streaming mode 를 적용할 수 있다.

1. The Function implements ISupportStreamingModeForWindowing 

2. Or returns a non null Object for the getWindowingEvaluator, that implements ISupportStreamingModeForWindowing. 

3. Is an invocation on a 'fixed' window.  So no Unbounded Preceding or Following.

non-input-streaming mode 의 경우 output 을 iterator 방식으로 줄 수 있는지를 조사한다. WINDOW-DEF 와 input-streaming 이 가능 한 모든 TABLE-DEF 들이 iterator 방식에 속한다. input 은 partition iterator 로 동일하지만 output 방식에 따라 호출되는 메쏘드가 다르다.

partition-out : execute(PTFPartitionIterator<Object> pItr, PTFPartition outP))

iterator-out : Iterator<Object> iterator(PTFPartitionIterator<Object> pItr)

최악의 경우 function * partition row 의 evaluation 이 일어나며 function * partition row ^2 의 컬럼 억세스가 발생한다. 


실제 값을 evaluation 하는 방법은 function 의 종류에 따라 달라지며, 아래와 같이 총 3 가지가 있다.

streaming function

non-streaming function : pivot + non-pivot

streaming function 이라도 외부 조건에 따라 non-streaming 방식으로 사용 될 수 있으며, 이 function 이 pivot 이 가능하다면 non-streaming pivot function 으로 간주된다. (non input-streaming mode에서 getRowsRemainingAfterTerminate() 가 0 이 아닌 경우. input streaming  mode 에서는 항상 사용 가능)

streaming function 의 경우 process-row 에서 들어오는 row 값으로 그때 그때 evaluation 한다. 이때 function 의 특성에 따라 결과가 바로 나올 수도 있고 안나올 수도 있는데 (window frame 이 following X 가 있는 경우), 결과값이 나오면 이 값을 다음 TABLE-DEF 로 넘겨서 계속 evaluation 을 진행한다. 이경우 마지막 finish-partition 이 호출될 때에 나머지 결과값들이 나오게 된다. input-streaming mode 에서는 이러한 방식이 가능하지만 non input-streaming mode 에서는 현재 불가능 하다.

non-streaming/pivot function 은 PTFPartitionIterator 에 대한 결과 값을 전체 LIST 형태로 반환하는 것으로 앞서 설명한 것 처럼 streaming 타입으로 처리하는 것이  불가능 한 경우에 사용된다. 전체 파티션에 대한 해당 컬럼의 결과는 한번 evaluation 되어 LIST 형태로 저장되며, 여기에서 값을 하나씩 꺼내 가는 방식으로 동작한다. pivot 타입이 아닌 경우 이는 전체 partition 에 대해 동일한 결과를 내는 함수로 것으로 간주되며, 한번 evaluation 된 값이 모든 row 에 동일하게 적용된다. 

non-streaming/non-pivot function 은 row index 가 증가할 때 마다 그에 맞는 범위의 partition iterator 를 생성하며, 이 범위의 모든 값을 iterate + terminate 한 결과값을 반환한다.

1. partition out 의 경우 조건상 streaming 을 사용할 수 없다. 

streaming 타입으로 처리하는 것이 가능한 경우는 결과 Iterator 내에서 next 가 호출될 때 값이 evaluation 된다. 




신고
Posted by navis94


hive-0.15.0 의 hadoop 버전이 2.6으로 올라가서 (귀찮게스리) 이번에 업그레이드를 했다. 하고나니 MR 이고 TEZ 고 다 안됨. 리소스 매니저님이 노드가 맘에 안드신다고 (http://localhost:8088/cluster/nodes/unhealthy) 하셔서 보니 

1/1 local-dirs are bad: /tmp/hadoop-navis/nm-local-dir; 1/1 log-dirs are bad: /home/navis/projects/hadoop-2.6.0/logs/userlogs

라고 써있다. 다시 node-manager 로그를 찾아 보니 

WARN org.apache.hadoop.yarn.server.nodemanager.DirectoryCollection: Directory /home/navis/projects/hadoop-2.6.0/logs/userlogs error, used space above threshold of 90.0%, removing from list of valid directorie

라네. 120G 짜리 SSD 인데 벌써 다 찼나 보다. 게임도 없고 동영상도 없는데.. 여튼 HDFS 상의 데이터들을 좀 지워줘야 할 듯.


참고로 위의 90% 는 디폴트 값인데, 아래와 같은 긴 이름의 설정을 변경하여 무시할 수도 있겠다.

yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage=100


아예 다 끌수도 있다.

yarn.nodemanager.disk-health-checker.enable=false;


이 외에도 interval-ms / health-checker.interval-ms / min-healthy-disks / max-disk-utilization-per-disk-percentage / min-free-space-per-disk-mb 등등이 있음.


----

Hive 의 MiniTezTest 가 안되는 것도 동일한 문제에서 발생한 것으로 보임. 데이터 디렉토리 날리고 나니 잘 돌아감.

신고
Posted by navis94

카테고리

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

최근에 달린 댓글

최근에 받은 트랙백

태그목록

달력

«   2015/01   »
        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

티스토리 툴바