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 접근 방법 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 디렉토리
테이블의 이름을 지정하고 column의 이름과 datatype을 지정 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 테이블로 가져오기 Hive HDFS 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> 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은 질의문 결과의 레코드 수를 제한 ORDER BY는 질의문 결과를 특정 칼럼을 기준으로 정렬 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로 가져오기 --table orders \
예제 실행을 위한 테이블 가져오기 ‘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로 가져오기 --table departments \
예제 실행을 위한 테이블 가져오기 Hive shell에 접속 데이터베이스 선택 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 LIMIT 10; 쿼리 문 내에서 alias를 지정하기 위해 as를 사용
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이 실행 hive> SELECT customer_city, COUNT(*) as num FROM customers GROUP BY customer_city ORDER BY num DESC LIMIT 10; Job2 Job1
Hive 쿼리문 사용 예 COUNT와 GROUP BY에 대한 2개의 맵리듀스 Job이 실행 hive> SELECT customer_city, COUNT(*) as num FROM customers GROUP BY customer_city ORDER BY num DESC LIMIT 10; Job2 Job1
Hive 쿼리문 사용 예 각 도시별 고객의 수를 내림 차순으로 정렬하여 출력한 결과
Hive 조인의 사용 예 각 고객별 주문 상황을 출력하기 위해 2개의 테이블 ‘customers’와 ‘orders’을 조인 Join orders
Hive 조인의 사용 예 각 고객별 주문 상황을 출력하기 위해 2개의 테이블 ‘customers’와 ‘orders’을 조인 Join hive> SELECT customer_lname, order_id, order_status FROM customers c JOIN orders o ON (c.customer_id = o.order_customer_id) LIMIT 10; orders
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 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; categiries
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 카테고리가 속한 과 를 보기 categiries 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;