피그
더 많은 작업
- Pig
- 하둡의 복잡한 추출, 변환, 적재 작업을 손쉬운 스크립트 언어로 구현 가능
- 다수의 중간 결과물이 필요한 복잡한 분석 쿼리에도 적합
- 대량의 조인 연산이나 중간 테이블이 필요한 경우에 주로 사용
- 관계형 기본 함수및 사용자 정의 함수로 기능 확장 가능
아파치 피그(Apache Pig)는 대규모 데이터 집합을 분석하는 플랫폼으로, 분석 프로그램을 표현하는 고수준 언어인 Pig Latin과 이를 실행하는 기반 구조로 이루어진다. 공식 사이트에 따르면 피그의 기반 계층은 Pig Latin 스크립트를 맵리듀스 프로그램의 연속으로 바꾸는 컴파일러이며, 피그 프로그램은 구조상 병렬화하기 쉬워 매우 큰 데이터도 다룰 수 있다. 개발자가 맵리듀스 자바 코드를 직접 짜는 대신 데이터 처리 단계를 순서대로 적으면, 피그가 이를 여러 맵리듀스(또는 Tez, Spark) 작업으로 바꿔 실행한다.
공식 사이트는 Pig Latin의 핵심 성질로 다음 세 가지를 든다.
- 프로그래밍 용이성: 단순한 병렬 작업은 쉽게 쓰고, 여러 단계가 얽힌 복잡한 작업도 데이터 흐름의 연속으로 명시해 쓰고 이해하고 유지하기 쉽다.
- 최적화 기회: 작업을 표현하는 방식 덕분에 시스템이 실행을 자동으로 최적화할 수 있어, 사용자는 효율보다 의미에 집중한다.
- 확장성: 사용자가 특수 목적의 함수(사용자 정의 함수, UDF)를 직접 만들어 쓸 수 있다.
Pig Latin 문장은 관계(relation)를 입력받아 다른 관계를 내놓는 연산자이며 세미콜론으로 끝난다. 관계는 튜플(tuple)들의 묶음(bag)이고, 데이터 형식으로는 int, long, double, chararray 같은 단순형과 tuple, bag, map 같은 복합형이 있다. 스크립트는 보통 LOAD로 읽고, 여러 변환 문장으로 처리한 뒤, DUMP(화면 출력)나 STORE(파일 저장)로 끝난다. 결과를 만들려면 DUMP나 STORE가 있어야 하며, 그 전까지의 문장은 검증만 되고 실행되지 않는다.
| 모드 | 지정 방법 | 설명 |
|---|---|---|
| 로컬(local) | pig -x local | 한 대의 컴퓨터와 로컬 파일 시스템으로 실행한다. 작은 데이터로 시험할 때 쓴다 |
| 맵리듀스(mapreduce) | pig 또는 pig -x mapreduce | 하둡 클러스터와 HDFS에서 맵리듀스 작업으로 실행한다. 기본 모드이다 |
| Tez | pig -x tez | 하둡 클러스터에서 Tez 실행 엔진으로 실행한다 |
| Spark | pig -x spark | Spark, YARN, Mesos 클러스터에서 스파크 엔진으로 실행한다 |
Tez와 Spark에는 로컬에서 시험하는 tez_local, spark_local 모드도 있다(공식 문서상 실험 기능). 어느 모드든 명령줄 셸인 Grunt에서 문장을 하나씩 입력하는 대화형 방식과, 스크립트 파일을 실행하는 배치 방식으로 쓸 수 있다.
| 연산자 | 하는 일 |
|---|---|
| LOAD | 파일 시스템에서 데이터를 읽어 관계로 만든다. AS로 스키마를 붙인다 |
| FILTER ... BY | 조건에 맞는 튜플만 남긴다 |
| FOREACH ... GENERATE | 각 튜플에서 필요한 필드를 뽑거나 계산한다 |
| GROUP ... BY | 키가 같은 튜플을 묶어 (group, bag) 형태로 만든다 |
| JOIN | 두 관계를 키로 결합한다 |
| ORDER ... BY | 정렬한다 |
| STORE ... INTO | 결과를 파일 시스템에 쓴다 |
| DUMP, DESCRIBE, EXPLAIN | 결과 출력, 스키마 확인, 실행 계획 확인 |
탭으로 구분된 접속 로그에서 1,000바이트가 넘는 요청만 골라 사용자별 건수와 전송량을 구하고, 사용자 지역 정보와 결합해 전송량 순으로 저장하는 예이다.
logs = LOAD '/data/access_log' USING PigStorage('\t')
AS (user:chararray, url:chararray, bytes:long);
big = FILTER logs BY bytes > 1000;
grp = GROUP big BY user;
stat = FOREACH grp GENERATE group AS user,
COUNT(big) AS hits, SUM(big.bytes) AS total;
users = LOAD '/data/users' USING PigStorage('\t')
AS (user:chararray, region:chararray);
j = JOIN stat BY user, users BY user;
srt = ORDER j BY stat::total DESC;
STORE srt INTO '/out/user_traffic' USING PigStorage(',');
| 항목 | 피그 | 하이브 |
|---|---|---|
| 언어 | Pig Latin(데이터 흐름을 단계별로 적는 절차적 스크립트) | HiveQL(SQL과 비슷한 선언적 질의 언어) |
| 스키마 | 선택 사항. 스키마 없이 읽고 위치($0, $1)로 필드를 가리킬 수 있다 | 테이블 정의(메타스토어)가 필요하다 |
| 주 사용자 | ETL 파이프라인을 짜는 개발자 | SQL에 익숙한 분석가 |
| 강점 | 여러 단계 변환, 중간 결과가 많은 복잡한 처리 | 정형 데이터에 대한 집계·조회, 데이터 웨어하우스형 활용 |
ADP 교재(데이터분석 전문가 가이드)는 2과목 '분산 컴퓨팅 기술'에서, 맵리듀스 프로그램을 직접 짜는 부담을 덜기 위해 스크립트나 질의 언어로 병렬 처리를 표현하는 '병렬 쿼리 시스템'으로 구글 Sawzall, 아파치 피그, 아파치 하이브를 묶어 소개한다.
- Sawzall: 구글의 롭 파이크(Rob Pike) 등이 2005년 Scientific Programming 저널에 발표한 시스템이다. 논문에 따르면 새로운 프로그래밍 언어로 표현한 질의가 필터링 단계를 이루고, 그 출력을 집계 단계가 모으며, 두 단계 모두 수백~수천 대의 컴퓨터에 분산되어 실행된다.
- 피그: 절차적 데이터 흐름 언어(Pig Latin)로 표현한다.
- 하이브: SQL과 비슷한 HiveQL로 표현한다.
2026년 10월 확인 기준으로 피그는 Apache Attic(은퇴 프로젝트) 목록에 없다. 공식 릴리스 페이지에 따르면 최신 버전 0.18.0은 2025년 9월 15일에 나왔으며, 하둡 3, Tez 0.10, 하이브 3, 스파크 3, HBase 2, 파이썬 3 지원이 주요 변경이다. 그 전 버전 0.17.0은 2017년 6월에 나왔다.
- 피그는 Pig Latin이라는 데이터 흐름 스크립트 언어로 하둡 처리를 표현하며, 내부에서 맵리듀스 작업으로 바뀌어 실행된다.
- 피그(절차적 스크립트)와 하이브(SQL 유사 질의)의 차이를 구분한다.
- Sawzall, 피그, 하이브는 ADP 교재에서 병렬 쿼리 시스템으로 함께 다뤄진다.