programming/hadoop

[Hadoop] 데이터 분석 실습(Hive)

6. 데이터 분석 실습(Hive)

 

6.1 Hadoop 기반의 기술들

6.1.1 MapReduce

 

6.1.2 Hadoop streaming

펄, 파이썬 등의 다른 언어로 개발

 

6.1.3 Hive

HiveQL로 개발 (페이스북)

 

6.1.4 Pig

pig script로 개발 (트위터)

 

 

6.2 Hive

6.2.1 하둡 기반에서 실행되는 라이브러리

6.2.2 자바 코드 대신 SQL 구문을 사용(HiveQL)

Hive 2에서 MapReduce 방식의 실행은 아직 가능하나 향후 버전에서는 더이상 지원되지 않을 수 있으므로 Tez, Spark 등의 다른 분산처리 라이브러리를 사용하거나 Hive 1 버전 사용을 권고하고 있음.

 

 

6.3 Hive 설치

6.3.1 다운로드

hive-2.3.2-bin.tar.gz 압축파일을 /home/centos/hive-2.3.2 에 복사

 

6.3.2 MySQL 설치(윈도우즈에 설치)

Hive에서 mysql 데이터베이스에 meta 데이터를 저장하고 연동하기 위해 윈도우즈에 mysql 설치
mysql 설치 완료 후 방화벽에서 3306 포트 개방

 

6.3.3 HIVE_HOME을 환경변수에 추가

gedit /etc/profile

export HIVE_HOME=/home/centos/hive-2.3.2

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin

 

변경 사항 적용 및 재부팅

source /etc/profile

reboot

 

복사하여 붙여넣기를 하다가 에러가 날 경우 우선 메모장에 붙인 후 다시 터미널에 리눅스에 붙어넣으면 잘 됨, 그래도 에러가 나면 한줄로 만든 후 붙이면 잘 됨 sql의 경우 여러 라인을 붙이는 것도 가능하나 라인 앞부분에 공백이 있으면 에러가 발생할 수 있으므로 주의.

 

6.3.4 hive-env.sh 수정

gedit $HIVE_HOME/conf/hive-env.sh

 

hive-env.sh 48번 라인 수정

HADOOP_HOME=/home/centos/hadoop-2.9.0

 

6.3.5 mysql-connector-java-5.1.46-bin.jar 파일을 lib 디렉토리에 복사

 

6.3.6 conf/hive-sitr.xml 생성

gedit $HIVE_HOME/conf/hive-site.xml

<?xml ver...

<value>jdbc:mysql://mysql_ip:3306/hive?useSSL=false&

 

 

6.4 Hive 실습

6.4.1 metastore 초기화 작업

hive를 실행하기 전에 metastore를 초기화시켜야 함

mysql에서 데이터베이스 생성(윈도우즈의 HeidiSQL에서 실행)

CREATE DATABASE Hive;

 

metastore 초기화 작업

schematool -initSchema -dbType mysql

 

에러가 날 경우 mysql 데이터베이스 삭제 후 다시 만들기(윈도우즈의 HeidiSQL에서 실행)

DROP DATABASE Hive;
CREATE DATABASE Hive;

 

6.4.2 hdfs 디렉토리 생성

hdfs dfs -mkdir /tmp
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/hive
hdfs dfs -mkdir /user/hive/warehouse
hdfs dfs -chmod g+x /tmp
hdfs dfs -chmod g+x /user/hive
hdfs dfs -chmod g+x /user/hive/warehouse

 

6.4.3 hive 실행

hive

 

6.4.4 HiveQL 실습

테이블 만들기(대소문자 구분없이 작성)

CREATE TABLE Dept (
    dname   STRING,
    loc     STRING,
    deptno  INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
CREATE TABLE Emp (
    empno       INT,
    ename       STRING,
    job         STRING,
    mgr         INT,
    hiredate    STRING,
    sal         INT,
    comm        INT,
    deptno      INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
CREATE TABLE Salgrade (
    grade INT,
    losal INT,
    hisal INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
show tables;

load data local inpath '/home/centos/data/emp/dept.csv'

overwrite into table dept;

load data local inpath '/home/centos/data/emp/emp.csv'

overwrite into table emp;

load data local inpath '/home/centos/data/emp/salgrade.csv'

overwrite into table salgrade;

set hive.cli.print.header=true;

select * from emp;

select e.ename, d.deptno, d.dname

from emp e, dept d

where e.deptno = d.deptno

and e.job like '%CLERK%';

select deptno, count(*) cnt, sum(sal) sum_sal, avg(sal) avg_sal from emp

group by deptno

order by deptno;

 

항공운항 테이블 만들기

create table ontime (

year int,

month int,

 

)

 

6.4.5 Hive 테이블에 자료 업로드

csv 파일의 첫라인 제거

sed -e '1d' 2006.csv > 2006_new.csv

sed -e '1d' 2007.csv > 2007_new.csv

sed -e '1d' 2008.csv > 2008_new.csv

 

csv 파일의 자료를 hive 테이블로 insert (hive에서 실행)

load data local inpath '/home/centos/data/airline/2006_new.csv'

overwrite into table ontime

partition (delayyear = '2006');

load data local inpath '/home/centos/data/airline/2007_new.csv'

overwrite into table ontime

partition (delayyear = '2007');

load data local inpath '/home/centos/data/airline/2008_new.csv'

overwrite into table ontime

partition (delayyear = '2008');

 

확인(hive에서 실행)

limit 라인수(라인수를 제한함)

select * from ontime limit 10;

 

6.4.6 2006~2008년의 도착지연건수 조회

select year, month, count(*)

from ontime

where depdelay > 0

group by year, month

order by year, month;

파일 목록 확인

hdfs dfs -ls /user/hive/warehouse/ontime

 

6.4.7 2008년도의 도착지연건수 조회

select year, month, count(*) as arrive_delay_count

from ontime

where delayyear = 2008 and arrdelay > 0

group by year, month

order by year, month;

 

6.4.8 테이블 조인 실습

항공사 테이블

문자열 필드의 따옴표 제거

find . -name carriers.csv -exec perl -p -i -e 's/"//g' {} \;

 

create table(hive에서 실행)

create table carrier_code(code string, description string) row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile;

 

load data(hive에서 실행)

load data local inpath '/home/centos/data/airline/carriers.csv' overwrite into table carrier_code;

 

join query (hive에서 실행)

select a.year, a.

 

6.4.9 3개 이상의 테이블을 조인

공항데이터의 따옴표 제거

cd /home/centos/data/airline

find . -name airports.csv -exec perl -p -i -e 's/"//g' {} \;

airport_code 테이블 생성

create ta

데이터 import

load data local inpath

3개 테이블 조인

select a.year,