728x90

udemy - hadoop 기초강의 내용을 정리하면서 추가적으로 공부한 내용들을 정리했다.

 

다섯번째 섹션에서는  Hadoop의 관계형 데이터 저장소인 Hive에 대한 대략적인 설명으로 이루어졌다. 


36강. Hive란?

hive를 통해 SQL쿼리로 데이터를 다루는 작업들이 MR 또는 TEZ로 번역되어 작동하고 cluster에 있는 데이터를 다룰 수 있다. 

즉 hadoop 클러스터를 관계형 데이터베이스처럼 사용할 수 있다. 

 

이는 이전과 달리(Pig, MR) 사용자에게 익숙한 SQL쿼리로 Hadoop 클러스터에 있는 데이터를 쿼리하고 처리할 수 있다는 의미이다. 

hive는 구조화된 쿼리언어이다.

 

✅Pig의 경우, 작업시 보여지는 모습이 스크립트 언어였지, 그 내부 구조는 MR이었던것에 비해서 hive는 자체적으로 구조화된 언어이다. 

 

Hive를 사용하는 이유

  • 많은 사람들에게 이미 익숙한 SQL쿼리문을 사용
    • Hiveql
    • SQL에서 할 수 있는 거의 모든 것을 Hiveql에서도 가능
  • Interactive - 상호적인 성격, 대화형 프롬프트사용
  • scalable
    • 클러스터 전체에 분산된 빅데이터를 다룬다(기존의 단일 호스트를 다루는 일반적인 데이터베이스와 다른 점)
    • 이러한 점에서 데이터 웨어하우스 유형의 애플리케이션에 유용하다
  • OLAP쿼리
    • MR보다 훨씬 간단한 방법으로 데이터를 처리할 수 있다. 
    • 분석시스템을 위함
    • 실시간 처리등의 작업보다는 대용량 데이터세트 처리에 유리
  • extensible
    • SQL 사용의 한계를 'UDF'를 사용하여 다양한 외부 도구와 연계해서 데이터를 처리할 수 있다. 
    • Thrift 서버를 활용해서, 외부에서 사용자가  Hive와 소통할 수 있다.
    • JDBC/ODBC 드라이버 사용

 

Hive를 사용하면 안되는 이유

  •  OLTP에 적합하지 않다. 
    • 높은 처리량을 원한다면 적절하지 않다는 의미이다. 
    • SQL을 MR로 번역하는 시간이 필요하기 때문에 시간이 좀 더 걸리게 된다.
  • 비정규화 데이터를 사용한다. 즉 실제로는 관계형 데이터 베이스 형태는 아니다. 단순한 텍스트 파일이다. 
    • 관계형 데이터베이스인 것 처럼 쿼리할 수 있지만 실제로 비정규화되어있다.
    • 관계형 데이터베이스의 특성이 필요하다면 추천하지 않는다. 
  • 복잡한 쿼리에 적절하지 않다.
    • pig나 spark가 좀 더 적절
  • No Transaction
  • 실제 데이터 베이스가 아니므로, 내부적으로 데이터의 삽입, 삭제 등이 기록되지 않는다. 

 

Hiveql이란

  •  MySQL과 비슷
  • Views - hiveql만의 특징
    • 어떤 쿼리의 결과를 view에 저장하고 그  view를 다음 쿼리의 테이블로 사용.
    • 복잡한 쿼리를 개별쿼리로 분할해서 구축하여 활용할 수 있다. 
    • database의 materialized view(구체화 화면)와는 다르다.
    • 구체화 화면은 실제 데이터를 저장하지만, view는 단순히 논리구조일 뿐, 데이터를 저장하진 않는다.
  • 데이터를 구조화하고 파티션을 나누어 저장할 수 있다.

 

37강. 실습

- 가장 인기있는 영화 찾기(using Ambari)

CREATE VIEW IF NOT EXISTS topMovieIDs AS
SELECT movieID, count(movieID) as ratingCount
FROM ratings
GROUP BY movieID
ORDER BY ratingCount DESC;

