지구정복

[Hive] Hive 설치하기 (MySQL 설치도 같이) , Hive engine Tez로 사용하기 본문

데이터 엔지니어링 정복/Hive

[Hive] Hive 설치하기 (MySQL 설치도 같이) , Hive engine Tez로 사용하기

eeaarrtthh 2021. 5. 19. 18:07
728x90
반응형
SMALL

참고 : https://sparkdia.tistory.com/11

 

 

먼저 나의 환경정보는 다음과 같다.

 

오라클버추얼박스 5.6.2

CentOS 7 리눅스 가상서버 3대 (hadoop01, hadoop02, hadoop03)

 

이 중에서 나는 hadoop02 서버에 설치할 예정이다.

 

1. MySQL 설치하기

먼저 mysql 홈페이지에 접속

https://downloads.mysql.com/archives/community/

5.7.28 버전 / Red Hat 계열 클릭

그리고 링크 주소 복사한다.

터미널로 가서 wget을 이용해서 다운받는다.

[root@hadoop02 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

그리고 압축을 푼다.

[root@hadoop02 ~]# tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar 

 

아래와 같이 yum localinstall을 통해 패키지들을 설치해준다. rpm을 통해 설치하면 의존관계에 따라 설치해야 되므로 복잡하다. yum을 사용하기로 하자.

아래 명령어는 해당 로컬 디렉토리의 패키지들을 의존성에 맞게 설치해준다.

[root@hadoop02 ~]# yum localinstall mysql-community-*

설치가 완료되었으면 /etc/디렉토리에 my.cnf가 생성되었을 것이다. 한 번 확인해본다.

[root@hadoop02 ~]# cat /etc/my.cnf

이 파일에서 MySQL DB의 설정값을 수정할 수 있다.

 

이제 mysql 서비스를 실행시키고 잘 작동되는지 확인한다.

[root@hadoop02 ~]# systemctl start mysqld
[root@hadoop02 ~]# systemctl status mysqld

 

 

다음으로 MySQL 의 root계정 비밀번호를 설정해준다. 이때 무제약모드로 mysql 서비스를 실행해야된다.

방금 실행했던 mysql서비스를 다시 중지시킨다.

[root@hadoop02 ~]# systemctl stop mysqld

아래 명령어를 통해 무제약모드로 실행시킨다.

--skip-grant-tables를 통해 아무런 제약없이 데이터베이스를 사용할 수 있다.

[root@hadoop02 ~]# systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"

 

이제 다시 mysqld 서비스를 실행시킨다.

[root@hadoop02 ~]# systemctl start mysqld
[root@hadoop02 ~]# systemctl status mysqld

 

 

이제 root계정으로 MySQL에 접속한다.

[root@hadoop02 ~]# mysql -u root

서버가 계정관련 명령어를 수행할 수 있게 아래 명령어를 실행한다.

mysql> flush privileges;

 

아래 명령어로 root 비밀번호를 설정한다. 쉽게 123456으로 했다.

mysql> alter user 'root'@'localhost' identified by '123456';

 

비밀번호 설정이 완료되었으면 무제약조건 옵션을 끄기 위해 mysqld서비스를 재실행 해줘야 한다.

mysql> exit
[root@hadoop02 ~]# systemctl unset-environment MYSQLD_OPTS
[root@hadoop02 ~]# systemctl start mysqld
[root@hadoop02 ~]# systemctl status mysqld

 

 

이제 다시 접속해보자.

[root@hadoop02 ~]# mysql -u root -p
Enter password: 

아래와 같이 잘 접속되는 것을 확인할 수 있다.

 

 

 

 

 

2. Hive 설치하기

이제 본격적으로 Hive를 설치해본다.

 

먼저 아래 사이트에 접속(리눅스에서 접속가능)

https://hive.apache.org/downloads.html

아래 클릭

3.1.2버전 클릭

우클릭하여 링크주소 복사

wget명령어로 설치한다.

[root@hadoop02 ~]# wget https://mirror.navercorp.com/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz

 

압축해제 경로를 지정한다. /usr/local/로 

[root@hadoop02 ~]# tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /usr/local/

해당 경로로 이동해서 확인해본다.

[root@hadoop02 ~]# cd /usr/local
[root@hadoop02 local]# ll

편의를 위해 심볼릭 링크를 만든다.

[root@hadoop02 local]# ln -s apache-hive-3.1.2-bin/ hive

 

이제 hive실행을 위해 환경변수를 설정한다.

[root@hadoop02 local]# vi /etc/profile

export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$PATH:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$HIVE_HOME/bin

source명령어로 변경사항을 적용한다.

[root@hadoop02 local]# source /etc/profile

 

 

 

다음으로 전체 서버를 다 켜준 다음에 하둡을 실행시킨다.

 

그리고 HDFS에 /tmp와 /user/hive/warehouse 디렉토리를 생성해줘야 한다.

생성된 디렉토리는 그룹쓰기권한도 설정해줘야 한다.

 

hadoop01 서버가 마스터 서버이므로 여기서 아래의 하둡 명령어를 실행한다.

[root@hadoop01 local]# hadoop dfs -mkdir /tmp
[root@hadoop01 local]# hadoop dfs -mkdir -p /user/hive/warehouse
[root@hadoop01 local]# hadoop dfs -chmod g+w /tmp
[root@hadoop01 local]# hadoop dfs -chmod -R g+w /user

아래처럼 브라우저에서 잘 생성되었는 지 확인할 수 있다.

 

 

이제 MySQL로 접속해서 Metastore로 사용할 데이터베이스와 계정을 생성해보자.

데이터베이스명은 metastore이고 hive의 기본 문자타입이 utf8이므로 똑같이 설정해준다. 그리고 모든 권한을 부여해준다.

[root@hadoop02 local]# mysql -u root -p
Enter password: 
mysql> create database metastore default character set utf8;
Query OK, 1 row affected (0.08 sec)

아래처럼 패스워드 정책에 맞지않다고하면 정책변경해주자.

mysql> create user 'hive'@'%' identified by '123456';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

현재 패스워드 정책은 아래와 같이 확인할 수 있다.

mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.06 sec)

