Day69

2021. 1. 20. 11:18교육과정/KOSMO

키워드 : 하둡 실행 방법 / 하이브 ( Hive ) / 데이터노드에 mariaDB 설치 / 하이브 설치 / 하이브 실행 / 비라인 실행 

 

****

 

0. 하이브 (hive)

   : 하둡의 분산환경 처리를 이용하되, SQL 비슷하게 쿼리를 실행하면 하둡의 파일을 쉽게 처리할 수 있다. 

   : RDBMS 의 테이블인 것처럼 쉽게 접근할 수 있다. 

 

 

1. 하둡 및 하이브 실행 방법

 

(1) 서버 실행 ( VM - Virtual Box )

      - 서버 3대 실행 중이어야 함

(2) 하둡 실행 ( 분산 처리가 가능하도록 환경 구축 )

      - 마스터 역할을 하는 NameNode ( nn01 ) 에서 > start-all.sh

(3) MobaXterm 에서 nn01 노드 hadoop 계정으로 로그인

      - 각 노드에서 하둡 실행 확인 > jps

(4) hive 실행  ( dn01 )

     ① mariaDB 서비스 상태 확인 

         : mariaDB 의 실행상태가 active 인지 확인할 수 있다. -- 초록색 글씨로 출력됨

systemctl  status  mariadb.service

         : mariaDB 가 실행되지 않고 있을 경우에는 직접 명령어를 입력하여 시작할 수 있다. 

systemctl  start  mariadb.service

 

     ② metastore 실행 ( 백그라운드로 구동 )  ( dn01 )

         : 하이브가 메타 정보를 저장하기 위해서는 메타스토어가 실행되야 한다. 

hive --service metastore &

     ③ 하이브서버 구동 ( 백그라운드로 구동 )  ( dn01 )

hive --service  hiveserver2 &

     ④ 하이브 연동 ( 실행 )  ( dn01 )

hive
beeline

 


2. 하둡에서의 네임노드

 

※ 클라이언트의 모든 요청은 NameNode 에서 받아들이고 응답한다. 

※ NameNode 는 어떤 DataNode 에 어떤 데이터가 들어있는지 알고 있다. 

※ NameNode 가 작동불가능한 상황을 대비하여 Secondary NameNode 가 존재한다.

※ Secondary NameNode 는 일정 시간마다 NameNode 로부터 정보를 받아오다가,

   NameNode 가 죽었을 때, 가장 최신의 정보로 작동한다. 

 


3. 이번에 구축한 하둡 에코 시스템

 

 

※ 하이브 ( Hive ) 는 하둡 위에 설치되며 RDBMS 같은 구조를 가지기 위해

   추가로 mariaDB 를 설치하여 메타 데이터를 끌어온다. ( SQL query )

※ NameNode 에서 해야 할 일이 많기 때문에 하이브와 같은 다른 시스템은 DataNode 에 설치한다. 

※ 스쿱( Sqoop ) 은 RDBMS 와 하둡을 연결해준다. ( Data Exchange )

※ 플럼 ( Flume ) 은 스트림으로 들어오는 데이터를 하둡에 안착시키는 역할을 한다. 

※ 제플린 ( Zepplin ) 은 시각화 도구이다. 

 


4. 하이브 ( Hive )

 

(1) 하이브 기초 개념

- 자바 기반의 맵리듀스 프로그래밍이 너무 어려워서 나온 시스템으로 Pig, Hive 가 있다. 

- Pig 는 Pig Latin 언어를 이용한 스크립트 언어를 사용한다. 

- Hive는 기존 DB 사용자에게 익숙한 SQL 을 사용하도록 만들어졌다.  ( Hive QL - query language )

- 맵리듀스 프로그램 대신 쿼리 인터페이스 서비스를 제공하다가, 

    쿼리 실행시 맵리듀스로 진화되어 결과를 생성한다. 

- 비정형 데이터는 쿼리를 수행하기에 적합하지 않다. 

 

- 하이브 1버전은 하이브 메타 스토어 및 드라이버에 직접 액세스 한다.

- 하이브에서는 ! 사용 후 리눅스 명령어를 사용할 수 있다.

$ hive
$ hive> exit;

- 하이브 2버전(Beeline) 은 hiveserver2 API 를 사용하여 더욱 안전하고 보다 나은 인증 및 권한부여를 제공하지만, 

  리눅스 명령어를 사용해야 할 경우 !quit 로 하이브를 빠져나가야 하기에 1버전을 더 많이 사용하고 있다. 

