Apache Hive 빅데이터분산컴퓨팅 박영택
Apache Hive 개요 Apache Hive 는 MapReduce 기반의 High-level abstraction HiveQL은 SQL-like 언어를사용 Hadoop 클러스터에서 MapReduce 잡을생성함 Facebook 에서데이터웨어하우스를위해개발되었음 현재는오픈소스인 Apache 프로젝트
Hive 유저를위한 High-Level 개요 Hive 는 Client Machine 에서동작 HiveQL 질의문을 MapReduce job 으로변환 jobs 을클러스터에등록
Hive 를왜사용하는가? MapReduce 를직접작성하는것보다좀더생산적임 Java 로 100 라인작성해야할것을 5 라인의 HiveQL 로구현가능 폭넓은사용자에게대용량데이터를분석할수있는기회제공 소프트웨어개발경험이필요없음 기존 SQL 지식을가진사용자가사용가능 다른시스템과의상호운용성제공 Java 나외부 Scripts 를통해확장가능 많은 Business Intelligence(BI) 툴들이 Hive 를지원함
어떻게 Hive 에서데이터를 Load, Store 하는가? Hive 는데이터포멧과위치를가지고있는 metasotre 를가지고있음 질의문자체는파일시스템 (HDFS) 에저장되어있는데이터에게질의함
Hive 와 Relational Database 와의차이점 Hive 는데이터포멧과위치를가지고있는 metasotre 를가지고있음 질의문자체는파일시스템 (HDFS) 에저장되어있는데이터에게질의함
Hive shell 사용법 Hive shell 에서 HiveQL 문장을실행시킬수있음 MySQL Shell 의 interactive tool 과유사 hive 명령어로 Hive shell 을실행 Hive shell 은 hive> 프롬프트로표현됨 각각의명령어는세미콜론으로문장을끝냄 quit 를사용하여 Hive shell 을빠져나옴
Command Line 으로 Hive 접근방법 HiveQL 코드가들어있는파일을 f 옵션으로실행가능 -e 옵션을통해직접적인 HiveQL 실행가능
Hive 의 Databases 와 Tables 접근방법 현재 Hive 에어떠한 databases 가있는가? USE 명령어를통하여현재사용할 database 변경
Hive 의 Databases 와 Tables 접근방법 ( 계속 ) 현재 database 안에있는 tables 들은어떤것이있는가? databases 에서지정한 table 을포함하고있는 databases 는?
Hive 의 Databases 와 Tables 접근방법 ( 계속 ) table 의기본구조를보기위한 DESCRIBE 명령 좀더세부적인정보를보기위한 DESCRIBE FORMATTED 명령어
Hive 에서 Databases 생성 새로운 database 생성 기존의 database 가있는지를체크하면서 database 생성
Hive 에서 Table 생성 Table 을생성하기위한기본 syntax 기본적으로 HDFS 의 /user/hive/warehouse 경로에생성 위의경로는 Hive 의 warehouse 디렉토리
Hive 에서 Table 생성 ( 계속 ) 테이블의이름을지정하고 column 의이름과 datatype 을지정
Hive 에서 Table 생성 ( 계속 ) 이명령어는파일의각필드가어떤 character 로구분되어있다는것을말해준다.
Hive 에서 Table 생성 ( 계속 ) 예를들면 tab-delimited 데이터라고하면 FIELDS TERMINATED BY \t 로적으면된다.
Hive 에서 Table 생성 ( 계속 ) 마지막으로파일의포멧을지정할수있다. STORED AS TEXTFILE 이 default 이며, 지정하지않을경우 text format 이다.
Table 생성예제 아래의예제는 jobs 이름의 Table 을생성하는예제 데이터는 text 포멧이며하나의 line 에는 comma-separated 형태의 4 개 fields 를가지고있음. 위의 Table 과일치하는 record 의예제
MySQL 의데이터를 HDFS 로가져오기 MYSQL 테이블을 HDFS 를거쳐 Hive 테이블로가져오기 HDFS Hive DATABASE Table Sqoop MYSQL DATABASE Table
MySQL 의데이터를 HDFS 로가져오기 MySQL 에로그온 $ mysql -user=root -password=cloudera 데이터베이스목록확인 mysql> show databases; 데이터베이스선택 mysql> use retail_db; 테이블목록확인 mysql> show tables;
MySQL 의데이터를 HDFS 로가져오기 categories 테이블의내용확인 mysql> SELECT * FROM categories LIMIT ;
MySQL 의데이터를 HDFS 로가져오기 테이블 categories 를 HDFS 로가져오기 $ sqoop import \ --connect jdbc:mysql://localhost/retail_db \ --table categories --fields-terminated-by \t \ --username root --password cloudera
MySQL 의데이터를 HDFS 로가져오기 명령어가정상적으로동작했는지확인 $ hadoop fs -ls categories $ hadoop fs -tail categories/part-m-00000
Hive 데이터베이스생성 테이블을생성하기위한 Hive 의데이터베이스생성 hive> create database hdfs_retail_db; 생성한데이터베이스선택 hive> use hdfs_retail_db;
Hive 테이블생성 테이블생성 hive> CREATE TABLE categories 테이블명 칼럼명 칼럼의데이터타입 (category_id INT, category_department_id INT, category_name STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t ; 불러올파일의각라인을하나의레코드로구분 불러올레코드를 tab 으로구분하여칼럼에저장
Hive 테이블에데이터불러오기및확인 hive> LOAD DATA INPATH categories INTO TABLE categories; hive> SELECT * FROM categories LIMIT 10;
MySQL 의데이터를직접 Hive 로가져오기 MYSQL 테이블을 HDFS 를거치지않고직접 Hive 테이블로가져오기 HDFS Hive DATABASE Table Sqoop MYSQL DATABASE Table
MySQL 의데이터를직접 Hive 로가져오기 새로운 Hive 의데이터베이스생성 hive> create database hive_retail_db; 생성한데이터베이스선택 hive> use hive_retail_db;
MySQL 의데이터를 Hive 로가져오기 HDFS 의기존디렉토리를삭제 $ hadoop fs rm r categories MySQL 의 categories 테이블을 Hive 의 hive_retail_db 로가져오기 $ sqoop import --connect jdbc:mysql://localhost/retail_db \ --username root \ --password cloudera \ --table categories \ --hive-database hive_retail_db \ --hive-import
MySQL 의데이터를 Hive 로가져오기 Hive 로가져온테이블의내용확인 hive> SELECT * FROM categories LIMIT 10;
Hive 의기본명령어 LIMIT 은질의문결과의레코드수를제한 hive> SELECT customer_fname, customer_lname FROM customers LIMIT 10; ORDER BY 는질의문결과를특정칼럼을기준으로정렬 hive> SELECT customer_id, customer_fname FROM customers ORDER By customer_id DESC LIMIT 10; WHERE 는특정칼럼값에조건을설정 hive> SELECT * FROM orders WHERE order_id=1287; hive> SELECT * FROM customers WHERE customer_state IN ( CA, OR, WA, NV, AZ );
예제실행을위한테이블가져오기 Hive 로가져올 MySQL 의테이블내용확인 mysql> SELECT * FROM customers LIMIT 5; mysql> SELECT * FROM orders LIMIT 5;
예제실행을위한테이블가져오기 retail_db 의 customers 테이블을 Hive 로가져오기 $ sqoop import --connect jdbc:mysql://localhost/retail_db \ --username root \ --password cloudera \ --table customers \ --hive-database hive_retail_db \ --hive-import retail_db 의 orders 테이블을 Hive 로가져오기 $ sqoop import --connect jdbc:mysql://localhost/retail_db \ --username root \ --password cloudera \ --table orders \ --hive-database hive_retail_db \ --hive-import
예제실행을위한테이블가져오기 retail_db 의 products 테이블을 Hive 로가져오기 $ sqoop import --connect jdbc:mysql://localhost/retail_db \ --username root \ --password cloudera \ --table products \ --hive-database hive_retail_db \ --hive-import retail_db 의 departments 테이블을 Hive 로가져오기 $ sqoop import --connect jdbc:mysql://localhost/retail_db \ --username root \ --password cloudera \ --table departments \ --hive-database hive_retail_db \ --hive-import
예제실행을위한테이블가져오기 Hive shell 에접속 $ hive 데이터베이스선택 hive> use hive_retail_db; Sqoop 으로가져온 2 개의테이블 (customers, orders) 확인 hive> show tables;
예제실행을위한테이블가져오기 테이블의스키마확인 hive> DESCRIBE customers; hive> DESCRIBE orders;
예제실행을위한테이블가져오기 customers 테이블의레코드수확인 hive> SELECT COUNT(*) FROM customers;
예제실행을위한테이블가져오기 orders 테이블의레코드수확인 hive> SELECT COUNT(*) FROM orders;
Hive 쿼리문사용예 각도시별고객의수를내림차순으로정렬하여출력
Hive 쿼리문사용예 각도시별고객의수를내림차순으로정렬하여출력 hive> SELECT customer_city, COUNT(*) as num FROM customers GROUP BY customer_city [ 질의결과 ] ORDER BY num DESC LIMIT 10; 고객의도시를기준으로그룹화된결과의레코드수를계산
Hive 쿼리문사용예 각도시별고객의수를내림차순으로정렬하여출력 hive> SELECT customer_city, COUNT(*) as num FROM customers GROUP BY customer_city [ 질의결과 ] ORDER BY num DESC 쿼리문내에서 alias 를지정하기위해 as 를사용 LIMIT 10;
Hive 쿼리문사용예 각도시별고객의수를내림차순으로정렬하여출력 hive> SELECT customer_city, COUNT(*) as num FROM customers GROUP BY customer_city [ 질의결과 ] ORDER BY num DESC LIMIT 10; customer_city 칼럼을기준으로레코드를그룹화
Hive 쿼리문사용예 각도시별고객의수를내림차순으로정렬하여출력 hive> SELECT customer_city, COUNT(*) as num FROM customers GROUP BY customer_city [ 질의결과 ] ORDER BY num DESC LIMIT 10; alias 가 num 인출력결과 COUNT(*) 를내림차순으로정렬
Hive 쿼리문사용예 각도시별고객의수를내림차순으로정렬하여출력 hive> SELECT customer_city, COUNT(*) as num FROM customers GROUP BY customer_city [ 질의결과 ] ORDER BY num DESC LIMIT 10; 출력결과의갯수를 10 개로제한
Hive 쿼리문사용예 COUNT 와 GROUP BY 에대한 2 개의맵리듀스 Job 이실행 Job2 hive> SELECT customer_city, COUNT(*) as num FROM customers Job1 GROUP BY customer_city ORDER BY num DESC LIMIT 10;
Hive 쿼리문사용예 COUNT 와 GROUP BY 에대한 2 개의맵리듀스 Job 이실행 Job2 hive> SELECT customer_city, COUNT(*) as num FROM customers Job1 GROUP BY customer_city ORDER BY num DESC LIMIT 10;
Hive 쿼리문사용예 각도시별고객의수를내림차순으로정렬하여출력한결과
Hive 조인을위한테이블구성 customer_id = order_customer_id product_category_id = category_id customers orders products categories departments category_department_id = department_id
Hive 조인의사용예 각고객별주문상황을출력하기위해 2 개의테이블 customers 와 orders 을조인 customers Join orders
Hive 조인의사용예 각고객별주문상황을출력하기위해 2 개의테이블 customers 와 orders 을조인 customers Join orders hive> SELECT customer_lname, order_id, order_status FROM customers c JOIN orders o ON (c.customer_id = o.order_customer_id) LIMIT 10;
Hive 조인의사용예 #1 각고객별주문상황보기 hive> SELECT customer_lname, order_id, order_status FROM customers c JOIN orders o ON (c.customer_id = o.order_customer_id) LIMIT 10;
Hive 조인의사용예 #2 각고객별주문상황보기 products categories Join hive> SELECT category_id, category_name, product_name FROM categories c JOIN products p ON(c.category_id = p.product_category_id) LIMIT 10;
Hive 조인의사용예 #2 카테고리별제품목록보기 hive> SELECT category_id, category_name, product_name FROM categories c JOIN products p ON(c.category_id = p.product_category_id) LIMIT 10;
Hive 조인의사용예 #3 카테고리가속한과를보기 categories Join departments hive> SELECT category_id, category_name, department_name FROM categories c JOIN departments d ON(c.category_department_id = d.department_id) LIMIT 10;
Hive 조인의사용예 #3 카테고리가속한과를보기 hive> SELECT category_id, category_name, department_name FROM categories c JOIN departments d ON(c.category_department_id = d.department_id) LIMIT 10;