SELECT n.title, ratingCount
FROM topMovieIDs t JOIN names n on t.movieID = n.movieID;

 

38강. Hive 작동방식

Schema on Read(읽기 스키마)

전통적인 데이터베이스와의 차이점이다.

일반적으로 관계형 데이터베이스에서는 Schema on Write(쓰기스키마) 개념을 사용한다. 

  • 데이터를 입력하기 전에 스키마를 선정의 한다. 
  • 그리고 데이터를 디스크에 작성할 때 이 스키마대로 시행한다. 

 

Hive는 구조화되지 않은 데이터를 가져와서 읽는 순간에 스키마를 적용한다.

구조화되지 않는 데이터와 연관된, 실제 스키마 데이터인 메타스토어(metastore)를 통해 구조화 되지 않은 텍스트 파일을 어떻게 해석할 지 알려준다. 이것이 읽기 스키마이다.

 

예시)

CREATE TABLE ratings (
	userID INT, movieID INT, rating INT, time INT)
 ROW FORMAT DELIMTED
 FIELDS TERMINATED BY '\t'
 STORED AS TEXTFILE;

-> create table 명령어를 입력할 때 다양한 필드 이름과 유형을 지정한다. 

그리고 데이터가 디스크에 어떻게 구조화되는지 지정한다. 

읽어들이려는 데이터가 텍스트파일로 저장되어있고 탭구분 기호로 나뉘어져 있음을 명시한다. 

이러한 명렁어를 통해 메타스토어에 스키마를 만들어서 데이터를 hive로 불러올때 적용한다. 

 

hive는 구조화된 관계형데이터베이스를 만드는게 아니라, 클러스터에 있는 기존의 데이터를 읽을 때 스키마를 적용하는 것이다. 

 

Where is Data? - Hive가 데이터를 저장하는 방식

  •  Load data 명령어
    • 데이터를 분산 파일시스템에서 hive로 옮겨온다. 
    • hive가 데이터를 내부로 가져와서 소유권을 갖고 관리한다. 
    • 데이터를 실제로 구조화하는 것이 아니라 스키마 정보를 메타스토어에 보관함으로써 hive가 관리할 수 있게 되는 것이다.
  • Load Data Local
    • 실제 복사본을 만든다. 
    • 로컬 파일 시스템에서 hive로 데이터를 실제로 가지고 오고 싶을 때
      • 즉 빅데이터를 사용하지 않을 때
    • 데이터 원본 보존
  • Managed(내부) VS External(외부) 테이블
    • Managed table : Hive가 데이터의 소유권을 가짐
      • DROP하면 데이터 자체가 삭제된다.
    • External table : 외부 시스템과 데이터를 공유해야 할 때 
      • CREATE EXTERNAL TABLE
      • LOCATION - 데이터의 위치를 알려줘야 한다. 
      • 데이터에 hive를 사용하지만  hive가 소유하는 것은 아니다.
      • DROP 하면 메타만 삭제되고, 데이터는 유지
       

 

Partitioning

쿼리작업 최적화에 중요한 개념.

데이터를 파티션된 subdirectories에 저장할 수 있다.

-> country는 실제로 열은 아니고, hive가 데이터를 저장하는 서브 디렉터리의 일부가 되는 것이다. 

 

파티션을 여러개 지정할 수도 있다.

이렇게 파티션을 지정한 뒤 특정 파티션에 쿼리하면 효율적이다. 

 

Hive는 정수나 문자열 등의 데이터 유형에 얽매이지 않는다. 

위의 예시코드에서  STRUCT를 참고하면 알 수 있듯이, 구조화 데이터를 자유롭게 저장할 수 있다.

 

Hive 사용하는 방법

  • Ambari / Cloudera - Hue
  • hive prompt - CLI
    • 명령줄에 대화형으로 한 줄씩 입력 가능
  • 쿼리를 파일로 저장할수도 있다.
    • hive -f/somepath/queries.hql
  • JDBC/ODBC server
  • Thrift service
    • 웹사이트나, 클라이언트와 소통가능
    • 하지만 hive는 OLTP에 적절하지 않다.
    • 보통 해당 작업에 대해 필요해지면  HBase를 사용한다.
  • Oozie
    • 클러스터 전체 관리 도구

 