$ beeline

 

- 하이브 클라이언트 

   : JDBC 기반 응용 프로그램 지원

   : Thrift 기반 응용 프로그램 지원 (Thrift 는 통신 프로토콜의 일종으로 데이터를 주고 받을 수 있다. )

   : ODBC 기반 응용 프로그램 지원

 

- 하이브 서비스

   : Hive Server

   : CLI / Hive Web Interface

   : Hive Driver

   : Metastore / Apache Derby DB

 

 

(2) 하이브 구조

- 엄밀하게 보면 Hive Web Interface 와 CLI 는 오라클의 SQL+ 같은 클라이언트 개념보다는

   하이브에서 제공하는 Service 로 보는게 적합하다. 

- Hive Driver 는 job 이 들어오면 실제 동작을 하고, 메타스토어의 구조를 파악한다. 

- 메타스토어는 메타데이터를 저장하는 저장공간이다.

   ( 메타데이터 : 기본 데이터에 대한 정보, 저장된 데이터의 테이블 구조에 대한 정보 등 )

 

- 하이브 데이터 모델

   : 하둡 상에 구축된 정형화된 데이터를 관리하고 쿼리하는 시스템

   : 스토리지로 HDFS 에 저장

   : OLTP ( online transaction procession ) 에는 적합하지 않다. 

 

- 데이터 관리

   : 테이블 --> HDFS 의 디렉토리

   : 파티션 --> HDFS 의 서브디렉토리

   : 데이터 --> HDFS 의 파일

 

- 하이브 테이블은 메타스토어 (mariaDB) 에 테이블 구조인 스키마를 저장하고 데이터는 HDFS 에 저장한다. 

 

 

(3) 하이브 동작과정

 

 

- 구조는 메타스토어에서 얻고, 실제 데이터 전달은 HDFS 로 저장한다. 

 

   ① 사용자의 HiveQL 명령어를 해석하여 맵리듀스 작업으로 변환

   ② 메타스토어에서 테이블 구조와 데이터 위치를 얻음

   ③ 실제 데이터 질의 전달

 

 

(3) 하이브 데이터 처리 과정

 

- 하이브는 HDFS 의 데이터와 DB 의 스키마를 Binding 한다. 

 

- 하이브 기본 데이터 타입

데이터 타입                   설명
TINYINT                    1바이트 정수
SMALLINT                   2바이트 정수
INT                        4바이트 정수
BIGINT                     8바이트 정수
BOOLEAN                    TURE / FALSE
FLOAT                      소수점
DOUBLE                     소수점
STRING                     문자열

- 하이브 Complex 데이터 타입

데이터 타입                   설명
Array                       ARRAY<data_type>
Map                         MAP<primitive_type, data_type>
Struct                      STRUCT<col_name:data_type [COMMENT col_comment], ... >
Uniun                       UNIONTYPE<data_type, data_type, ... >
                             ( → Only available starting with Hive 0.7.0. )

 

- HiveQL 에서는 update 와 delete 가 안 된다. 

  >> 데이터가 HDFS 에 저장되는 HDFS 는 한 번 저장한 파일을 수정하지 못한다. 

       insert overwrite 를 사용하여 이미 입력된 데이터를 덮는 경우는 가능하다. 

- HiveQL 은 FROM 절에서만 서브 쿼리를 사용할 수 있다. 

- HiveQL 의 뷰는 읽기 전용이다. 

- select 문에서 having 이 안 된다. 

 

(+ 참고)

 

