프로그래밍

[Hive] MySQL 설치 - Hive 연동

RainIron 2021. 6. 4. 16:30
반응형

※ MySQL 설치

OS: ubuntu 20.04

 

1. MySQL Application repository 설치

$ wget https://dev.mysql.com/get/mysql-apt-config_0.8.16-1_all.deb

-> 파일 다운로드(wget 명령어 사용)

$ sudo dpkg -i mysql-apt-config_0.8.16-1_all.deb

-> 압축 해제

Ok를 누르자
mysql - 8.0 설치

2. Ubuntu Server update

$ sudo apt update

* MySQL 8.0 정책 확인

$ sudo apt-cache policy mysql-server

Policy 확인

3. MySQL 8.0 설치

$ sudo apt install mysql-client mysql-community-server mysql-server

-> Root Password 설정하는 창이 나온다.

Ok

$ sudo mysql_secure_installation

- Estimated strength of the password: 0

- Change the password for root ? ((Press y|Y for Yes, any other key for No) : n

- Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

- Disallow root login remotely? (Press y|Y for Yes, any other key for No) : n

- Remove test database and access to it? (Press y|Y for Yes, any other key for No) : n

- Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

 

4. MySQL 실행

$ mysql -u root -p

 

5. Background MySQL 종료, 시작, 재시작

$ sudo systemctl stop mysql

이후 mysql -u root -p 해도 실행이 안되는데, mysql을 종료했기 때문

" ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) "

(재실행)

$ sudo systemctl start mysql

 

$ sudo systemctl restart mysql


※ MySQL 활용

1. SHOW

* SHOW databases: 현재 존재하는 데이터베이스 리스트 출력

SHOW databases;

* SHOW tables: 현재 위치한 데이터베이스 내의 테이블 리스트 출력

2. USE

* USE test: sys 데이터베이스 이동

USE test;

3. CREATE

* CREATE DATABASE test: test 이름의 데이터베이스 생성

 CREATE DATABASE test;

 

* CREATE TABLE 이름: 이름 테이블을 생성

예)

CREATE TABLE member(
mid int AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
phone VARCHAR(20),
birth DATE);

 

4. DESC

* DESC 테이블명: 테이블 구조 출력

예)

DESC member;

 

5. INSERT

INSERT INTO member(name, phone, birth) VALUES('SMITH', '000-0000-0000', '2021-01-01'),
('KALI', '111-1111-1111', '2021-02-02'),
('TIMO', '222-2222-2222', '2021-03-03'),
('ECHO', '333-3333-3333', '2021-04-04'),
('QUEEN', '444-4444-4444', '2021-05-05');

 

6. SELECT

SELECT * FROM member;

7. QUIT(종료)

quit;

※ Hive 연동(데이터 가공)

* 하둡 기반의 DW 솔루션

* SQL과 매우 유사한 HiveQL이라는 쿼리 제공

* HiveQL은 내부적으로 맵리듀스로 변환되어 실행됨

1. Hive에서 MySQL로 접속할 사용자 생성

CREATE USER 'hive'@'%' IDENTIFIED BY 'hive';
-- CREATE USER 계정명@IP주소 IDENTIFIED BY 비밀번호;
-- %: IP 주소, localhost를 대치하기 위한 와일드카드 / %를 사용함으로써 어디서든 접근가능하게 함

GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%';
-- GRANT 권한 ON 데이터베이스와 테이블 TO 사용자명;
-- *.*: 모든 DB.모든 테이블

-- localhost에서 접근해도 사용이 가능하게 추가한다.
CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive';

GRANT ALL PRIVILEGES ON *.* TO 'hive'@'localhost';

FLUSH PRIVILEGES;
-- MySQL의 사용자를 추가, 삭제하거나 권한 등을 변경하였을 때, MySQL에 변경사항을 적용하기 위해 사용하는 명령어

* 비밀번호 정책에 맞지 않는다는 오류가 발생해 정책을 변경했다.

" ERROR 1819 (HY000): Your password does not satisfy the current policy requirements "

SET GLOBAL validate_password.policy=LOW;
SET GLOBAL validate_password.length=4;

 

2. Hive 계정으로 MySQL 실행

-- 파일 변경되었으므로 서버 재실행
$ sudo systemctl restart mysql

$ mysql -u hive -p

 

3. Hive의 메타데이터를 저장할 데이터베이스를 MySQL에 생성

CREATE DATABASE hive;

SHOW databases;

Metadata를 저장할 hive DB 제작 완료

 

4. hive-site.xml 파일 생성

* hive-3.1.2/conf/ 폴더 내에 있는 hive-default.xml.template를 이용해 hive-site.xml 파일을 생성하고, 이전 속성을 주석 처리한 뒤, 아래 속성을 추가한다.

예)

$ cp hive-default.xml.template hive-site.xml
<property>
  <name>hive.metastore.warehouse.dir</name>
  <value>/user/hive/warehouse</value>
 </property>
<property>
   <name>javax.jdo.option.ConnectionDriverName</name>
   <value>com.mysql.cj.jdbc.Driver</value>
   <description>Driver class name for a JDBC metastore</description>
</property>
<property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://localhost/hive?serverTimezone=UTC</value>
   <description>
     JDBC connect string for a JDBC metastore.
     To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
     For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
   </description>
