빅데이터

MapReduce와 쿼리튜닝

도그사운드 2023. 9. 27. 17:25

참조: 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)