(4) 하이브 테이블 관리

 

    ① 내부테이블과 외부테이블

  내부 테이블  ` 하이브 데이터 웨어하우스에 저장된다. ( /hive/warehouse )
 ` 내부 테이블을 삭제하면 테이블의 메타 정의와 테이블의 모든 데이터도 같이 삭제된다. 
 ` ORC 같은 최적화 형식으로 저장되어 비교적 성능 향상에 도움을 준다. 
  외부 테이블  ` 하이브가 직접 관지하지 않는다. 
 ` 외부 테이블의 데이터를 삭제하면 하이브의 테이블 메타 정의만 삭제되고, 실제 데이터는 그대로 남는다. 
 ` 테이블이 삭제되더라도 원본 데이터가 남아야 할 경우 주로 사용한다. 
 ` 하이브 외에 다른 에코 시스템에서 사용하는 경우가 있다. 

 

    ② 파티션과 버킷

  파티션  ` 대용량 테이블을 논리적으로 나누어 효율적인 쿼리가 가능
  버킷  ` 대용량의 데이터를 분할

 

    ③ 하이브 지원 파일 포맷

   텍스트파일  시퀀스파일  RC파일  ORC 파일  파케이
 저장기반  로우기반  로우기반  컬럼기반  컬럼기반  컬럼기반
 압축  파일압축   레코드/ 블록압축  블록압축  블록압축  블록압축
 스플릿지원  지원  지원   지워  지원  지원
 압축적용시 스필릿지원  미지원  지원  지원  지원  지원
 하이브 키워드  TEXTFILE  SEQUENCE FILE  RCFILE  ORCFILE  PARGUET

( + 참고 ) H catalog

 - 하둡으로 생성한 데이터를 위한 테이블 및 스토리지 관리 서비스

 - 하둡 에코 시스템들 간의 상호 운용성을 높일 수 있도록 한다. 

 - 즉, 메타스토어에 접근할 수 있는 역할을 한다.

 


5. mariaDB 설치

 

(1) dn01 노드에서 root 계정으로 로그인한다. 

 

(2) yum 명령어로 mariaDB 서버와 mariaDB 를 설치한다. 

 [root@dn01 ~]# yum install mariadb-server mariadb
 
 ...
 Complete!

 

(3) rpm 명령어에 옵션을 주어 mariaDB 가 설치되었는지 확인해보면 3개가 조회됨을 알 수 있다. 

[root@dn01 ~]# rpm -qa | grep maria
mariadb-server-5.5.68-1.el7.x86_64
mariadb-5.5.68-1.el7.x86_64
mariadb-libs-5.5.68-1.el7.x86_64

 

(4) mariaDB 서비스를 시작하기 전에 먼저 구동 가능한지 확인한다. ( 혹시라도 disable 일 경우 enable 로 변경해준다. )

[root@dn01 ~]# systemctl enable mariadb.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

 

(5) mariaDB 서비스를 시작한다. 

[root@dn01 ~]# systemctl start mariadb.service

 

(6) mariaDB 를 보안 설정을 시작한다.

    ( 엔터 - Y - admin1234 - n - n - n - Y )

[root@dn01 ~]# mysql_secure_installation

... 
Thanks for using MariaDB!

 

(7) mariaDB 의 설정을 변경하기 위해 vi 에디터로 my.cnf 을 연다. 

[root@dn01 ~]# vi /etc/my.cnf

 

(8) 2라인에 bindadress 를 작성한다. 

 

(9) mariaDB 를 재시작한다. 

[root@dn01 ~]# systemctl restart mariadb.service

 

(10) mariaDB 를 구동한다. 

[root@dn01 ~]# mysql -u root -p

 

(11) 데이터베이스를 조회해볼 수 있다. 

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

 

(12) 하이브 계정이 mariaDB 의 메타스토어에 접근하기 위해 권한을 부여한 뒤, 부여한 권한을 적용시킨다. 

      ( 모든 데이터베이스의 모든 테이블에 대한 권한의 의미로 *.* 입력, 하이브의 모든 아이피에 대한 의미로 % 입력 ) 

MariaDB [(none)]> grant all privileges on *.* to hive@"%" identified by "hive" with grant option;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all privileges on *.* to hive@"dn01" identified by "hive" with grant option;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

 

(13) mysql 데이터베이스를 사용한다고 설정한 뒤,

     유저와 호스트를 조회해보면 hive 계정과 dn01 계정을 확인할 수 있다.  ( mariaDB 사용자 계정 조회 )

MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> select user, host from user;
+------+-----------+
| user | host      |
+------+-----------+
| hive | %         |
| root | 127.0.0.1 |
| root | ::1       |
|      | dn01      |
| hive | dn01      |
| root | dn01      |
|      | localhost |
| root | localhost |
+------+-----------+
8 rows in set (0.00 sec)

 


6. 하이브 설치

 

(1) dn01 노드에서 root 계정으로 접속한다. 

 

(2) tmp 디렉토리로 이동한다. 

[root@dn01 ~]# cd /tmp

 

(3) wget 명령어를 사용하여 하이브의 2.3.8 버전 gz 파일을 다운 받는다.   ( 2021. 01 )

[root@dn01 temp]# wget http://apache.mirror.cdnetworks.com/hive/hive-2.3.8/apache-hive-2.3.8-bin.tar.gz

 

(4) tar 명령어를 사용하여 압축을 해제한다. 

[root@dn01 tmp]# tar xzvf apache-hive-2.3.7-bin.tar.gz

 

(5) OPT 디렉토리에 2.3.8 이라는 이름의 디렉토리를 생성한 뒤, 압축해제한 파일을 모두 옮긴다. 

[root@dn01 tmp]# mkdir -p /opt/hive/2.3.8
[root@dn01 tmp]# mv apache-hive-2.3.8-bin/* /opt/hive/2.3.8/
[root@dn01 tmp]# ls apache-hive-2.3.8-bin
[root@dn01 tmp]# ls /opt/hive/2.3.8/
bin                      conf      hcatalog  lib      NOTICE             scripts
binary-package-licenses  examples  jdbc      LICENSE  RELEASE_NOTES.txt

 

(6) 2.3.8 이라는 디렉토리를 가리키는 심볼릭링크 current 를 생성한다. 

[root@dn01 tmp]# ln -s /opt/hive/2.3.8 /opt/hive/current
[root@dn01 tmp]# ll /opt/hive
total 0
drwxr-xr-x. 10 root root 184 Jan 19 06:30 2.3.8
lrwxrwxrwx.  1 root root  15 Jan 19 06:31 current -> /opt/hive/2.3.8

 

(7) 2.3.8 디렉토리에 대해 소유자가 아니더라도 쓰기를 할 수 있도록 권한을 부여한다. 

    디렉토리 내의 모든 파일에 대해서도 권한이 부여되도록 -R 옵션을 준다. 

[root@dn01 tmp]# chmod -R 775 /opt/hive/2.3.8
[root@dn01 tmp]# ll /opt/hive
total 0
drwxrwxr-x. 10 root root 184 Jan 19 06:30 2.3.8
lrwxrwxrwx.  1 root root  15 Jan 19 06:31 current -> /opt/hive/2.3.8

 

(8) hive 디렉토리와 그 하위 파일의 소유자를 hadoop 계정으로 변경한다. 

[root@dn01 tmp]# chown -R hadoop:hadoop /opt/hive
[root@dn01 tmp]# ll /opt/hive
total 0
drwxrwxr-x. 10 hadoop hadoop 184 Jan 19 06:30 2.3.8
lrwxrwxrwx.  1 hadoop hadoop  15 Jan 19 06:31 current -> /opt/hive/2.3.8
[root@dn01 tmp]# ll /opt/hive/2.3.8
total 56
drwxrwxr-x. 3 hadoop hadoop   133 Jan 19 06:28 bin
drwxrwxr-x. 2 hadoop hadoop  4096 Jan 19 06:28 binary-package-licenses
drwxrwxr-x. 2 hadoop hadoop  4096 Jan 19 06:28 conf

 

(9) hadoop 계정으로 변경한다. 

[root@dn01 tmp]# su - hadoop
Last login: Mon Jan 18 22:20:22 UTC 2021 on pts/2

 

(10) vi 에디터로 . bash_profile 파일을 연 뒤, 파일 아래쪽에 하이브 환경 변수를 추가한다. 

[hadoop@dn01 ~]# vi ~/.bash_profile

 

#### HIVE 2.3.7 #######################
export HIVE_HOME=/opt/hive/current
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=.:${JAVA_HOME}/lib:${JREHOME}/lib:/opt/hive/current/lib
#### HIVE 2.3.7 #######################

 

 

 

(11) 수정한 환경 변수를 반영해준다.   ( 환경변수는 source 명령어로 적용을 시켜줘야 한다. ) 

[hadoop@dn01 ~]$ source ~/.bash_profile

 

(12) 하이브 설정 파일을 템플릿으로부터 복사하여 생성한다. 

[hadoop@dn01 ~]# cp /opt/hive/current/conf/hive-env.sh.template /opt/hive/current/conf/hive-env.sh
[hadoop@dn01 ~]# cp /opt/hive/current/conf/hive-default.xml.template /opt/hive/current/conf/hive-site.xml

 

(12) vi 에디터로 hive-env.sh 파일을 연 뒤, 하이브 설정파일을 수정한다. 

[hadoop@dn01 ~]# vi /opt/hive/current/conf/hive-env.sh

 

HADOOP_HOME=/opt/hadoop/current

 

 

(13) vi 에디터로 hive-site.xml 파일을 연 뒤, 수정한다. 

[hadoop@dn01 ~]# vi /opt/hive/current/conf/hive-site.xml

    ① 545 라인을 찾아서 커넥션URL을 내 IP 정보로 바꾸기

       ( 명령모드에서 /ConnectionURL 을 입력하여 찾을 수도 있다. )

<value>jdbc:mysql://192.168.56.102:3306/hive?createDatabaseIfNotExist=true</value>

 

 

    ② 1020라인을 찾아서 커넥션드라이버이름을 mysql 드라이버 정보로  바꾸기

<value>com.mysql.jdbc.Driver</value>

 

 

 

    ③ 1045 라인을 찾아서 커넥션유저명을 hive로 바꾸기

<value>hive</value>

 

 

    ④ 530 라인을 찾아서 커넥션비밀번호를 hive로 수정한다. 

<value>hive</value>

 

 

    ⑤ 75 라인을 찾아서 sctratchdir 디렉토리명을 /home/hadoop/iotmp 로 수정한다. 

<value>/home/hadoop/iotmp</value>

 

 

    ⑥ 80 라인을 찾아서 리소스 디렉토리를 /home/hadoop/iotmp 로 수정한다. 

<value>/home/hadoop/iotmp</value>

 

 

    ⑦ 1190 라인을 찾아서 동작 중 에러 발생시 무시하기 옵션을 True 로 수정한다. 

<value>true</value>

 

 

 

 

(14) 하이브 관련 디렉토리 생성 및 권한을 변경한다. 

[hadoop@dn01 ~]# mkdir -p /home/hadoop/iotmp
[hadoop@dn01 ~]# chmod -R 777 /home/hadoop/iotmp/

 

(15) mysql Connector 를 다운받아 압축 푼 뒤, hive 디렉토리 내의 lib 디렉토리로 복사한다. 

[hadoop@dn01 ~]# cd /tmp
[hadoop@dn01 tmp]# wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.38.tar.gz
[hadoop@dn01 tmp]# tar xzvf mysql-connector-java-5.1.38.tar.gz
[hadoop@dn01 tmp]# cd mysql-connector-java-5.1.38
[hadoop@dn01 mysql-connector-java-5.1.38]# mv mysql-connector-java-5.1.38-bin.jar /opt/hive/current/lib/

 

(16) 하둡에서 하이브를 구동할 때 사용할 디렉토리를 생성하고 권한을 변경한다. 

[hadoop@dn01 ~]# hdfs dfs -mkdir /tmp
[hadoop@dn01 ~]# hdfs dfs -mkdir -p /user/hive/warehouse
[hadoop@dn01 ~]# hdfs dfs -chmod -R 777 /tmp
[hadoop@dn01 ~]# hdfs dfs -chmod -R 777 /user/hive/warehouse

 

(17) 하이브 mysql 기본 스키마를 생성한다. 

[hadoop@dn01 ~]# schematool -initSchema -dbType mysql

...
schemaTool completed

 

(18) 하이브에 정상적으로 접속되는지 확인한다. 

      브라우저에서도 http://192.168.56.101:50070 에 접속하여

      상단 우측의 Utilitis 메뉴를 클릭하면 하둡의 디렉토리를 확인할 수 있다. 

[hadoop@dn01 ~]# hive

 

 

 

 

 


7. Beeline 비라인 접속하기

 

(1) Beeline 은 그룹과 유저가 others 이기 떄문에 모든 노드의 core-site.xml 에서 수정이 필요하다. 

    ( 모든 그룹과 호스트에게 접속하기 위한 관문 역할의 proxy 를 모두가 가능하도록 변경함 )

 

(2) dn01 노드에서 현재 디렉토리를 이동한다. 

[hadoop@nn01 ~]$ cd $HADOOP_HOME/etc/hadoop
[hadoop@dn01 hadoop]$ pwd
/opt/hadooop/current/etc/hadoop

 

(3) vi 에디터로 core-site.xml 파일을 열어 <property> 태그를 추가한다. 

[hadoop@dn01 hadoop]$ vi core-site.xml

 

<property>
  <name>hadoop.proxyuser.hadoop.groups</name>
  <value>*</value>
</property>
<property>
  <name>hadoop.proxyuser.hadoop.hosts</name>
  <value>*</value>
</property>

 

(4) Beeline 은 others 권한으로 접속하므로, HDFS 권한을 수정해준다. 

[hadoop@dn01 ~]$ hdfs dfs -chmod -R 777 /tmp
[hadoop@dn01 ~]$ hdfs dfs -chmod -R 777 /user/hive/warehouse

 

(5) dn01 노드에서 작업했던 core-site.xml 을 nn01과 dn02 노드에 복사한다. 

[hadoop@dn01 ~]$ scp core-site.xml hadoop@nn01:/opt/hadoop/current/etc/hadoop
[hadoop@dn01 ~]$ scp core-site.xml hadoop@dn02:/opt/hadoop/current/etc/hadoop

 

(6) beeline 명령어를 입력하면 비라인이 실행된다. 

[hadoop@dn01 hadoop]$ beeline
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hive/2.3.8/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop/2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Beeline version 2.3.8 by Apache Hive
beeline>

 

(7) beeline 종료시에는 !quit 를 입력한다. 

beeline> !quit

 

(8) 비라인을 사용하고자 할 때에는 커넥션 연결과 로그인을 추가로 진행해야 한다. 

[hadoop@dn01 ~]$ beeline


beeline> !connect jdbc:hive2://
Connecting to jdbc:hive2://
Enter username for jdbc:hive2://: hive
Enter password for jdbc:hive2://: ****

 

(9) 비라인 접속시 다음과 같이 입력할 수도 있다. 

[hadoop@dn01 ~]$ beeline -u jdbc:hive2://localhost:10000 -n user -p password

 


8. 하이브 메타스토어와 하이브 서버 실행하기 

 

(1) 메타스토어를 그냥 실행하면 다른 작업을 할 수 없으므로, 백그라운으로 실행하기 위해 & 를 붙여준다. 

    엔터를 한 번 더 눌러주면 하둡의 터미널이 나타난다. 

[hadoop@dn01 hadoop]$ hive --service metastore &
[1] 22567

 

(2) 백그라운드에서 실행중인 메타스토어는 나중에 PID 로 kill 해줘야 한다. 

     현재 PID 가 22567 임을 확인할 수  있다. 

[hadoop@dn01 hadoop]$ ps -ef | grep metastore
hadoop   22567 22445  6 10:25 pts/7 

...
[hadoop@dn01 hadoop]$ kill -9 22567

 

(3) 하이브 서버도 백그라운드로 구동시켜준다. 

    엔터를 한 번 더 눌러주면 하둡의 터미널이 나타난다. 

[hadoop@dn01 hadoop]$ hive --service hiveserver2 &
[2] 22657

 


9. 하이브 실행하기

 

(1) 하이브 실행 전에 mariaDB, metastore, 하이브서버를 먼저 구동한다. 

[hadoop@dn01 ~]$ systemctl  status  mariadb.service
[hadoop@dn01 ~]$ systemctl  start  mariadb.service
[hadoop@dn01 ~]$ hive --service metastore &
[hadoop@dn01 ~]$ hive --service  hiveserver2 &

 

(2) 콘솔에 hive 를 입력하면 하이브가 실행된다. 

[hadoop@dn01 ~]$ hive

 

(3) 하이브 내에서 ! 를 사용하여 리눅스 명령어를 사용할 수 있다.   ( 마지막에 세미콜론을 붙여줘야 함 )

[hadoop@dn01 ~]$ !hdfs dfs -ls /user/hive/warehouse;
Found 4 items
drwxrwxrwx   - hadoop supergroup          0 2021-01-19 10:41 /user/hive/warehouse/customers
drwxrwxrwx   - hadoop supergroup          0 2021-01-19 10:59 /user/hive/warehouse/kdatademo.db
drwxrwxrwx   - hadoop supergroup          0 2021-01-19 10:58 /user/hive/warehouse/orders
drwxrwxrwx   - hadoop supergroup          0 2021-01-19 10:34 /user/hive/warehouse/sample1.db

 

(4) 하이브에서는 현재 사용중인 데이터베이스를 확인할 수 있으나, 비라인에서는 이를 지원하지 않는다. 

hive (sample1) >

beeline >
0: jdbc:hive2://>

 

 

(3) 과 (4) 의 이유로 인해 하이브를 아직도 더 많이 사용하는 경향이 있다. 

 

 

 


10. 하이브 실습 

 

(1) dn01 노드에서 하이브 접속 후 새 데이터베이스를 생성한다. 

hive> show databases;
hive> create database kdatademo;

 

(2) dn02 노드에서 모든 사용자가 읽고 쓰고 실행이 가능한 kdatademo.db가 생성되었음을 확인할 수 있다. 

[hadoop@dn02 ~]$ hdfs dfs -ls /user/hive/warehouse
Found 2 items
drwxrwxrwx   - hadoop supergroup          0 2021-01-19 10:38 /user/hive/warehouse/kdatademo.db
drwxrwxrwx   - hadoop supergroup          0 2021-01-19 10:34 /user/hive/warehouse/sample1.db

 

(3) dn01 노드에서 kdatademo로 데이터베이스를 변경 후, customers 테이블을 생성한다. 

hive> use kdatademo;
OK
Time taken: 0.019 seconds
hive> create table customers(
    > id bigint,
    > name string,
    > address string );
OK
Time taken: 4.921 seconds

 

(4) 생성된 테이블을 조회할 수 있다. 

hive> desc customers;
OK
id                      bigint
name                    string
address                 string
Time taken: 0.193 seconds, Fetched: 3 row(s)

 

(5) dn02 노드에서 하둡 명령어로 파일이 있는지 확인해보았을 때 해당 파일이 없다고 나오는 이유는,

    메타데이터는 mariaDB에 있는 상태인 동시에

    실제 데이터가 저장되지 않았기 때문에 하둡에는 저장되지 않았기 때문이다. 

[hadoop@dn02 ~]$ hdfs dfs -ls /use/hive/warehouse/kdatademo.db
ls: `/use/hive/warehouse/kdatademo.db': No such file or directory

 

