Day70

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

키워드 : 공개 데이터셋 다운로드 / 하이브로 데이터셋 확인하기 / 스쿱 설치 / SQOOP 을 사용하여 RDBMS와 HDFS 간 데이터 전송하기 ( import , export ) / 제플린 설치 ( zeppelin )

 

****

 

  - hive

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

  - spark

  : java + python + scalar 
  : java는 거의 쓰지 않는다. 
  : python 으로도 할 수는 있으나 속도 문제 때문에 scalar 를 다시 배우는 경우가 많다.

  - sqoop   : RDBMS의 데이터를 하이브로 옮길 수 있다. 

 

  ※ 오늘의 목표 : http://www.grouplens.org/datasets/movielens 의 데이터셋을 가져와서 활용하기

   - README.txt 파일의 detailed descriptions 에서 각 파일에 어떤 데이터가 들어있는지 알 수 있다. 

      http://files.grouplens.org/datasets/movielens/ml-100k-README.txt

  u.item   -- Information about the items (movies); this is a tab separated
                  list of
                  movie id | movie title | release date | video release date |
                  IMDb URL | unknown | Action | Adventure | Animation |
                  Children's | Comedy | Crime | Documentary | Drama | Fantasy |
                  Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi |
                  Thriller | War | Western |
                  The last 19 fields are the genres, a 1 indicates the movie
                  is of that genre, a 0 indicates it is not; movies can be in
                  several genres at once.
                  The movie ids are the ones used in the u.data data set.
  u.user   -- Demographic information about the users; this is a tab
                  separated list of
                  user id | age | gender | occupation | zip code
                  The user ids are the ones used in the u.data data set.

 

 

 

1. 공개 데이터셋 다운로드

 

(1) 데이터셋이 zip 파일이므로 zip 파일을 사용하기 위한 준비를 한다. 

    ① zip 파일을 다운받아 압축해제 하기 위해서는 리눅스에 unzip 이 필요하다. 

    ② dn01 노드에서 root 계정으로 로그인한다. (모든 설치는 root 에서 진행한다. )

[hadoop@dn01 ~]$ su - root

    ③ yum 을 사용하여 unzip 을 설치한다. 

[root@dn01 ~]# yum install unzip
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.kaist.ac.kr
 * extras: ftp.kaist.ac.kr
 * updates: ftp.kaist.ac.kr
base                 | 3.6 kB     00:00
extras               | 2.9 kB     00:00
updates              | 2.9 kB     00:00
Package unzip-6.0-21.el7.x86_64 already inst                                                  alled and latest version
Nothing to do

    ③ unzip 설치가 끝나면, 하둡 계정으로 돌아온다. 

[root@dn01 ~]# su - hadoop

 

(2) 리눅스에서 데이터셋을 다운받아 저장할 hive_data 디렉토리를 생성한 뒤 이동한다. 

    부모 디렉토리가 필요할 경우 자동으로 생성될 수 있도록 -p 옵션을 함께 기술한다. 

[hadoop@dn01 ~]$ ls /home/hadoop/
hadoop_data  ${system:java.io.tmpdir}  temp

[hadoop@dn01 ~]$ mkdir -p /home/hadoop/hive_data
[hadoop@dn01 ~]$ cd ~/hive_data

 

(3) wget 명령어를 사용하여 링크로부터 데이터셋의 zip 파일을 다운로드한다. 

[hadoop@dn01 hive_data]$ wget http://www.grouplens.org/system/files/ml-100k.zip

...
100%[====================================================>] 4,924,029   24.5MB/s   in 0.2s

2021-01-21 01:37:55 (24.5 MB/s) - ‘ml-100k.zip’ saved [4924029/4924029]

 

(4) hive_data 디렉토리에 데이터셋의 zip 파일이 잘 다운받아졌는지 확인한다. 

[hadoop@dn01 hive_data]$ ls
ml-100k.zip

 

(5) unzip 을 사용하여 데이터셋의 압축을 해제한다. 

[hadoop@dn01 hive_data]$ unzip ml-100k.zip
Archive:  ml-100k.zip
   creating: ml-100k/
  inflating: ml-100k/allbut.pl
  inflating: ml-100k/mku.sh

 

(6) 데이터셋에 어떤 데이터 파일이 포함되어 있는지 ls 명령어로 출력할 수 있다. 

[hadoop@dn01 hive_data]$ ls ml-100k
allbut.pl  u1.base  u2.test  u4.base  u5.test  ub.base  u.genre  u.occupation
mku.sh     u1.test  u3.base  u4.test  ua.base  ub.test  u.info   u.user
README     u2.base  u3.test  u5.base  ua.test  u.data   u.item

 

(7-1) 세부 내용을 확인하기 위해 u.item 데이터에서 head 명령어를 사용하여 1줄만 출력해본다.    

    ( 끝부분의 숫자는 장르에 대한 정보이다. )

