MapReduce와 쿼리튜닝
참조: programming hive, blog.naver.com/jevida, wikipedia.org
데이터 처리과정
map
map: (key1, value1) -> (key2, value2)
mapper가 데이터를 64mb 단위의 청크로 분할한 후 GFS(Google file system)에 적재
넥스알이 설치한 하둡환경에서 하이브를 가동하면 아래에 작업이 큐에서 넘어간 순간 맵이 생성될 수치와 프로그레시브 바가 나온다.
서버당 코어수를 모두 합친 만큼의 맵 생성이 가능하다고 한다.
이때 2개의 추가복제가 이루어진다. 클러스터링
셔플shuffle
각 데이터를 섞는다.그리고 각기 작업코어에게 전달
reduce
reduce(key2, list(value2)) -> (key3, value3)
각기 데이터를 병렬로 키에 따라 처리후 합친다.
map -> reduce
map -> reduce -> map -> reduce 로 반복될 수 있다.
예시
select age, avg(conttacts)
from social.person
order by age
order by age
위의 작업이 맵리듀를 거칠때
function map is
input: integer k1 between 1 and 1100, representing a batch of 1 million social.person records
for each social.person record in the k1 batch do
let y be the persons's age
let n be the number of contacts the person has
prodece one output record (y, (n, 1))
repeat
end function
맵 함수가 k1 1~1100까지의 키에 대해서 백만개씩의 레코드를 처리하는 작업의 예시. k1각각에 대해서 자료를 처리한다.
function reduce is
input: age(in years) y
for each input record(y, (n, c)) do
accumulate in s the sum of n*c
accumulate in c the sum of c
repeat
let a be s/c
produce one output record(y, (a,c))
end function
옵션 상태확인
set
효과적 inner join
left semi join을 사용하면 왼쪽 테이블의 레코드와 오른쪽 테이블을 매칭하고 찾으면 바로 데이터를 반환함
select a.a, b.b from a left semi join b on a.id=b.id
카테시안 프러덕트
select a.*, b.* from a join b where a.id=b.id
rdb는 where절이 적용되나 하이브에서는 먼저 카테시안 프러덕트가 생성된다.
hive.mapred.mode가 strict로 되어 있어야만 카테시안 프러덕트 생성을 막는다.
현재 사용중이 hive에선 디폴트로 nonstrict로 되어 있다.
on절에서 or 사용
하이브는 on절에서 or 사용이 안됨
대신에 union all을 사용
on a.id=b.id or a.id=b.key <- 앙되요
아래와 같이 사용
select .... on a.id=b.id
union all
select .... on a.id=b.key
조인키와 테이블
하이브는 왼쪽에서 오른쪽으로 조인 한다.
(근데 2015년경에 나온 책에서는 이렇게 설명되었다가 그 후 버전부터 자동으로 작은테이블->큰테이블 순으로 조인해 준다고 되어 있었다. 무엇이 맞는거인지... 좀 더 알아보자)
조인 각각의 쌍은 각각의 맵리듀스 잡이 사용된다.
3개 이상의 테이블이면 맵리듀스 잡이 2개인데 만약 3개의 테이블이 같은 조인키를 사용하면 하나의 맵리듀스가 사용된다.
플로우가
리듀스1 -> 리듀스2 이런식으로 가던게 리듀스1로 처리된다는 뜻
outer join은 파티션 필터를 사용하지 않음. 내부조인의 on에 파티션 필터를 사용하고 outer join과 연결
마스터노드(네임노드)-여러대의 데이터노드
네임노드: hdfs 메타관리 클라이언트가 접근을 하도록 조정. 블록 데이터를 데이터 노드에 분산 저장
데이터노드: 핫비트와 블록리포트를 주기적으로 네임노드에 전달
네임노드의 에디트로그, 파일시스템 이미지
에디트로그: hdfs의 메타에 대한 변화를 기록하는 로그
파일시스템 이미지 fsimage: 파일 디렉터리, 파일명, 상태에 대한 블록 매핑정보 저장
하둡 파일삭제 명령
hadoop fs -rm -skipTrash /user/data/file
파일을 삭제해도 하루 정도 남아 있다가 사라진다. 셋팅에서 관련된 기능 변경 메뉴들이 있었다.
위의 명령을 사용하면 휴지통에 들어가지 않는다고 한다.
code2 에러 처리방법
set hive.execution.engine=mr
또는 메모리 추가 확보
map task memory변경 mapreduce.map.memory.mb=
ask memory 변경 mapreduce.reduce.memory.mb
쿼리실행계획
explain select.......
explain extended select .......
explain analyze select ...... 실제 참조하는 row 정보를 확인
hive merge
다수의 파일을 합쳐서 처리하여 hdfs에 부담을 주지 않는 작업 방식
map reduct시 : set hive.merge.mapredfiles=true
tez작업시: set hive.merge.tezfiles=true
실행여부 확인은 set hive.execution.engine
머지작업의 대상 파일 크기 set hive.merge.smallfiles.avg=32000000
머지로 묶는 기준: set hive.merge.size.per.task=2560000000
일부샘플
select * from dmd_info(0.1 percents)