(6) 예제로 제공된 데이터를 테이블에 입력한다. 

hive> insert into customers values 
    > ( 1111, "John", "WA" ), 
    > ( 2222, "Emily", "WA" ), 
    > ( 3333, "Rick", "WA" ), 
    > ( 4444, "Jane", "CA" ), 
    > ( 5555, "Amit", "NJ" ), 
    > ( 6666, "Nina", "NY" );

 

(7) dn02 노드에서 데이터가 저장된 테이블의 위치와 내용을 조회할 수 있다. 

[hadoop@dn02 ~]$ hdfs dfs -ls /user/hive/warehouse/kdatademo.db/customers/
Found 1 items
-rwxrwxrwx   1 hadoop supergroup         79 2021-01-19 10:52 /user/hive/warehouse/kdatademo.db/customers/000000_0

 

[hadoop@dn02 ~]$ hdfs dfs -cat /user/hive/warehouse/kdatademo.db/customers/000000_0
1111JohnWA
2222EmilyWA
3333RickWA
4444JaneCA
5555AmitNJ
6666NinaNY

 

(8) dn01 노드의 하이브에서 테이블을 조회할 수 있다. 

hive> select * from customers;
OK
1111    John    WA
2222    Emily   WA
3333    Rick    WA
4444    Jane    CA
5555    Amit    NJ
6666    Nina    NY
Time taken: 0.198 seconds, Fetched: 6 row(s)

 