정책을 medium에서 low로 바꾸고 패스워드길이도 6자리로 바꾸자.

mysql> set global validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_length=6;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 6     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)

 

다시 hive계정 만들고 비밀번호 설정한다.

mysql> create user 'hive'@'%' identified by '123456';
Query OK, 0 rows affected (0.02 sec)

모든 권한 부여하기

mysql> grant all privileges on metastore.* to 'hive'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;

 

 

 

이제 MySQL JDBC Connector/J 를 설치해야 한다.

hive에서는 JDBC를 이용해 MySQL로 액세스하기 때문이다. 이때 MySQL 버전에 맞는 JDBC를 다운받아야 된다.

각 버전에 맞는 JDBC확인은 아래 사이트에서 확인할 수 있다.

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-versions.html

 

나는 MySQL 5.7버전을 설치했으니 커넥터는 5.1이나 8.0 둘 다 상관없다.

나는 5.1 커넥터를 설치하겠다.

 

아래 사이트에 들어가서 다운받는다. 오라클 로그인이 필요하다.

https://downloads.mysql.com/archives/c-j/

 

그리고 다운로드 버튼에서 링크 주소 복사한다.

mysql 꺼주고 복사한 tar파일을 다운받는다.

mysql> exit
[root@hadoop02 ~]# wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.46.tar.gz

 

그리고 압축을 해제한다.

[root@hadoop02 ~]# tar -zxvf mysql-connector-java-5.1.46.tar.gz 

 

그리고 해당 디렉토리로 들어가서 jar파일을 mysql/lib디렉토리로 옮겨야 한다.

[root@hadoop02 ~]# cd mysql-connector-java-5.1.46/
[root@hadoop02 mysql-connector-java-5.1.46]# mv mysql-connector-java-5.1.46-bin.jar /usr/local/hive/lib/
[root@hadoop02 mysql-connector-java-5.1.46]# mv mysql-connector-java-5.1.46.jar /usr/local/hive/lib/

옮겨졌는지 디렉토리로 가서 확인해본다.

[root@hadoop02 mysql-connector-java-5.1.46]# cd /usr/local/hive/lib/
[root@hadoop02 lib]# ll mysql*
-rw-r--r-- 1 root root 1006906  4월 20  2020 mysql-connector-java-5.1.46-bin.jar
-rw-r--r-- 1 root root 1006906  4월 20  2020 mysql-connector-java-5.1.46.jar
-rw-r--r-- 1 root root    7954 10월 26  2020 mysql-metadata-storage-0.9.2.jar

 

이제 Metastore DB를 MySQL로 사용하기 위해서 hive-site.xml에서 JDBC Connection 정보 설정이 필요하다.

아래처럼 수정해준다.

[root@hadoop02 ~]# vi /usr/local/hive/conf/hive-site.xml

ㅇ첫 번째 밑줄은 데이터베이스명, 두 번째는 계정명, 세 번째는 해당 계정의 비밀번호이다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
        <property>
                <name>javax.jdo.option.ConnectionURL</name>
                <value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true&amp;useSSL=false&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>hive</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>123456</value>
        </property>
        <property>
                <name>hive.metastore.schema.verfication</name>
                <value>false</value>
        </property>
</configuration>

 

====하둡 3버전인 분들만 아래 명령어 실행====