</property>
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>Username to use against metastore database</description>
  </property>
<property>
   <name>javax.jdo.option.ConnectionPassword</name>
   <value>hive</value>
   <description>password to use against metastore database</description>
</property>
<property>
   <name>hive.metastore.uris</name>
   <value>thrift://127.0.0.1:9083</value>
   <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
</property>
<property>
   <name>hive.metastore.db.type</name>
   <value>mysql</value>
   <description>
     Expects one of [derby, oracle, mysql, mssql, postgres].
     Type of database used by the metastore. Information schema and JDBCStorageHandler depend on it.
   </description>
</property>

1. hive.metastore.warehouse.dir: HDFS 영역 저장소

2. javax.jdo.option.ConnectionDriverName: JDBC 드라이버(Connector) 추가

3. javax.jdo.option.ConnectionURL: 사용할 데이터베이스 명시 (jdbc:mysql://localhost/hive?serverTimezone=UTC)

4. javax.jdo.option.ConnectionUserName: DB 사용자 이름

5. javax.jdo.option.ConnectionPassword: DB 사용자 비밀번호

6. hive.metastore.uris: 외부에서 접근할 수 있는 metastore 위치

7. hive.metastore.db.type: metastore에 mysql 타입 추가

 

5. JDBC 드라이버 버전에 맞게 설치

* http://downloads.mysql.com/archives 에 가서 맞는 버전의 Connector를 다운받는다.

  - Product Version: 20.04

  - Operating System: Platform Independent

 

$ wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.24.tar.gz

  다운 받은 파일을 압축 해제하고, 안에 있는 mysql-connector를 hive-3.1.2/lib에 위치시킨다.

$ tar xvzf mysql-connector-java-8.0.24.tar.gz

# 상위 폴더로 이동한 후
$ mv mysql-connector-java-8.0.24/mysql-connector-java-8.0.24.jar hive-3.1.2/lib/mysql-connector-java-8.0.24.jar

 

6. schematool을 사용해 metastore_db 생성하기

$ schematool -dbType mysql -initSchema


※ Hive-MySQL 에러

* hive 실행 후, 쿼리 실행이 안 될 때

" Failed: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient " 에러 발생

 

-> $ hive --service metastore & 입력 후 , 다른 터미널 창을 열어 hive 실행


※ 활용 예제(1)

1. Hive로 파일 로드

1) Create Table 

CREATE TABLE IF NOT EXISTS effectsOfcovid(
Direction VARCHAR(20),
Year int,
CovidDate DATE,
Weekday VARCHAR(20),
Country VARCHAR(20),
Commodity VARCHAR(20),
Transport_Mode VARCHAR(20),
Measure VARCHAR(10),
Value int,
Cumulative int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
TBLPROPERTIES('NO_AUTO_COMPACTION' = 'true');

2) Load Data

LOAD DATA LOCAL INPATH '/home/hdoop/effectsOfcovid.csv' OVERWRITE INTO TABLE effectsOfcovid;

 

2. HDFS에 파일 저장 확인

 

3. Hive에서 MySQL 쿼리를 사용해 데이터 질의

SELECT COUNT(*) FROM effectsofcovid GROUP BY 'Country';

결과를 시각적으로 확인할 수 없기 때문에, 결과를 테이블로 생성하여 HDFS 영역에서 확인해보겠다.

 

CREATE TABLE result1 AS SELECT COUNT(*) FROM effectsofcovid;

4. HDFS에 있는 쿼리 결과 확인

5. 오류 확인 및 정정

* 사실 쿼리 결과는 102511이 되어야 한다.(Column 행이 생략되어야 하기 때문에)

  따라서, 기존 테이블 규칙을 변경한 뒤, 데이터를 다시 로드해서, 쿼리 명령을 실행하겠다.

ALTER TABLE effectsofcovid SET TBLPROPERTIES ("skip.header.line.count"="1");

LOAD DATA LOCAL INPATH '/home/hdoop/effectsOfcovid.csv' OVERWRITE INTO TABLE effectsOfcovid;

drop table result1;
CREATE TABLE result1 AS SELECT COUNT(*) FROM effectsofcovid;


※ 활용 예제(2)

1. Create Table

CREATE TABLE sample2(
Name VARCHAR(30),
Team VARCHAR(20),
Position VARCHAR(20),
Height int,
Weight int,
Age float)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
TBLPROPERTIES("skip.header.line.count"="1");

 

2. Load Data

LOAD DATA LOCAL INPATH '/home/hdoop/sample2.csv' OVERWRITE INTO TABLE sample2;

 

3. Check

 

4. 전체 갯수 확인하기

CREATE TABLE result2 AS SELECT COUNT(*) FROM sample2;


※ 기타

* MySQL 삭제

$ sudo apt-get remove --purge mysql*
$ sudo apt-get autoremove
$ sudo apt-get autoclean

 

* Hive의 메타데이터 위치 장소: /hive-3.1.2/bin/metastore_db

 

* mysql login: mysql -u hive -p

 

* " Error: Table 'CTLGS' already exists (state=42S01,code=1050)
org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !! "

(해결방법)

1)

ConnectionURL을 변경

2) mysql -u hive -p 로그인 -> 기존에 있던 hive 데이터베이스 삭제

3) $ schematool -dbType mysql -initSchema 재실행

반응형