(9) dn01 의 하이브에서 kdatademo 데이터베이스에 orders 테이블을 생성 후 확인한다. 

hive> create table if not exists orders (
    >  id bigint,
    >  product_id string,
    >  customer_id bigint,
    >  quantity int,
    >  amount double );
OK
Time taken: 4.627 seconds

 

hive> show tables;
OK
customers
orders
Time taken: 0.145 seconds, Fetched: 2 row(s)

 

(10) orders 테이블에 데이터를 입력한다. 

hive> insert into orders values
    > (111111, "phone", 1111, 3, 1200 ),
    > (111112, "camera", 1111, 1, 5200 ),
    > (111113, "notebook", 1111, 1, 10 ),
    > (111114, "bag", 2222, 2, 20 ),
    > (111115, "t-shirt", 4444, 2, 66 );

 

(11) 데이터 입력 결과를 확인할 수 있다. 

hive> select * from orders;
OK
111111  phone   1111    3       1200.0
111112  camera  1111    1       5200.0
111113  notebook        1111    1       10.0
111114  bag     2222    2       20.0
111115  t-shirt 4444    2       66.0
Time taken: 0.19 seconds, Fetched: 5 row(s)

 

 


11. 하이브 HiveQL 연습문제

 

주소가 WA인 고객 검색하기 