혹시 하둡 3버전에서 hive를 설치하시는 분은 ~hive/lib/guava-19.0.jar를 guava-27.0-jre.jar로 바꿔서 사용해야 한다.

guava-27.0-jre.jar는 ~hadoop/share/hadoop/common 디렉토리에 있거나 또는 ~hadoop/share/hadoop/common/lib

디렉토리에 있다. 이를 아래처럼 복사해서 옮긴다.

cp /home/hadoop01/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /usr/local/hive/lib/guava-27.0-jre.jar

그리고 기존 guava-19.0.jar파일과 충돌이 나니깐 기존 파일은 이름을 변경해준다.

mv /usr/local/hive/lib/guava-19.0.jar /usr/local/hive/lib/guava-19.0.jar.bak

====하둡 3버전인 분들만 위 명령어 실행====

 

 

설정이 완료되었으면 메타정보 초기화 작업을 진행하자.

아래 명령어를 실행

[root@hadoop02 hive]# /usr/local/hive/bin/schematool -dbType mysql -initSchema

아래처럼 성공했다고 나와야 한다.

 

 

 

 

이제 hive를 실행하고 테스트해보자.

먼저 3개의 서버 모두 켜준 뒤 hadoop01서버에서 하둡을 실행시킨다.

그리고 hive설치되어 있는 서버에서 hive라고 입력한다.

[root@hadoop02 my.cnf.d]# hive

 

이제 hive에서 데이터베이스와 테이블을 만들어보자.

hive> create database test;
hive> use test;
hive> create table test.tab1(
    > col1 integer,
    > col2 string
    > );
hive> show tables;
hive> insert into table test.tab1
    > select 1 as col1, 'avasdf' as col2;

 

 

해당 insert 작업을 하둡 UI에서 확인할 수 있다.

여기까지 되신분들은 굳이 밑에 tez엔진으로 안바꿔도 됩니다

 

 

3. hive engine tez엔진으로 교체

hive execute engine을 tez나 spark로 사용할 수 있다.

근데 굳이 안바꿔도된다.

 

 

더보기 글 부분은 생략 (제가 삽질한 거 그냥 기록해놓은겁니다ㅎㅎ)

더보기

이제 tez를 설치하고 hive engine을 tez로 교체해보자.

먼저 tez를 설치하기 위해서는 maven 3버전 이상, java 8버전 이상, protobuf 2.5.0 버전이 필요하다.

현재 maven과 protobuf가 없으므로 maven먼저 설치한다.

 

메이븐 홈페이지에 접속

https://maven.apache.org/download.cgi

 

아래 링크를 복사한다.

 

/usr/local에 설치한다.

압축을 풀어준다.

심볼릭 링크 설정

환경변수를 설정한다.

환경변수를 적용시켜준다.

 

이제 maven이 잘 설치되었는지 버전을 출력해본다.

 

 

휴...

일단 protobuf란 구조화된 데이터를 직렬화하는 방식이라고 한다. 여기서 직렬화란 객체의 내용을 바이트 단위로 변환해서 파일 또는 네트워크를 통해서 송수신이 가능하도록 하는 것을 의미한다.

 

암튼 protobuf를 설치하자

아래 명령어 실행

make명령어로 컴파일 해준다. 여기서 한 2~3분 정도 걸리는 것 같다. 기다리자...

이제 설치가 완료됐다. 버전이 나오는지 확인해보자.

이제 tez를 설치하고 hive engine을 tez로 교체해보자.

먼저 tez를 설치하기 위해서는 maven 3버전 이상, java 8버전 이상, protobuf 2.5.0 버전이 필요하다.

현재 maven과 protobuf가 없으므로 maven먼저 설치한다.

 

메이븐 홈페이지에 접속

https://maven.apache.org/download.cgi

 

아래 링크를 복사한다.

 

/usr/local에 설치한다.

[root@hadoop02 local]# wget https://mirror.navercorp.com/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz

압축을 풀어준다.

[root@hadoop02 local]# tar -xvf apache-maven-3.8.1-bin.tar.gz 

심볼릭 링크 설정

[root@hadoop02 local]# ln -s apache-maven-3.8.1 maven

환경변수를 설정한다.

[root@hadoop02 local]# vi /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$FLUME_HOME/bin:$HIVE_HOME/bin:$MAVEN_HOME/bin

환경변수를 적용시켜준다.

[root@hadoop02 local]# source /etc/profile

 

이제 maven이 잘 설치되었는지 버전을 출력해본다.

[root@hadoop02 local]# mvn -v
Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
Maven home: /usr/local/maven
Java version: 1.8.0_291, vendor: Oracle Corporation, runtime: /usr/local/jdk1.8.0_291/jre
Default locale: ko_KR, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.25.1.el7.x86_64", arch: "amd64", family: "unix"

 

 

