1. 서론
이번 포스팅에서는 Hadoop 시스템 서비스 중 하나인 Hive에 대해 설명 및 간단한 예제를 진행하려고 합니다.
2. Hive
Hive는 페이스 북에서 개발 되었습니다.
Hive는 하둡에 저장된 데이터를 sql 기반으로 간편히 mapreduce를 수행할 수 있으며,
추가로 elasticsearch, hbase와 같은 저장소와 hdfs상의 중간 인터페이스 역할도 제공합니다.
hdfs에 있는 파일은 일반적으로 tab 혹은 , 으로 구분자를 통해 각 자리에 의미있는 데이터가 있습니다.
이러한 구분자를 기반으로 테이블을 생성해주고, select, insert쿼리를 수행할 수 있게 해줍니다.
단, update 와 delete쿼리는 지원되지 않습니다.
이유는, 결국 데이터는 구분자를 통한 파일의 한줄이기 때문입니다.
그 말은, DB와 같이 인덱싱이 걸려있지도, key가 있지도 않다는 의미입니다.
테이블은 아래와 같이 2가지가 존재합니다.
- managed table
- external table
1) managed table
hdfs의 데이터를 Hive에서 관리한다는 의미를 가지고 있습니다.
그렇기 때문에, drop table 질의를 하는 경우 hdfs의 데이터도 사라지게 됩니다.
2) external table
hdfs의 데이터와 hive 테이블과 심볼릭 링크가 걸린다고 생각하시면 됩니다.
그렇기 때문에, drop table 질의를 하는 경우에도 hdfs의 데이터는 유지가 됩니다.
3. 예제
예제로는 hdfs에 있는 데이터를 external 테이블로 만든 후, sql를 통하여 managed table로 만들고 두 테이블을 모두 drop 했을때의 hdfs 데이터 상태를 봐보도록 하겠습니다.
1) 데이터 준비
저는 아래와 같이 \t 구분자로 데이터를 hdfs:/user/young에 놓았습니다.
kim 1
geon 2
young 3
kim 1
geon 2
yeong 3
2) external table 생성
Hive에 접속하기 위해 hive 명령어를 통해 접속합니다.
그 후, 기본적으로 있는 default DB를 사용하도록 하겠습니다.
이제 아래와 같이 external 테이블을 생성합니다.
CREATE EXTERNAL TABLE temp
(
text string,
count int
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/user/young';
ROW FORMAT DELIMITED FIELDS TERMINATED BY 에는 한 라인에서 데이터를 나눌 구분자를 지정합니다.
저의 경우 \t으로 데이터를 만들었기 때문에 '\t'를 지정합니다.
LOCATION 에는 연결을 원하는 hdfs상 디렉토리경로를 지정합니다.
아래와 같이 테이블을 생성하게 되면 테이블 목록에 보이게 되며,
select 쿼리를 통하여 데이터를 조회할수도 있습니다.
3) managed table 생성
이젠 이 external table을 사용하여 새로운 managed table을 만들어보겠습니다.
쿼리는 아래와 같습니다.
CREATE TABLE temp_managed
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/user/young2'
AS
SELECT text, sum(count)
FROM temp
GROUP BY text
;
text로 group by 로 묶어서 count를 더하는 wordcount의 reducer의 역할을 하도록 쿼리하였고,
결과를 /user/young2 디렉토리에 놓도록 지정하였습니다.
managed 테이블은 단순히 external 이 아닌 create table로 테이블을 만들면 됩니다.
쿼리가 수행 후에는 아래와 같이 테이블 목록 및 hdfs에도 파일이 생성된것을 확인할 수 있습니다.
4) external table drop
이번에는 처음 만들었던 external table인 temp를 drop 시킨 후 hdfs의 파일을 봐보도록 하겠습니다.
쿼리는 아래와 같습니다.
drop table temp;
결과로는 아래와 같이 hdfs상의 데이터에는 영향이 없는것을 볼 수 있습니다.
이것은, 단순히 hdfs와 hive table간의 link만 끊은 것이기 때문입니다.
5) managed table drop
이번에는 managed table인 temp_managed 를 drop 시킨 후 hdfs 파일을 보도록 하겠습니다.
쿼리는 아래와 같습니다.
drop table temp_managed;
결과는 아래와 같이 hdfs의 데이터도 모두 삭제되어 No such File 구문이 나온것을 볼 수 있습니다.
추가로, Hive는 sql을 통해 간편히 데이터를 핸들링하기 위한 인터페이스이고, 모든 작업은 mapreduce로 이루어집니다.
4. 하이브 지원 SQL
하이브에서만 지원되는 sql 들이 있습니다.
그 중, 알아두면 유용할 정렬에 관련해서 아래 3개에 대해 정리하였습니다.
1) sort by
order by 와 비슷하게 느낄수도 있습니다.
하지만 order by의 경우에는 전체 결과를 하나의 리듀서가 정렬을 하게되는 반면,
sort by의 경우에는 각 리듀서에서 정렬을하게 됩니다.
그로인해, 리듀서 갯수 multiple이기 때문에 성능에 이점을 볼 수 있습니다.
단, 각 리듀서에서만 정렬이 이루어지기 때문에 정확히 정렬된 결과물은 보장되지 않습니다.
>리듀서 갯수를 한개로 한다면 order by 와 동일한 결과가 나옵니다.
2) distribute by
distribute by로 지정한 칼럼 기준으로 한 리듀서에 지정한 동일한 칼럼값의 데이터가 가도록 나누는 역할을 합니다.
예로, 아래와 같은 데이터가 있을 시
name | age |
kim | 1 |
geon | 2 |
yeong | 2 |
distribute by age 를 하게되면 한 리듀서에는 (kim, 1)를 받게되고, 다른 리듀서는 (geon, 2), (yeong, 2)를 받게됩니다.
3) cluster by
cluster by는 distribute by와 sort by를 모두 한다고 보면 됩니다.
cluster by age를 하게되면, 각 리듀서는 age 기준으로 데이터 묶음을 받게되고 각 리듀서는 age기준으로 정렬하게 됩니다.
5. 마무리
이번 포스팅에서는 Hive에 대해 포스팅 하였습니다.
이렇게, Hadoop에 대한 포스팅을 완료했습니다.
다음 포스팅에서는 Hadoop eco system에서 많이 쓰이는 Spark에 대해 진행하도록하겠습니다.
감사합니다.
'BigData > Hadoop' 카테고리의 다른 글
(3) Hadoop 사용법 (0) | 2020.03.09 |
---|---|
(2) Hadoop 설치 (0) | 2020.03.05 |
(1) Hadoop에 대해 (0) | 2020.03.04 |