hive> select * from customers where address='WA';
OK
1111    John    WA
2222    Emily   WA
3333    Rick    WA
Time taken: 1.771 seconds, Fetched: 3 row(s)

주소가 WA이면서 id가 2222보다 큰 고객 명단 검색하기

hive> select name from customers where address='WA' and id>2222;
OK
3333    Rick    WA
Time taken: 2.172 seconds, Fetched: 1 row(s)

고객테이블에서 주소컬럼 검색하기

hive> select address from customers;
OK
WA
WA
WA
CA
NJ
NY
Time taken: 0.218 seconds, Fetched: 6 row(s)

주소로 정렬하여 고객명과 주소 검색하기

hive> select name, address from customers order by address;
OK
Jane    CA
Amit    NJ
Nina    NY
Rick    WA
Emily   WA
John    WA
Time taken: 21.633 seconds, Fetched: 6 row(s)

고객명단 수 검색하기

hive> select count(name) from customers;
OK
6
Time taken: 23.811 secconds, Fetched: 1 row(s)

첫번째 고객명단 검색하기 ( mysql 문법 )

hive> select * from customers limit 1;
OK
1111    John    WA
Time taken: 1.883 seconds, Fetched: 1 row(s)

주소별 인원수 검색하기

hive> select address, count(address) from customers group by address;
OK
CA      1
NJ      1
NY      1
WA      3
Time taken: 21.148 seconds, Fetched: 4 row(s)

