1. ambari

    1. 8080 포트에 올라감
    2. 처음에 설치했을 때 본 적 있음
    3. dashboard
      1. cluster가 어떻게 돌아가고 있는지 보여줌
      2. 언제 컬러를 주황색 / 빨간색으로 바꿀 수 있을지 설정 가능
      3. 각 섹션을 옮길 수 있음
    4. ambari 설치하면 hadoop설치 가능
      1. 처음에 아무것도 없는 cluster에서 ambari node만 설치하고 다른 것들을 추가로 설치할 수 있음
    5. 왼쪽에 각종 service들 보여줌
      1. 껐다 켰다 가능
      2. 어떤것들이 지금 돌고있는지 확인도 가능
      3. alert세팅 가능
        1. 뭐 잘못되면 알람옴 → 잘못될 것 같으면 알람옴?
        2. 이메일 하나 고를 수 있음 → SMTP 해주나봄
    6. admin tab 있음
      1. service 버전이랑 이것저것 볼 수 있음
      2. maria_dev 말고 다른 계정으로 로그인 해야함
      3. session 열고 admin user를 만들어야함
        1. su root → 비밀번호 → ambarii-admin-password-reset → 비밀번호 입력
        2. ambari 껏다가 켜짐 → admin으로 로그인 가능
      4. HDFS에 파일도 업로드하고 이것저것 가능
      5. Pig View에서 pig script 실행 가능
  2. Pig

    1. MapReduce보다 쉬움
      1. MapReduce는 오래걸림
      2. MapReduce위에서 돈다함
    2. scripting language called Pig Latin → SQL-like syntax
    3. APACHE PIG
      1. 사용자가 커스텀해서 함수 작성이 가능한듯 → 확장성
    4. HDFS 위에 YARN 위에 MapReduce && TEZ
      1. TEZ는 나중에 알려준다함
      2. MapReduce는 linear한데 TEZ는 dependency를 확인해서 효율적인 방식을 찾아준다함
    5. Pig는 standalone으로도 돼서 hadoop cluster없이도 가능하긴함 → 규모가 작다면
    6. Running pig
      1. grunt → 한줄씩
      2. script → 작성해서 할 수 있음
      3. ambari / hue
        1. Pig View사용해서 script 쓰고 돌려봄
  3. Pig 실습

    1. 영화 데이터 재탕
    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 
    			PigStore('|') AS (movieID: int, movieTitle: chararray,
    			releaseDate: chararray, videoRelease: chararray,
    			imbdLink: chararray);
    
    DUMP metadata;
    
    nameLookup = FOREACH metata GENERATE movieID, movieTitle,
    		ToUnixTime(ToDate(releaseDate, 'dd-MMM-yyyy')) AS releaseTime;
    
    ratingsByMovie = GROUP ratings BY movieID;
    DUMP ratingByMovie;
    
    avgRatings = FOREACH ratingsByMovie GENERATE group AS movieID,
    		AG(ratings.rating) AS avgRating;
    
    DUMP avgRatings;
    
    DESCRIBE ratings;     
    DESCRBE ratingsByMovie;
    
    fiveStarMoves = FILTER avgRatings BY avgRating > 4.0;
    
    fiveStarsWithData = JOIN fiveStarMovies BY movieID, nameLookup BY movieID;
    
    DUMP fiveStarsWithData;
    
    oldestFiveStarMovies = ORDER fiveStarsWithData BY 
    		nameLookup::releaseTime;
    
    DUMP oldestFiveStarMovies;
    
  4. sandbox에서 스크립트 돌려봄

    1. ambari 접속
    2. HDFS에 데이터 있는지 확인
    3. pig view들어가서 pig script 작성
      1. semi colon 중요함
      2. capitalization도 중요함
    4. execute
      1. 탭도 보여줌
      2. github action처럼 생김
        1. 과정은 안 보여줌
        2. progress bar만 보임
      3. 다 끝나면 로그도 볼 수 있음
    5. 스크립트 도는거 끝나면 저장하는 줄도 추가할 수 있음
    6. TEZ쓰면 MapReduce 안써도돼서 더 빠르게 가능함
      1. execute on tez 체크하면 됨
      2. dependency 체크는 좀 걸리는데, 그거 끝나면 엄청빠름
  5. Pig Latin 심화과정

    LOAD 
    STORE -> 저장함
    DUMP
    FILTER DISTINCT FOREACH/GENERATE MAPREDUCE 
    STREAM -> 결과 스트리밍 가능 
    SAMPLE -> random sample
    JOIN 
    COGROUP -> separate tuples for each key
    GROUP 
    CROSS -> 다양한 combination을 가능하게 함
    CUBE -> column 2개 넘게 사용해서 다양한 combination
    ORDER 
    RANK -> 순서는 안바꾸고 랭킹만
    LIMIT -> 새로운 관계를 만들고 필요 없는거 제끼고 가능
    UNION 
    SPLIT
    DESCRIBE
    EXPLAIN -> SQL explain이랑 유사함. 어떻게 돌릴건지
    ILLUSTRATE -> 좀 더 디테일하게 확인 가능. 
    REGISTER -> UDF -> java코드 써야함
    DEFINE -> UDF에 이름 줄 수 있음
    IMOORT -> 다른 코드 가져다  쓰는 거
    AVG, CONCAT, COUNT, MAX, MIN, SIZE, SUM
    PigStore
    TextLoader
    JsonLoader
    AvroStorage -> hadoop에서 많이씀
    ParquetLoader -> column-oriented
    OrcStorage
    HBaseStorage
    
  6. 실습

    1. 1점 받은 횟수를 세면됨
    2. 그리고 나열함
    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 
    			PigStore('|') AS (movieID: int, movieTitle: chararray,
    			releaseDate: chararray, videoRelease: chararray,
    			imbdLink: chararray);
    
    nameLookup = FOREACH metadata GENERATE movieID, movieTitle;
    
    groupedRatings = GROUP ratings BY movieID;
    
    averageRatings = FOREAH groupedRatings GENERATE group AS movieId,
    	AVG(ratinigs.rating) AS avgRating, COUNT(ratings.rating)) AS numRATINGS;
    
    badMovies = FILTER average B?Y avgRating < 2.0;
    
    namdedBadMovies = JOIN badMovies BY movieID, nameLookup BY movieID;
    
    finalResults = FOREACH namedBadMovies GENERATE namelLookup::movieTitle AS movieNAme,
    	badMovies::avgRAting AS avgRating, badMovies::numRatings AS numRatings;
    
    finalResultsStorted = ORDER finalResults BY numRatings DES;
    
    DUMP finalResultsSorted;