39~40강. 실습

- 평균 평점이 가장 높은 영화 찾기

CREATE VIEW IF NOT EXISTS avgRatings AS
SELECT movieID, AVG(rating) as avgRating, COUNT(movieID) as ratingCount
FROM ratings
GROUP BY movieID
ORDER BY avgRating DESC;

SELECT n.title, avgRating
FROM avgRatings t JOIN names n on t.movieID = n.movieID
WHERE ratingCount > 10;

 

41강. 관계형 데이터베이스와 Hadoop 통합하기(Sqoop)

즉 관계형 데이터베이스와 연결하여 Hadoop 클러스터에 데이터를 불러오거나 내보내고 싶을 때는 Sqoop이라는 도구를 사용한다. 

해당 강의에서는 관계형 데이터베이스의 대표격인 MySQL을 예로 강의를 진행한다.

 

Sqoop 작동 방식

-> 위의 그림과 같이 스쿱 또한 내부적으로  MR 잡을 실행하여 Mapper을 작동시켜서 데이터를 전송한다. 

여기서 Reducer는 사용하지 않는다. (데이터를 한곳에서 다른 곳으로 옮기는 일이다보니 리듀셔는 필요가 없다)

 

mapper들은 하둡 클러스터의 HDFS 클러스터와 소통하며  HDFS에 거대한 테이블을 만든다. 이 때 양식은 사용자가 지정한 양식의 대용량 텍스트 파일이다. 

그리고 해당 파일 위에서 hive나 pig로 작업가능한 것이다. 

 

실제로는 위의 그림에서 보이는것 보다 더 병렬적으로 처리된다. 

각 매퍼는 같은 호스트에 있는 HDFS의 블록들과 개별적으로 소통한다. 

 

기본적으로 데이터를 분산하고 처리하기 위한 작업 실행에 오버헤드가 발생하므로 대용량 데이터 작업에 적절하다. 

 

Sqoop 활용하기

명령줄에서만 작동되니, 스크립트나 cron job, Oozie 같은 곳에서 작업해야 한다. 

 

MySQL -> HDFS

-> 위의 명령어를 통해 로컬호스트에 있는 mysql의 movielens 데이터베이스의 movies 테이블을 HDFS로 옮긴다.

sqoop import : 데이터를 클러스터로 가져온다. 그리고 mysql의 host를 입력한다. 

-m을 추가하면 몇개의 매퍼를 사용할지도 정할 수 있다. 

 

 MySQL -> Hive(directly)

-> HDFS로 데이터를 전달하는 명령어 뒤에 " --hive-import" 명령어만 추가하면 된다. 

 

Incremetal import(증분적 불러오기)

'--check-column' : 타임스탬프나 순차 번호를 가진 열

'--last-value' : 열의 값이 지정된 값보다 클때만 데이터를 가져오겠다는 의미

 

위의 두 변수를 사용해서, 데이터베이스를 불러올 때 순차번호나 타임스탬프를 사용해 어디까지 가져왔는지 기억할 수 있다. 

후에 스쿱을 실행할 때 전에 저장해 놓은 값을 --last-value에 넣고, 그 이후에 추가된 데이터만 가져올 수 있다. 

 

 Hive -> MySQL

-> hive는 HDFS의 파일에 스키마를 적용하는 레이어이다. 

즉 위에서 지정한 파일 경로는 HDFS에 데이터가 어디에 있는지의 경로인데, hive로 작업을 했으니 hive 내부 테이블에 저장되어있을 것이고 이에 따라 내부 테이블 경로를 기재해준 것이다

hive 내부 테이블 경로는 hortonworks에서는 '/apps/hive/warehouse'이다.

🤔
hive가 데이터를 저장할 디렉토리를 지정해야 한다. 

 

42~44강. 실습(Ambari)

- 스쿱을 사용해서 MySQL에서 HDFS/Hive로 데이터 내보내고 받기

728x90

+ Recent posts