고객아이디, 고객명과 고객이 주문한 상품명 출력하기

hive> select c.id, c.name, o.product_id from customers c inner join orders o on c.id=o.customer_id;
OK
1111    John    phone
1111    John    camera
1111    John    notebook
2222    Emily   bag
4444    Jane    t-shirt
Time taken: 28.25 seconds, Fetched: 5 row(s)

 

hive> select c.*, o.* from customers c inner join orders o on c.id=o.customer_id;
OK
1111    John    WA      111111  phone   1111    3       1200.0
1111    John    WA      111112  camera  1111    1       5200.0
1111    John    WA      111113  notebook        1111    1       10.0
2222    Emily   WA      111114  bag     2222    2       20.0
4444    Jane    CA      111115  t-shirt 4444    2       66.0
Time taken: 24.614 seconds, Fetched: 5 row(s)

 


 

12. 하이브에서 데이터베이스 명이 보이지 않을 때

 

※ 하이브에서 현재 사용중인 데이터베이스 이름이 보이지 않을 경우, 작업을 어디서 하고 있는지 파악하기가 어렵다. 

   이에 대한 두 가지 해결방법이 있다. 

 

1) 하이브 콘솔에서 명령어를 입력하여 한시적으로 데이터베이스 이름을 출력하기

2) hive-site.xml 파일에서 설정을 바꿔줌으로써 데이터베이스 이름을 상시 출력하기

 

 

