Hive and Pig 박 영 택 컴퓨터학부
Need for High-Level Languages Hadoop은 대용량 데이터 처리에 효율적 모든 작업을 자바로 직접 작성하는 것은 다소 장황하며 시간이 오래 걸림. 모두가 자바를 사용하길 바라거나, 사용할 줄 아는 것은 아님. Solution: higher-level의 데이터 처리 언어를 개발하는 것 Hive: HQL 은 SQL과 유사 Pig: Pig Latin 은 Perl의 사용법과 유사
Hive and Pig Hive: Hadoop에서의 데이터웨어하우스 어플리케이션 Pig: 대용량 데이터 처리 시스템 쿼리언어는 SQL의 변형인 HQL을 사용함. 테이블은 HDFS에 flat file 형태로 저장됨. Facebook에서 개발되어, 현재는 오픈소스 소프트웨어 Pig: 대용량 데이터 처리 시스템 스크립트는 dataflow 언어인 Pig Latin으로 작성됨. Yahoo에서 개발되어, 현재는 오픈소스 소프트웨어 Common idea: 큰 데이터 처리를 가능하게 하도록 higher-level 언어를 제공. Higher-level 언어가 컴파일되어 Hadoop job으로 넘어감.
Hive: Background Facebook에서 시작 “ETL” 은 python을 통해 구현됨. 데이터 처리량은 10s of GBs (2006)에서 1 TB/day 규모의 new data (2007)로 성장하였고, 현재는 그 수십 배 이상으로 성장함.
Motivation Yahoo는 Hadoop 에서의 어플리케이션 작업을 가능케 하기 위해 Pig를 사용해 작업함. 주된 사용 목적은 unstructured data의 처리 동시에, Facebook 은 Hadoop에서의 warehouse solutions 작업을 전개하였고, 곧 Hive의 개발로 이어짐. 산업에서의 Business intelligence를 위해 데이터의 사이즈가 수집되고 분 석 되는 행보는 급격히 성장하여 기존의 warehousing solution는 매우 비 싼 서비스가 됨
Motivation MR의 한계점 M/R model을 사용해야만 함. 재사용 불가. 에러가 발생하기 쉬움. MapReduce 함수의 다중 stage 필요함
Overview Intuitive What’s Hive Unstructured data를 그것의 실제 형태가 어떻든 테이블처럼 보이게 함. 이 테이블들에 SQL 기반의 쿼리를 직접 사용할 수 있음. 해당 쿼리에 대해 지정된 execution plan을 수립함. What’s Hive structured data 를 Hadoop file system에 저장하기 위한 data warehousing system execution Hadoop MapReduce plans을 통해 사용하기 쉬운 쿼리를 제공함.
Pros Pros 대용량 데이터를 쉽게 처리하기 위한 방안 SQL-based queries를 제공 사용자가 정의한 확장된 인터페이스 제공 Programmability Efficient execution plans 을 제공 다른 데이터베이스와의 상호 연동성(Interoperability)
Cons Cons Future work 데이터를 추가하는 방법이 쉽지 않음 HDFS 안의 파일은 수정 불가(immutable) Views / Variables More Operations In/Exists semantic More future work in the mail list
Application Log processing Data/Text mining Business intelligence Daily Report 사용자 행위 평가 및 예측 Data/Text mining 기계 학습 Business intelligence 광고 배달 스팸 메일 감지
Hadoop MR MR은 low-level이며 사용자 정의 프로그래머를 필요로 함. HIVE는 HiveQL라는 SQL과 같은 언어로 표현 된 쿼리를 지원 이는 하 둡에서 실행되며, MR 작업에서 컴파일 됨. HIVE는 MR 스크립트를 사용 할 수 있음. 또한 MetaStore 를 Include 할 수 있으며 쿼리 최적화 및 쿼리 편집에 유용한 스키마와 통계를 포함. 페이스 북 하이브 웨어 하우스에서 수십,수천의 테이블을 포함하고 있으며, 700TB 이상의 저장소와 200 Fb 이상의 유저들에 의해 ad-hoc 보고와 분석에 사용 됨.
Hive architecture (from the paper)
Query Language (HiveQL) Subset of SQL Meta-data queries Limited equality 와 join predicates No inserts on existing tables (to preserve worm property) 전체 테이블을 덮어 쓸 수 있음.
Hive Usage in Facebook Hive와 Hadoop은 Facebook 내에서 다양한 작업을 할 때 많이 사용됨. 700 TB = 2.1Petabyte after replication! Hadoop의 MR은 응용 프로그램 모델을 생각할 때 활용할 수 있음.
mySql : Using a Database 데이터베이스를 시작하려면 먼저 기존 데이터베이스의 유무를 확인해야 함. 현재 서버에 있는 데이터베이스를 찾기 위해 SHOW 문을 사용: mysql> show databases; +----------+ | Database | | mysql | | test | 2 rows in set (0.01 sec) :
Using a Database 새 데이터베이스를 만들기 “create database” 명령을 실행: mysql> create database webdb; 데이터베이스를 사용하려면, “use”명령을 사용: mysql> use webdb;
Creating a Table Empty set은 테이블이 없다는 것을 표시함. 데이터베이스를 선택하면, 모든 데이터베이스 테이블을 볼 수 있음 : mysql> show tables; Empty set (0.02 sec) Empty set은 테이블이 없다는 것을 표시함.
Creating a Table Table: pets 애완 동물을 저장하는 테이블 name: VARCHAR(20) owner: VARCHAR(20) species: VARCHAR(20) sex: CHAR(1) birth: DATE date: DATE VARCHAR is usually used to store string data.
Creating a Table 테이블을 만들려면 이 CREATE TABLE 명령을 사용 : mysql> CREATE TABLE pet ( -> name VARCHAR(20), -> owner VARCHAR(20), -> species VARCHAR(20), -> sex CHAR(1), -> birth DATE, death DATE); Query OK, 0 rows affected (0.04 sec)
Showing Tables mysql> show tables; +------------------+ | Tables_in_test | | pet | 1 row in set (0.01 sec)
Describing Tables 테이블 구조를 보려면, describe명령어를 사용: mysql> describe pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | 6 rows in set (0.02 sec)
Deleting a Table 전체 테이블을 삭제하려면 DROP TABLE 명령을 사용: mysql> drop table pet; Query OK, 0 rows affected (0.02 sec)
Loading Data For example: 테이블에 데이터를 입력하는 INSERT 문을 사용. INSERT INTO pet VALUES ('Fluffy','Harold','cat','f', '1999-02-04',NULL); 다음 슬라이드는 샘플 데이터의 집합을 표시.
SQL Select SELECT 문은 테이블에서 정보를 검색 가능. 일반적인 형식은 다음과 같다: SELECT what_to_select FROM which_table WHERE conditions_to_satisfy
Selecting All Data SELECT문 원하는 컬럼을 출력. mysql> select * from pet; +----------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | | Fluffy | Harold | cat | f | 1999-02-04 | NULL | | Claws | Gwen | cat | f | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Fang | Benny | dog | m | 1999-08-27 | NULL | | Bowser | Diane | dog | m | 1998-08-31 | 1995-07-29 | | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Whistler | Gwen | bird | | 1997-12-09 | NULL | | Slim | Benny | snake | m | 1996-04-29 | NULL | 8 rows in set (0.00 sec)
Selecting Particular Rows 테이블의 조건에 맞는 특정한 행만을 선택 가능. “Bowser”의 생년월일의 변경 사항을 확인하려는 경우 “Bowser” 의 레코드를 선택 : mysql> SELECT * FROM pet WHERE name = "Bowser"; +--------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | | Bowser | Diane | dog | m | 1998-08-31 | 1995-07-29 | 1 row in set (0.00 sec)
Selecting Particular Rows 1998 년 이후에 태어난 모든 동물을 찾으려면 SELECT * FROM pet WHERE birth >= "1998-1-1"; 암컷인 개를 모두 찾으려면 AND를 사용. SELECT * FROM pet WHERE species = "dog" AND sex = "f"; 모든 새나 뱀을 찾으려면, OR을 사용. SELECT * FROM pet WHERE species = "snake" OR species = "bird";
Selecting Particular Columns 테이블에서 전체 행을 표시하지 않으려면, 관심이 있는 열 들을 쉼표로 구분하여 지정. 애완 동물이 태어난 때를 알고 싶은 경우, 이름과 출생 열을 선택함. (see example next slide.)
Selecting Particular Columns mysql> select name, birth from pet; +----------+------------+ | name | birth | | Fluffy | 1999-02-04 | | Claws | 1994-03-17 | | Buffy | 1989-05-13 | | Fang | 1999-08-27 | | Bowser | 1998-08-31 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | | Slim | 1996-04-29 | 8 rows in set (0.01 sec)
Sorting Data 결과를 정렬하려면 ORDER BY 절을 사용. 예를 들면, 동물의 생일을 날짜 별로 볼 수 있음. mysql> SELECT name, birth FROM pet ORDER BY birth; +----------+------------+ | name | birth | | Buffy | 1989-05-13 | | Claws | 1994-03-17 | | Slim | 1996-04-29 | | Whistler | 1997-12-09 | | Bowser | 1998-08-31 | | Chirpy | 1998-09-11 | | Fluffy | 1999-02-04 | | Fang | 1999-08-27 | 8 rows in set (0.02 sec)
Sorting Data 역순으로 정렬하려면 DESC절을 사용할 수 있음. (키워드 내림차순) mysql> SELECT name, birth FROM pet ORDER BY birth DESC; +----------+------------+ | name | birth | | Fang | 1999-08-27 | | Fluffy | 1999-02-04 | | Chirpy | 1998-09-11 | | Bowser | 1998-08-31 | | Whistler | 1997-12-09 | | Slim | 1996-04-29 | | Claws | 1994-03-17 | | Buffy | 1989-05-13 | 8 rows in set (0.02 sec)
What is Sqoop? Sqoop is a tool designed to transfer data between Hadoop and relational databases. You can use Sqoop to import data from a relational database management system (RDBMS) such as MySQL or Oracle into the Hadoop Distributed File System (HDFS), transform the data in Hadoop MapReduce, and then export the data back into an RDBMS. sqoop.apache.org
Sqoop Easy, parallel database import/export What you want do? Insert data from RDBMS to HDFS Export data from HDFS back into RDBMS
Sqoop HDFS Sqoop RDBMS 35 ©2011 Cloudera, Inc. All Rights Reserved.
Sqoop – SQL to Hadoop Open source tool to extract data from structured data st ore into Hadoop Architecture NameNode and DataNode each run an internal web server in order to display basic information about the current status of the cluster
Importing Data With Sqoop MySQL에 로그온 $ mysql –-user=root –-password=cloudera 데이터베이스 목록 확인 > show databases; 데이터베이스 선택 > use retail_db; 테이블 목록 확인 > show tables;
Importing Data With Sqoop ‘customers’ 테이블의 스키마 확인 > DESCRIBE customers;
Importing Data With Sqoop ‘customers’ 테이블의 내용 확인 > SELECT * FROM customers LIMIT 5;
Importing Data With Sqoop $ sqoop list-databases –-connect jdbc:mysql://localhost \ –-username root -–password cloudera
Importing Data With Sqoop sqoop 명령어를 이용해 데이터 베이스 ‘retail_db’ 의 테이블 목록 확인 sqoop list-tables -–connect jdbc:mysql://localhost/retail_db -–username root -–password cloudera
Importing Data With Sqoop 테이블 ‘customers’를 HDFS로 가져오기 $ sqoop import \ --connect jdbc:mysql://localhost/retail_db \ --table customers --fields-terminated-by ‘\t’ \ --username root --password cloudera
Importing Data With Sqoop 명령어가 정상적으로 동작했는지 확인 $ hadoop fs -ls customers $ hadoop fs -tail movie/part-m-00000