[hadoop@dn01 hive_data]$ head -1 ml-100k/u.item
1|Toy Story (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0

 

(7-2) 세부 내용을 확인하기 위해 u.user 데이터에서 head 명령어를 사용하여 3줄만 출력해본다.

    ( 사람에 대한 정보가 들어있음을 확인할 수 있다. )

[hadoop@dn01 hive_data]$ head -3 ml-100k/u.user
1|24|M|technician|85711
2|53|F|other|94043
3|23|M|writer|32067

 

>> 데이터들이 파이프라인( | ) 으로 구분되어 있음을 확인할 수 있다. 

>> 현재 상태에서는 조회하기 어려우므로 하이브로 데이터를 이관하여 RDBMS 로 처리하고자 한다. 

 


2. 하이브로 데이터셋 확인하기

 

 

※ 하려는 작업

  hdfs 의 /user/hadoop/movies 폴더에 u.item 파일 복사하기
  hdfs 의 /user/hadoop/userinfo 폴더에 u.user 파일 복사하기

 

(1) 현재 HDFS 상에 movies와 userinfo 디렉토리 자체가 없으므로 생성을 먼저 진행한다. 

[hadoop@dn01 ~]$ hdfs dfs -ls /user/hadoop 
ls: `/user/hadoop': No such file or directory 

[hadoop@dn01 ~]$ hdfs dfs -mkdir -p /user/hadoop/movies 
[hadoop@dn01 ~]$ hdfs dfs -mkdir -p /user/hadoop/userinfo 

[hadoop@dn01 ~]$ hdfs dfs -ls /user/hadoop 
Found 2 items 
drwxr-xr-x   - hadoop supergroup          0 2021-01-21 01:53 /user/hadoop/movies 
drwxr-xr-x   - hadoop supergroup          0 2021-01-21 01:53 /user/hadoop/userinfo 

 

(2) put 명령어를 사용하여 데이터셋이 있는 리눅스 디렉토리로부터 HDFS 로 파일을 복사한다. 

[hadoop@dn01 ~]$ hdfs dfs -put /home/hadoop/hive_data/ml-100k/u.item /user/hadoop/movies/u.item
[hadoop@dn01 ~]$ hdfs dfs -put /home/hadoop/hive_data/ml-100k/u.user /user/hadoop/userinfo/u.user

 

(3) ls 명령어 사용시 하위 디렉토리까지 보여주는 -R 옵션을 사용하여 각 디렉토리에 파일이 잘 복사되었는지 확인한다. 

[hadoop@dn01 ~]$ hdfs dfs -ls -R /user/hadoop
drwxr-xr-x   - hadoop supergroup          0 2021-01-21 01:56 /user/hadoop/movies
-rw-r--r--   1 hadoop supergroup     236344 2021-01-21 01:56 /user/hadoop/movies/u.item
drwxr-xr-x   - hadoop supergroup          0 2021-01-21 01:56 /user/hadoop/userinfo
-rw-r--r--   1 hadoop supergroup      22628 2021-01-21 01:56 /user/hadoop/userinfo/u.user

 

(+) 현재 소유자그룹이 supergroup 으로 되어 있어서 hadoop 으로 통일시킨다. (안 해도 무방함 )

[hadoop@dn01 ~]$ hdfs dfs -chown -R hadoop:hadoop /user/hadoop
[hadoop@dn01 ~]$ hdfs dfs -ls -R /user/hadoop
drwxr-xr-x   - hadoop hadoop          0 2021-01-21 01:56 /user/hadoop/movies
-rw-r--r--   1 hadoop hadoop     236344 2021-01-21 01:56 /user/hadoop/movies/u.item
drwxr-xr-x   - hadoop hadoop          0 2021-01-21 01:56 /user/hadoop/userinfo
-rw-r--r--   1 hadoop hadoop      22628 2021-01-21 01:56 /user/hadoop/userinfo/u.user

 

(4) 하이브로 접속한다. 

[hadoop@dn01 ~]$ hive

 

(5) 우선 현재 어떤 데이터베이스가 있는지 확인해본다. 

hive (default)> show databases;
OK
default;
kdatademo
sample1
Time taken: 3.554 seconds, Fetched: 3 row(s)

 

(6) 새 데이터베이스를 생성하고 사용하도록 선택한다. 

hive (default)> create database hivedemo;
OK Time taken: 0.158 seconds

hive (default)> use hivedemo;
OK
Time taken: 0.017 seconds

 

(7) 제공된 예제 소스로 movies 테이블을 생성한다. 

    이 때, 텍스트 파일로부터 데이터를 읽을 때

    파이프 연산자로 각 데이터를 구분하여 컬럼에 넣을 수 있도록 미리 포맷을 설정한다. 

 CREATE TABLE movies (
    movie_id INT,
    movie_title STRING,
    release_date STRING,
    video_release_date STRING,
    imdb_url STRING,
    unknown INT,
    action INT,
    adventure INT,
    animation INT,
    children INT,
    comedy INT,
    crime INT,
    documentary INT,
    drama INT,
    fantasy INT,
    film_noir INT,
    horror INT,
    musical INT,
    mystery INT,
    romance INT,
    sci_fi INT,
    thriller INT,
    war INT,
    Western INT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE;

 

(8) movies 테이블이 생성되었는지 확인한다. 

hive (hivedemo)> show tables;
OK
movies
Time taken: 0.027 seconds, Fetched: 1 row(s)

 

(9) HDFS 의 movies 디렉토리에 있는 파일 데이터를 hive 의 movies 테이블로 불러온다. 

hive (hivedemo)> load data inpath '/user/hadoop/movies' into table movies;
Loading data to table hivedemo.movies
OK
Time taken: 0.961 seconds

 

(10) hive 로 데이터 불러오기가 잘 되었는지 영화제목 컬럼 중 애니메이션인 것만 출력하여 확인한다. 

hive (hivedemo)> select movie_title from movies where animation=1;
OK
Toy Story (1995)
Loin King, The (1994)
Aladdin (1992)
....

 

(12) 마찬가지로 HDFS 의 userinfo 디렉토리로부터 불러올 데이터를 저장할 테이블을 생성한다. 

CREATE TABLE userinfo (
movie_id INT,
age INT,
gender STRING,
job STRING,
zip_code STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE;

 

(13) userinfo 테이블이 만들어졌는지 확인한다. 

hive (hivedemo)> show tables;
OK
tab_name
movies
userinfo
Time taken: 0.017 seconds, Fetched: 2 row(s)

 

(14) HDFS 의 userinfo 디렉토리에 있는 파일 데이터를 hive의 userinfo 테이블로 불러온다. 

hive (hivedemo)> load data inpath '/user/hadoop/userinfo' into table userinfo;
Loading data to table hivedemo.userinfo
OK
Time taken: 0.8 seconds

 

(15) 데이터가 잘 불러와졌는지 확인하기 위해 직업이 학생인 사람의 정보만 출력해본다. 

hive (hivedemo)> select * from userinfo where job='student';
OK
userinfo.movie_id       userinfo.age    userinfo.gender userinfo.job    userinfo.zip_code
9       29      M       student 01002
30      7       M       student 55436
32      28      F       student 78741
33      23      M       student 27510
....
Time taken: 0.411 seconds, Fetched: 196 row(s)

또는 count( ) 함수를 사용하여 몇 명인지 출력할 수 있다. ( 연산속도 느림 )

hive (hivedemo)> select count(*) from userinfo where job='student';
...
OK
_c0
196
Time taken: 28.853 seconds, Fetched: 1 row(s)

 


3. 스쿱 개념

 

※ 스쿱

 : RDBMS 와 HDFS 간의 데이터 전송 지원 도구

 : 외부 시스템의 데이터를 HDFS 로 가져오면 Hive 등 에코시스템에서 사용하고 다양한 파일 형태로 저장할 수 있다. 

 : JDBC와 호환되는 DB 에서 사용할 수 있다. 

 

- 하둡 에코 시스템에서 Flume 과 같이 수집용 software 로 많이 사용된다. 

- 다른 시스템에 접근하는 것이므로 권한 문제를 사전에 준비해야 한다. 

 

 

- import 와 export 의 기준은 HDFS 이다. 

 

 

※ 스쿱2 ??

- 버전 2에서는 버전 1의 복잡함을 간소화 시켜서 출시했다. 

- 따라서, 버전 1과 버전 2가 같이 릴리즈 되고 있으며, 버전 1을 아직까지 많이 사용하고 있다. 

 

※ 스쿱 옵션

 

 

 


4. 스쿱 설치하기 

 

 

(1) 스쿱 다운 받기 

    ① dn01 노드에서 root 계정으로 로그인한다. 

[hadoop@dn01 ~]$ su - root
Password:
Last login: Thu Jan 21 01:34:20 UTC 2021 on pts/0

 

    ② tmp 디렉토리로 이동한다. 

[root@dn01 ~]# cd /tmp

 

    ③ wget 을 사용하여 스쿱 설치를 위한 파일을 다운로드한다. 

[root@dn01 tmp]# wget http://mirror.apache-kr.org/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

...
100%[====================================================>] 17,953,604  61.9MB/s   in 0.3s

2021-01-21 03:39:55 (61.9 MB/s) - ‘sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz’ saved [17953604/17953604]

 

    ④ tar 명령어를 사용하여 다운 받은 파일의 압축을 해제한다. 

[root@dn01 tmp]# tar xzvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

 

    ⑤ 파일을 이동시킬 1.4.7 디렉토리를 생성한다. 

[root@dn01 tmp]# mkdir -p /opt/sqoop/1.4.7

 

    ⑥ 압축 해제한 파일을 1.4.7 디렉토리로 모두 이동시킨 뒤 결과를 확인한다. 

[root@dn01 tmp]# mv sqoop-1.4.7.bin__hadoop-2.6.0/* /opt/sqoop/1.4.7/
[root@dn01 tmp]# ls /opt/sqoop/1.4.7/
bin            conf     lib          README.txt             src
build.xml      docs     LICENSE.txt  sqoop-1.4.7.jar        testdata
CHANGELOG.txt  ivy      NOTICE.txt   sqoop-patch-review.py
COMPILING.txt  ivy.xml  pom-old.xml  sqoop-test-1.4.7.jar

 

    ⑦ 1.4.7 디렉토리에 대해 current 라는 이름의 심볼릭링크를 생성하고 결과를 확한다. 

[root@dn01 tmp]# ln -s /opt/sqoop/1.4.7 /opt/sqoop/current
[root@dn01 tmp]# ll /opt/sqoop
total 4
drwxr-xr-x. 9 root root 4096 Jan 21 03:42 1.4.7
lrwxrwxrwx. 1 root root   16 Jan 21 03:43 current -> /opt/sqoop/1.4.7

 


(2) mariaDB 와 Sqoop 을 연결하기 

 

    ① tmp 디렉토리로 이동한 뒤, wget 을 사용하여 mysql connector 를 다운 받는다. 

[root@dn01 tmp]# cd /tmp
[root@dn01 tmp]# wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.38.tar.gz

...
100%[====================================================>] 3,938,241   --.-K/s   in 0.06s

2021-01-21 03:46:17 (60.9 MB/s) - ‘mysql-connector-java-5.1.38.tar.gz.1’ saved [3938241/3938241]

 

    ② tar 명령어를 사용하여 다운 받은 파일의 압축을 해제한다. 

[root@dn01 tmp]# tar xzvf mysql-connector-java-5.1.38.tar.gz

 

    ③ 압축 해제한 mysql-connector-java-5.1.38 디렉토리로 이동한다. 

[root@dn01 tmp]# cd mysql-connector-java-5.1.38
[root@dn01 mysql-connector-java-5.1.38]# ls
build.xml  COPYING  mysql-connector-java-5.1.38-bin.jar  README.txt
CHANGES    docs     README                               src

 

    ④ 압축 해제한 파일을 lib 디렉토리로 이동 시키기

[root@dn01 mysql-connector-java-5.1.38]# mv mysql-connector-java-5.1.38-bin.jar /opt/sqoop/current/lib/

 

    ⑤ 다시 홈 디렉토리로 이동한다. 

[root@dn01 mysql-connector-java-5.1.38]# cd ~

 

    ⑥ lib 디렉토리 내에 mysql-connector-java-5.1.38-bin.jar 파일이 있는지 확인해본다. 

[root@dn01]# ls /opt/sqoop/1.4.7/lib/
ant-contrib-1.0b3.jar          kite-data-hive-1.1.0.jar
ant-eclipse-1.0-jvm1.2.jar     kite-data-mapreduce-1.1.0.jar
avro-1.8.1.jar                 kite-hadoop-compatibility-1.1.0.jar
avro-mapred-1.8.1-hadoop2.jar  mysql-connector-java-5.1.38-bin.jar
....

 


(3) 스쿱 디렉토리에 대한 소유자를 hadoop 계정으로 변경한다. 

[root@dn01 ~]# chown -R hadoop:hadoop /opt/sqoop/
[root@dn01 ~]# ll /opt/sqoop/
total 4
drwxr-xr-x. 9 hadoop hadoop 4096 Jan 21 03:42 1.4.7
lrwxrwxrwx. 1 hadoop hadoop   16 Jan 21 03:43 current -> /opt/sqoop/1.4.7

 


(4) 하둡 계정에서 환경 변수 설정하기 

 

    ① hadoop 계정으로 변경한다. 

[root@dn01 ~]# su - hadoop
Last login: Thu Jan 21 01:36:40 UTC 2021 on pts/0

 

    ② vi 에디터로 . bash_profile 파일을 연 뒤, $SQOOP_HOME 에 대한 환경변수를 추가한다. 

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

 

#### SQOOP 1.4.7 ######################
    export SQOOP_HOME=/opt/sqoop/current
    export PATH=$PATH:$SQOOP_HOME/bin
#### SQOOP 1.4.7 ######################

 

 

    ③ source 명령어를 사용하여 환경변수의 변경사항을 적용한다. 

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

 

    ④ $SQOOP_HOME 환경변수가 적용되었는지 확인한다. 

[hadoop@dn01 ~]$ cd $SQOOP_HOME
[hadoop@dn01 current]$ pwd
/opt/sqoop/current

 


(5) 스쿱 환경설정

 

    ① $SQOOP_HOME 의 cof 디렉토리로 이동 후 하위 파일들 중에 template 파일이 있는지 확인한다. 

[hadoop@dn01 ~]$ cd $SQOOP_HOME/conf

[hadoop@dn01 conf]$ pwd
/opt/sqoop/current/conf

[hadoop@dn01 conf]$ ls
oraoop-site-template.xml  sqoop-env-template.sh    sqoop-site.xml
sqoop-env-template.cmd    sqoop-site-template.xml

 

    ② 템플릿으로부터 sqoop-env.sh 파일을 생성한다. 

[hadoop@dn01 conf]$ cp sqoop-env-template.sh sqoop-env.sh
[hadoop@dn01 conf]$ ls
oraoop-site-template.xml  sqoop-env-template.cmd  sqoop-site-template.xml
sqoop-env.sh              sqoop-env-template.sh   sqoop-site.xml

 

    ③ vi 에디터로 sqoop-env.sh 파일을 열고 하단에 스크립트를 추가한다. 

[hadoop@dn01 ~]$ vi sqoop-env.sh

 

export HADOOP_COMMON_HOME=/opt/hadoop/current
export HADOOP_MAPRED_HOME=/opt/hadoop/current
export HIVE_HOME=/opt/hive/current

 

 


(6) 스쿱 버전을 확인하여 Sqoop 1.4.7 이라고 출력되는지 확인한다. 

[hadoop@dn01 ~]$ sqoop-version
...
Sqoop 1.4.7
git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8
Compiled by maugli on Thu Dec 21 15:59:58 STD 2017

 


(7) 스쿱 라이브러리를 하둡으로 복사하기

 

    ① $SQOOP_HOME 으로 이동한 뒤, pwd 명령어로 현재 디렉토리 확인 및 ls 명령어로 하위 폴더를 조회한다. 

[hadoop@dn01 ~]$ cd $SQOOP_HOME

[hadoop@dn01 current]$ pwd
/opt/sqoop/current

[hadoop@dn01 current]$ ls
bin            conf     lib          README.txt             src
build.xml      docs     LICENSE.txt  sqoop-1.4.7.jar        testdata
CHANGELOG.txt  ivy      NOTICE.txt   sqoop-patch-review.py
COMPILING.txt  ivy.xml  pom-old.xml  sqoop-test-1.4.7.jar
[hadoop@dn01 current]$

 

    ② 현재 디렉토리 내의 sqoop-1.4.7.jar 라이브러리 파일을 lib 디렉토리로 복사한다. 

[hadoop@dn01 current]$ cp sqoop-1.4.7.jar /opt/hadoop/current/share/hadoop/tools/lib/

 


5. RDBMS 의 데이터를 SQOOP 을 사용하여 HDFS 로 전송하기 

    : 쉘 프로그램을 사용하면 보다 수월하게 작업할 수 있다. 

 

 

(1) RDBMS 에 데이터 생성하기 ( mariaDB 사용 )

 

    ① 홈 디렉토리로 이동한다. 

[hadoop@dn01 current]$ cd ~

 

    ② mariaDB 가 active 상태인지 확인한다. 

[hadoop@dn01 ~]$ systemctl status mariadb.service
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2021-01-21 01:05:15 UTC; 2h 59min ago

 

    ③ mariaDB 에 접속한다. 

[hadoop@dn01 ~]$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 83
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

 

    ④ sqoopdemo 라는 이름의 새 데이터베이스를 생성한다.  

MariaDB [(none)]> create database sqoopdemo;
Query OK, 1 row affected (0.00 sec)

 

    ⑤ sqooopdemo 데이터베이스를 사용하도록 변경한다. 

MariaDB [(none)]> use sqoopdemo;
Database changed

 

    ⑥ departments 테이블을 생성한다. 

CREATE TABLE departments (
    department_id  INT(11) unsigned NOT NULL,
    department_name VARCHAR(32) NOT NULL,
    PRIMARY KEY (department_id)
);

 

    ⑦ show tables 명령어로 테이블이 생성되었는지 확인한다. 

MariaDB [(sqoopdemo)]> show tables;
+---------------------+
| Tables_in_sqoopdemo |
+---------------------+
| departments         |
+---------------------+
1 row in set (0.00 sec)

 

    ⑧ departments 테이블에 데이터를 입력한다. 

insert into departments (department_id, department_name) VALUES
(1, 'Fitness'),
(2, 'Footwear'),
(3, 'Apparel'),
(4, 'Golf'),
(5, 'Outdoors'),
(6, 'Fan Shop');

 

    ⑨ 테이블 전체를 출력하여 테이터가 들어갔는지 확인한다. 

MariaDB [(sqoopdemo)]> select * from departments;
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
|             1 | Fitness         |
|             2 | Footwear        |
|             3 | Apparel         |
|             4 | Golf            |
|             5 | Outdoors        |
|             6 | Fan Shop        |
+---------------+-----------------+
6 rows in set (0.00 sec)

 


(2) SQOOP 을 사용하여 mariaDB 의 데이터에 접근하기

 

    ① hadoop 계정의 홈 디렉토리로 이동한다.

 

    ② 스쿱 명령어를 사용하여 mariaDB에 저장한 데이터베이스를 출력할 수 있다. 

[hadoop@dn01 ~]$ sqoop list-databases --connect jdbc:mysql://dn01 --username hive --password hive
information_schema
hive
mysql
performance_schema
sqoopdemo
test

 

    ③ mariaDB 에 저장한 테이블도 출력할 수 있다. 

        테이블까지 확인할 때는 노드명, 포트번호, database 이름까지 기술하여 connect 해야 한다. 

        mariaDB 에 테이블 생성 시 root 계정을 사용했지만 조회가 가능하다. 

[hadoop@dn01 ~]$ sqoop list-tables --connect jdbc:mysql://dn01:3306/sqoopdemo --username hive --password hive
departments

 


(3) SQOOP 을 사용하여 mariaDB 의 데이터를 HDFS로 import 하기

 

※ 가져와야 할 departments 테이블 데이터

MariaDB [sqoopdemo]> select * from departments;
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
|             1 | Fitness         |
|             2 | Footwear        |
|             3 | Apparel         |
|             4 | Golf            |
|             5 | Outdoors        |
|             6 | Fan Shop        |
+---------------+-----------------+

 

    ① sqoop 명령어를 사용하여 departments 테이블의 데이터를 HDFS 로 import 한다. 

 

[hadoop@dn01 ~]$ sqoop import --connect jdbc:mysql://dn01:3306/sqoopdemo --table departments --username hive --password hive

...
21/01/21 05:49:44 INFO mapreduce.ImportJobBase: Retrieved 6 records.

 

    ② HDFS 에 데이터가 import 되었는지 확인해보면

        기존에 없던 departments 디렉토리가 생성되었음을 확인할 수 있다. 

[hadoop@dn01 ~]$ hdfs dfs -ls /user/hadoop
Found 3 items
drwxr-xr-x   - hadoop hadoop          0 2021-01-21 05:49 /user/hadoop/departments
drwxr-xr-x   - hadoop hadoop          0 2021-01-21 02:13 /user/hadoop/movies
drwxr-xr-x   - hadoop hadoop          0 2021-01-21 02:53 /user/hadoop/userinfo

 

    ③ departments 디렉토리 내에 4개의 분산처리된 파일이 존재한다. 

[hadoop@dn01 ~]$ hdfs dfs -ls /user/hadoop/departments
Found 5 items
-rw-r--r--   1 hadoop hadoop          0 2021-01-21 05:49 /user/hadoop/departments/_SUCCESS
-rw-r--r--   1 hadoop hadoop         21 2021-01-21 05:49 /user/hadoop/departments/part-m-00000
-rw-r--r--   1 hadoop hadoop         10 2021-01-21 05:49 /user/hadoop/departments/part-m-00001
-rw-r--r--   1 hadoop hadoop          7 2021-01-21 05:49 /user/hadoop/departments/part-m-00002
-rw-r--r--   1 hadoop hadoop         22 2021-01-21 05:49 /user/hadoop/departments/part-m-00003

 

    ④ cat 명령어를 사용하여 각 파일에 들어있는 데이터를 출력하여 mariaDB 와 같은 데이터인지 확인한다. 

[hadoop@dn01 ~]$ hdfs dfs -cat /user/hadoop/departments/part-m-00000
1,Fitness
2,Footwear
[hadoop@dn01 ~]$ hdfs dfs -cat /user/hadoop/departments/part-m-00001
3,Apparel
[hadoop@dn01 ~]$ hdfs dfs -cat /user/hadoop/departments/part-m-00002
4,Golf
[hadoop@dn01 ~]$ hdfs dfs -cat /user/hadoop/departments/part-m-00003
5,Outdoors
6,Fan Shop

        cat 명령어 사용시 공통된 파일명 마지막에 asterisk * 를 사용하여 한 번에 출력할 수도 있다. 

[hadoop@dn01 ~]$ hdfs dfs -cat /user/hadoop/departments/part-m-0000*
1,Fitness
2,Footwear
3,Apparel
4,Golf
5,Outdoors
6,Fan Shop

 


(4) mariaDB 에서 기존에 있던 테이블 구조를 복제하여 데이터가 없는 빈 테이블 생성하기

 

    ① mariaDB 에 접속한다. 

[hadoop@dn01 ~]$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 113
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

 

    ② sqoopdemo 데이터테이블을 사용한다. 

MariaDB [(none)]> use sqoopdemo
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 [sqoopdemo]> show tables;
+---------------------+
| Tables_in_sqoopdemo |
+---------------------+
| departments         |
+---------------------+
1 row in set (0.00 sec)

 

    ③ like 를 사용하여 departments 테이블처럼 구조를 갖는 dept 테이블을 생성한다. 

MariaDB [sqoopdemo]> create table dept like departments;
Query OK, 0 rows affected (0.00 sec)

 

    ④ desc 명령어를 사용하여 두 테이블 구조가 동일함을 확인할 수 있다. 

MariaDB [sqoopdemo]> desc departments;
+-----------------+------------------+------+-----+---------+-------+
| Field           | Type             | Null | Key | Default | Extra |
+-----------------+------------------+------+-----+---------+-------+
| department_id   | int(11) unsigned | NO   | PRI | NULL    |       |
| department_name | varchar(32)      | NO   |     | NULL    |       |
+-----------------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

MariaDB [sqoopdemo]> desc dept;
+-----------------+------------------+------+-----+---------+-------+
| Field           | Type             | Null | Key | Default | Extra |
+-----------------+------------------+------+-----+---------+-------+
| department_id   | int(11) unsigned | NO   | PRI | NULL    |       |
| department_name | varchar(32)      | NO   |     | NULL    |       |
+-----------------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

 

  ⑤ dept 테이블 전체를 출력했을 때 데이터가 들어있지 않은 빈 테이블이 생성되었음을 확인할 수 있다. 

MariaDB [sqoopdemo]> select * from dept;
Empty set (0.00 sec)

 


(5) SQOOP 을 사용하여 HDFS의 데이터를 mariaDB로 export 하기

 

    ① mariaDB의 dept 테이블이 현재 비어있는지 확인한다.

MariaDB [sqoopdemo]> select * from dept2;
Empty set (0.00 sec)

 

    ② sqoop 명령어를 사용하여 HDFS 의 데이터를 mariaDB 의 빈 dept 테이블로 export 한다. 

[hadoop@dn01 ~]$ sqoop export --connect jdbc:mysql://dn01:3306/sqoopdemo --table dept --username hive --password hive --export-dir departments

....
21/01/21 06:11:46 INFO mapreduce.ExportJobBase: Exported 6 records.

 

    ③ mariaDB 에 접속하여 dept 테이블 전체를 출력하면 데이터가 입력되었음을 확인할 수 있다. 

MariaDB [sqoopdemo]> select * from dept;
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
|             1 | Fitness         |
|             2 | Footwear        |
|             3 | Apparel         |
|             4 | Golf            |
|             5 | Outdoors        |
|             6 | Fan Shop        |
+---------------+-----------------+
6 rows in set (0.00 sec)

 

 


6. 제플린 설치 ( zeppelin )

 

 ※ 데이터 분석을 위한 웹 기반 노트북이자 시각화 툴

 

 - 데이터 처리 / 데이터 검색 / 데이터 분석 / 데이터 시각화 및 협업 가능

 

(1) 제플린 다운로드 

    ① dn01 노드의 root 계정 로그인 후 tmp 디렉토리로 들어간다. 

[hadoop@dn01 tmp]$ su - root
Password:
Last login: Thu Jan 21 03:38:50 UTC 2021 on pts/0
[root@dn01 ~]# cd /tmp
[root@dn01 tmp]# pwd
/tmp

 

    ② wget 명령어를 사용하여 제플린 0.8.2 버전을 다운 받는다. 

[root@dn01 tmp]#  wget http://apache.mirror.cdnetworks.com/zeppelin/zeppelin-0.8.2/zeppelin-0.8.2-bin-all.tgz

....
Saving to: ‘zeppelin-0.8.2-bin-all.tgz’

100%[====================================================>] 998,508,624 54.8MB/s   in 13s

2021-01-21 11:43:15 (75.9 MB/s) - ‘zeppelin-0.8.2-bin-all.tgz’ saved [998508624/998508624]

 

    ③ 압축 푼 파일을 옮길 0.8.2 디렉토리를 생성하되, 그 부모도 함께 만들어지도록 옵션 -p 를 추가한다. 

[root@dn01 tmp]# mkdir -p /opt/zeppelin/0.8.2
[root@dn01 tmp]# ls /opt/zeppelin
0.8.2

 

    ④ 압축 해제한 파일들을 0.8.2 디렉토리로 옮긴다. 

[root@dn01 tmp]# mv zeppelin-0.8.2-bin-all/* /opt/zeppelin/0.8.2/
[root@dn01 tmp]# ls /opt/zeppelin/0.8.2/
bin   interpreter  LICENSE   notebook  README.md
conf  lib          licenses  NOTICE    zeppelin-web-0.8.2.war

 

    ⑤ 0.8.2 디렉토리에 current 라는 이름의 심볼릭링크를 생성한다. 

[root@dn01 tmp]# ln -s /opt/zeppelin/0.8.2 /opt/zeppelin/current

 

    ⑥ zeppelin 디렉토리와 그 하위 파일들의 소유자를 hadoop 계정으로 변경한다. 

[root@dn01 ~]# chown -R hadoop:hadoop /opt/zeppelin

[root@dn01 tmp]# ll /opt/zeppelin/0.8.2
total 29432
drwxr-xr-x.  2 hadoop hadoop      249 Jan 21 11:46 bin
drwxr-xr-x.  2 hadoop hadoop      241 Jan 21 11:46 conf
drwxr-xr-x. 26 hadoop hadoop     4096 Jan 21 11:46 interpreter
drwxr-xr-x.  4 hadoop hadoop     8192 Jan 21 11:46 lib
-rw-r--r--.  1 hadoop hadoop    61704 Sep 26  2019 LICENSE
drwxr-xr-x.  2 hadoop hadoop     4096 Jan 21 11:46 licenses
drwxr-xr-x.  8 hadoop hadoop      108 Jan 21 11:46 notebook
-rw-r--r--.  1 hadoop hadoop     5620 Sep 26  2019 NOTICE
-rw-r--r--.  1 hadoop hadoop     1325 Sep 26  2019 README.md
-rw-r--r--.  1 hadoop hadoop 30036217 Sep 26  2019 zeppelin-web-0.8.2.war

 


(2) 환경변수 추가

 

① hadoop 계정으로 로그인한다. 

[root@dn01 tmp]# su - hadoop
Last login: Thu Jan 21 06:05:17 UTC 2021 from 192.168.56.103 on pts/1

 

② vi 에디터로 . bash_profile 을 연 뒤 $ZEPPELIN_HOME 환경변수를 추가한다. 

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

 

#### zeppelin ######################
export ZEPPELIN_HOME=/opt/zeppelin/current
export PATH=$PATH:$ZEPPELIN_HOME/bin
#### zeppelin  ######################

 

 

③ source 명령어로 환경변수를 적용한다. 

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

(3) 환경설정 변경

 

    ① zeppelin 디렉토리 내의 conf 디렉토리로 이동한다. 

[hadoop@dn01 ~]$ cd /opt/zeppelin/current/conf

 

    ② 템플릿 파일로부터 xml, ini, sh 파일을 생성한다. 

[hadoop@dn01 conf]$ cp zeppelin-site.xml.template zeppelin-site.xml
[hadoop@dn01 conf]$ cp shiro.ini.template shiro.ini
[hadoop@dn01 conf]$ cp zeppelin-env.sh.template zeppelin-env.sh

 

    ③ vi 에디터로 zeppelin-site.xml 파일을 연 뒤, 속성을 변경한다. 

<property>
<name>zeppelin.server.addr</name>
<value>192.168.56.102</value>
<description>Server address</description>
</property>

<property>
<name>zeppelin.server.port</name>
<value>8082</value>
<description>Server port.</description>
</property>

<property>
<name>zeppelin.anonymous.allowed</name>
<value>false</value>
<description>Anonymous user allowed by default</description>
</property>

 

 

    ④ vi 에디터로 shiro.ini 파일을 연 뒤, 계정 정보를 추가한다. 

 

    ⑤ vi 에디터로 zeppelin-env.sh 파일을 연 뒤, 환경변수를 추가한다. 

export HADOOP_CONF_DIR=/opt/hadoop/current/etc/hadoop
export JAVA_HOME=/opt/jdk/current

# 스파크설치된 경우는 아래도 세팅
#export SPARK_HOME=/opt/spark/current
#export SPARK_CONF_DIR=/opt/spark/current/conf
#export PYTHONPATH=/home/hadaoop/anaconda3/bin/python3
#export PYSPARK_PYTHON=/home/hadoop/anaconda3/bin/python3

 

 


(4) 제플린 실행

 

    ① nn01 노드에서 하둡이 구동중이라면 정지 후 재시작한다. 

[hadoop@nn01 ~]$ stop-all.sh
[hadoop@nn01 ~]$ start-all.sh
[hadoop@nn01 ~]$ jps

 

    ② dn01 노드에서 mariaDB 서비스가 active 인지 확인한다. 아닐 경우에는 재시작을 해준다. 

[hadoop@dn01 ~] systemctl status mariadb.service
[hadoop@dn01 ~] systemctl restart mariadb.service

 

    ③ 메타스토어와 하이브 서버를 백그라운드에서 구동한다. 

[hadoop@dn01 ~] hive --service metastore &
[hadoop@dn01 ~] hive --service hiveserver2 &

 

    ④ 제플린 interpreter 에 hive jdbc library 를 복사한다. 

[hadoop@dn01 ~] cp /opt/hive/current/jdbc/hive-jdbc-2.3.8-standalone.jar   /opt/zeppelin/current/interpreter/jdbc/

 

 

    ⑤ 제플린 실행 파일 위치를 확인한다.

        / opt / zeppelin / 0.8.2 / bin / 

[hadoop@dn01 ~]$ cd /opt/zeppelin/0.8.2/bin
[hadoop@dn01 bin]$ ls
common.cmd     functions.sh            interpreter.sh       zeppelin-daemon.sh
common.sh      install-interpreter.sh  stop-interpreter.sh  zeppelin.sh
functions.cmd  interpreter.cmd         zeppelin.cmd

 

    ⑥ 실행파일이 있는 디렉토리에서 제플린 서버를 백그라운드로 구동한다. 

[hadoop@dn01 bin]$ ./zeppelin.sh &

 

    ⑦ 정상적으로 실행되었는지 프로세스를 확인한다. 

[hadoop@dn01 bin]$ ps -ef |grep zeppelin
hadoop   11498  6058  1 13:14 pts/0    00:00:08 /opt/jdk/current/bin/java -Dfile.encoding=UTF-8 -Xms1024m -Xmx1024m -XX:MaxPermSize=512m -Dlog4j.configuration=file:///opt/zeppelin/0.8.2/conf/log4j.properties -Dzeppelin.log.file=/opt/zeppelin/0.8.2/logs/zeppelin-hadoop-dn01.log -cp :.:/opt/jdk/current/lib:/lib:/opt/hive/current/lib:/opt/zeppelin/0.8.2/lib/interpreter/*:/opt/zeppelin/0.8.2/lib/*:/opt/zeppelin/0.8.2/*::/opt/zeppelin/0.8.2/conf:/opt/hadoop/current/etc/hadoop org.apache.zeppelin.server.ZeppelinServer
hadoop   11572  6058  0 13:26 pts/0    00:00:00 grep --color=auto zeppelin

 

 

 


(5) 제플린 접속하기

 

    ① 브라우저로 http://192.168.56.102:8082 에 접속한다. (로그인 계정은 admin // admin )

 

    ② 제플핀 웹 페이지 우측의 'admin' > 'Interpreter' 를 클릭한다. 

 

    ③ jdbc 의 Properties 를 변경한다. 

default driver = org.apache.hive.jdbc.HiveDriver
default url = jdbc:hive2://192.168.56.102:10000
default.user = hive
default.password = hive

 

    ④ 노트 생성시 Default Interpreter 를 jdbc 로 선택한다. 

 

    ⑤ show databases 입력 후 mariaDB의 데이터베이스가 정상적으로 조회되는지 확인한다. 

 

 

반응형

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

Day72  (0) 2021.01.25
Day71  (0) 2021.01.22
Day69  (0) 2021.01.20
Day68  (0) 2021.01.19
Day67  (0) 2021.01.18