오몰내알 2022. 1. 25. 08:13

Pig 개념

  • 맵과 리듀스를 사용하지 않고 데이터를 처리하지 않아도 됨.
  • 맵리듀스는 프로그래밍하는데 시간이 많이 걸림
  • 간단한 스크립트 언어를 통해 더 쉽고 간결하게 가능 (SQL)
  • 맵리듀스와 테즈를 기반으로 하기 때문에 10배 정도는 더 빠르다.
  • 피그 스크립트 실행 방법
    • Grunt
    • Script
    • Ambari

Pig 스크립트

  • ratings = LOAD ‘/user/maria_dev/ml-100k/u.data’ AS (userID:int, movieID:int, rating:int, ratingTime:int);
  • metadata = LOAD ‘/user/maria_dev/ml-100k/u.item’ USING PigStorage(’|’) AS (movieID:int, movieTitle:chararray, releaseDate:chararray, videoRelease:chararray, imdbLink:chararray);
  • DUMP metadata; → 데이터 일부만 사용하길 원할 때, 디버깅할 때 유용하다.
  • nameLookup = FOREACH metadata GENERATE movieID, movieTitle, ToUnixTime(ToDate(releaseDate, 'dd-MMM-yyyy')) AS releaseTime;
  • ratingsByMovie = GROUP ratings BY movieID;
    • (1, {(807, 1, 4,892528231,(554,1,3,876231938,)49,1,2,888068651),...})
    • 가장 앞에 그룹으로 묶인 열의 이름은 group이다.
  • DESCRIBE ratings; → 스키마를 볼 수 있다.
  • fiveStarMovies = FILTER avgRatings BY avgRating > 4.0;
    • 필터링
  • fiveStarsWithData = JOIN fiveStarMovies BY movieID, nameLookup BY movieID;
    • 조인
    • 결과값으로 :: 형태의 값이 나온다.
  • oldestFiveStarMovies = ORDER fiveStarsWithData BY nameLookup::releaseTime;
    • 정렬

Ambari Pig Script

  • Pig View로 들어가서 스크립트를 만들고 코드를 입력한다.
  • Execute를 클릭 그러면 맵리듀스로 변환하여 코드를 실행한다.
  • Execute on Tez를 이용하면 더 빠른 결과를 얻을 수 있다.
  • 스크립트를 실행했을때 Timed-out 에러가 났을 때
    • su root
    • cd /etc/ambari-server/conf/ambari.properties
    • views.request.connect.timeout.millis=50000
    • views.request.read.timeout.millis=100000

Pig Latin Deeper

  • 위에서 살펴본 문법 말고도 다양한 문법을 사용할 수 있다.
  • STORE ratings INTO ‘outRatings’ USING PigStorage(’:’);
  • DISTINCT, STREAM, MAPREDUCE
  • COGROUP, CROSS, CUBE
  • RANK, LIMIT
  • UNION, SPLIT
  • EXPLAIN
  • ILLUSTRATE
  • 이 밖에도 정말 다양한 문법이 있다.
  • 만약 피그를 더 깊게 이해하고 싶다면 O’reilly에서 나온 Programming Pig라는 책을 추천
반응형