휴...

일단 protobuf란 구조화된 데이터를 직렬화하는 방식이라고 한다. 여기서 직렬화란 객체의 내용을 바이트 단위로 변환해서 파일 또는 네트워크를 통해서 송수신이 가능하도록 하는 것을 의미한다.

 

암튼 protobuf를 설치하자

아래 명령어 실행

[root@hadoop02 local]# wget https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz
[root@hadoop02 local]# tar -xvf protobuf-2.5.0.tar.gz 
[root@hadoop02 protobuf-2.5.0]# ./autogen.sh 
[root@hadoop02 protobuf-2.5.0]# ./configure 

make명령어로 컴파일 해준다. 여기서 한 2~3분 정도 걸리는 것 같다. 기다리자...

[root@hadoop02 protobuf-2.5.0]# make
[root@hadoop02 protobuf-2.5.0]# make install

이제 설치가 완료됐다. 버전이 나오는지 확인해보자.

[root@hadoop02 protobuf-2.5.0]# protoc --version
libprotoc 2.5.0

이제 tez를 설치해본다. 

먼저 tez는 hadoop의 버전에 따라 설치해야되는 버전이 나뉜다.

hadoop 버전이 2.6.x 이하이면 tez 버전 0.8.5,

hadoop 버전이 2.7.x 이상이면 tez 버전 0.9.0 이상을 다운받으면 된다.

 

현재 내 hadoop 버전은 2.7.x이므로 0.9.2 버전을 다운받는다.

[root@hadoop02 local]# wget https://downloads.apache.org/tez/0.9.2/apache-tez-0.9.2-bin.tar.gz
[root@hadoop02 local]# tar -zxvf apache-tez-0.9.2-bin.tar.gz
[root@hadoop02 local]# ln -s apache-tez-0.9.2-bin tez

 

hive-site.xml을 수정해준다.

[root@hadoop02 ~]# vi /usr/local/hive/conf/hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
        <property>
                <name>javax.jdo.option.ConnectionURL</name>
                <value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true&amp;useSSL=false&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
                <name>tez.lib.uris</name>
                <value>/user/tez</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>hive</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>123456</value>
        </property>
        <property>
                <name>hive.metastore.schema.verfication</name>
                <value>false</value>
        </property>
</configuration>

 

 

그리고 tez-site.xml을 새로 만들어서 아래와 같이 작성한다. 이때 tez-.lib.uris는 hdfs에서 tez 라이브러리 위치이다.

[root@hadoop02 local]# cd /usr/local/tez/conf/
[root@hadoop02 local]# vi /usr/local/tez/conf/tez-site.xml

<configuration>
        <property>
                <name>tez.lib.uris</name>
                <value>${fs.defaultFS}/user/tez/tez.tar.gz</value>
        </property>
        <property>
                <name>tez.use.cluster.hadoop-libs</name>
                <value>true</value>
        </property>
        <property>
                <name>hive.tez.container.size</name>
                <value>3020</value>
        </property>
</configuration>
~                  

그리고 환경변수 설정을 한다. 네모 칸에 있는 4줄을 작성해준다.

export TEZ_HOME=/usr/local/tez
export TEZ_CONF_DIR=$TEZ_HOME/conf
export TEZ_JARS=$TEZ_HOME/*:$TEZ_HOME/lib/*

export HADOOP_CLASSPATH=$CLASSPATH:${TEZ_CONF_DIR}:${TEZ_JARS}/*:${TEZ_JARS}/lib/*

환경변수 설정한 것을 적용한다.

[root@hadoop02 local]# source /etc/profile

 

이제 전체 서버를 켠 뒤 하둡을 실행한다. 그리고 hdfs명령어로 tez.tar.gz 파일을 업로드할 hdfs 디렉토리를 만든다.

[root@hadoop02 local]# hdfs dfs -mkdir -p /user/tez
[root@hadoop02 local]# hdfs dfs -put /usr/local/tez/share/tez.tar.gz /user/tez

 

이제 hive를 실행하고 execution engine을 tez로 교체해준다.

[root@hadoop02 local]# hive
hive> set hive.execution.engine=tez;

 

 

 

 

 

 

 

 

 

 


 

* 참고 *

버추얼박스 서버 용량 변경하기

virtual box centos 7 linux 용량늘리기 참고 블로그 : https://antimidal.tistory.com/4


 

 

 

 

 

진짜 에코시스템들 수동설치하는 거 너무 힘들다 ㅠㅠ 이래서 클라우데라 매니저나 암바리 사용하나보다.

 

위 과정중에서 삽질한 시간이 너무 많다 진짜ㅠ

제 글을 보고 저 같은 사람이 생기지 않기를 바랍니다!

728x90
반응형
LIST
Comments