1) 하이브 콘솔에서 명령어를 입력하여 한시적으로 데이터베이스 이름을 출력하기

set hiveconf:hive.cli.print.current.db=true;

 

2) hive-site.xml 파일에서 설정을 바꿔줌으로써 데이터베이스 이름을 상시 출력하기

    ① hive-site.xml 파일은 하이브 설치경로상 conf 디렉토리에 위치한다. 

[hadoop@dn01 ~]$ ls /opt/hive/2.3.8/
bin                      conf      hcatalog  lib      NOTICE             scripts
binary-package-licenses  examples  jdbc      LICENSE  RELEASE_NOTES.txt

[hadoop@dn01 ~]$ ls /opt/hive/2.3.8/conf/
beeline-log4j2.properties.template    hive-site.xml
hive-default.xml.template             ivysettings.xml
hive-env.sh                           llap-cli-log4j2.properties.template
hive-env.sh.template                  llap-daemon-log4j2.properties.template
hive-exec-log4j2.properties.template  parquet-logging.properties
hive-log4j2.properties.template

 

    ② vi 에디터로 hive-site.xml 파일을 연다. 

[hadoop@dn01 ~]$ vi /opt/hive/2.3.8/conf/hive-site.xml

 

    ③ 명령모드에서 /current.db 를 입력한 뒤, 1196 라인의 false 를 true 로 수정한다. 

 

    ④ 하이브를 재실행하면 데이터베이스 이름이 상시 출력되는 것을 확인할 수 있다. 

 

 

(+) 추가로 테이블의 데이터를 조회할 때 컬럼명이 항시 보이게 하려면 head 에 관한 설정을 변경한다. 

   ( 컬럼명을 출력해도 형태가 보기 좋게 나오지는 않는게 하이브의 단점같다. )

 

 

반응형

'교육과정 > KOSMO' 카테고리의 다른 글

Day71  (0) 2021.01.22
Day70  (0) 2021.01.21
Day68  (0) 2021.01.19
Day67  (0) 2021.01.18
Day66  (0) 2021.01.15