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 에 관한 설정을 변경한다.
( 컬럼명을 출력해도 형태가 보기 좋게 나오지는 않는게 하이브의 단점같다. )