지구정복
[Sqoop] Sqoop 설치 및 MySQL과 Import, Export하기 본문
pc환경은 다음과 같다.
-오라클버추얼박스 5.2.44
-CentOS 7 리눅스 서버 4대(주키퍼, 하둡, 하이브 설치상태)
-하이브가 설치되어있는 서버 2에 설치예정
항상 설치전에는 버추얼박스에서 각 서버에 대한 스냅샷을 찍어놓자!!!!
1. 설치
아래 사이트 클릭
아래 다운로드 클릭
아래 클릭
링크주소를 복사한다.
그리고 설치를 할 서버에서 아래 명령어 실행한다.
wget http://mirror.navercorp.com/apache/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
그리고 압축을 푼다.
tar -xvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
그리고 심볼릭 링크를 설정한다.
ln -s sqoop-1.4.7.bin__hadoop-2.6.0 sqoop
이제 서버2의 계정에 스쿱사용에 대한 환경변수 설정을 해준다.
-참고-
/etc/profile : 부팅시 적용되는 파일 (root)
/home/사용자계정/.bash_profile : 각 계정에 로그인할 때 로드
/home/사용자계정/.bashrc : 로그인 한 상태에서 터미널을 열면 실행
vi ~/.bashrc
아래 표시한 부분만 적어준다. 나머지 환경변수는 각자마다 다를 것이다.
export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/home/hadoop01/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export SQOOP_HOME=/home/hadoop01/sqoop
export SQOOP_CONF_DIR=$SQOOP_HOME/conf
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$SQOOP_HOME/bin
수정한 환경변수 적용시킨다.
source ~/.bashrc
이제 스쿱 설정파일에 하둡관련 설정을 추가해야 한다.
sqoop-env.sh 수정
예시파일을 복사해서 만든다.
cp sqoop/conf/sqoop-env-template.sh sqoop/conf/sqoop-env.sh
해당 디렉토리로 이동
cd sqoop/conf/
sqoop-env.sh수정한다.
vi sqoop-env.sh
나는 하둡이 /home/hadoop01/hadoop에 있고 하이브는 /home/hadoop01/hive에 있다.
export HADOOP_HOME=/home/hadoop01/hadoop
export HADOOP_COMMON_HOME=/home/hadoop01/hadoop
export HADOOP_MAPRED_HOME=/home/hadoop01/hadoop
export HIVE_HOME=/home/hadoop01/hive
이제 스쿱과 연동할 DBMS의 연결 드라이버를 다운받아야한다.
나는 MySQL과 연동을 할 예정이다.
아래 명령어 db 커넥터 다운로드
wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.46.tar.gz
tar파일을 풀어준다.
tar -xvf mysql-connector-java-5.1.46.tar.gz
그리고 폴더로 들어가서 jar 파일을 스쿱의 lib디렉토리로 옮겨준다.
cd mysql-connector-java-5.1.46/
mv mysql-connector-java-5.1.46-bin.jar /home/hadoop01/sqoop/lib/
이제 스쿱의 jar파일을 하둡lib디렉토리에 복사시켜준다.
cd
cd sqoop
cp sqoop-1.4.7.jar /home/hadoop01/hadoop/share/hadoop/tools/lib/
그리고 아래 사이트에 가서 commons-lang-2.6-bin.tar.gz이란 jar파일을 다운받는다.
이 파일이 없으면 sqoop import 수행 시, java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils 발생한다.
http://commons.apache.org/proper/commons-lang/download_lang.cgi
우클릭후 링크주소복사
터미널에서 아래 명령어 입력
cd
wget https://mirror.navercorp.com/apache//commons/lang/binaries/commons-lang-2.6-bin.tar.gz
tar -xvf commons-lang-2.6-bin.tar.gz
cd commons-lang-2.6
그리고 commons-lang-2.6.jar 파일을 ~/sqoop/lib 디렉토리로 복사해준다.
cp commons-lang-2.6.jar /home/hadoop01/sqoop/lib
그리고 해당 디렉토리로 가서 겹치는 기존 파일의 이름을 바꿔준다.
cd /home/hadoop01/sqoop/lib/
ll common*
mv commons-lang3-3.4.jar commons-lang3-3.4.jar.bak
계속 그리고이지만
할 게 더 남았다.ㅎㅎ
나의 경우 자꾸 3306 포트 사용중이라고해서 밑에 스쿱과 mysql 연동이 안되었다.
원래 mysql 기본 포트번호가 3306인데 3307로 미리 바꿔준다.
바꿔주지 않으면 3306포트에 접속할 수 없다는 에러가 뜬다..
루트 계정으로 로그인
su - root
비번
mysql 설정파일 수정
vi /etc/my.cnf
port=3307
그리고 mysql 프로세스를 재구동해줘야한다.
systemctl restart mysqld
정말 마지막으로 이따가 sqoop에서 mysql 로 접속할 mysql사용자를 만들고 권한을 주어야 한다.
만약 권한이 없으면 해당 사용자가 DB에 접속할 권한이 없다는 에러가 뜬다.
mysql에 root로 접속한다.
mysql -u root -p
현재 유저를 보는명령어는 아래와 같다.
use user;
select user, host from user;
그리고 사용자를 만든다. %는 모든 외부접속을 허용한다는 뜻이다. 보통 저기에 localhost를 적는다. 근데 우리는
외부에서 'hive' 라는 계정으로 접속을 해야 되므로 모든 외부접속이 가능하게끔 한다.
create user 'hive'@'%' identified by '비밀번호';
이때 비밀번호가 무슨 정책에 맞지 않는다고하면 두 가지 방법이 있다.
첫 번째는 아예 정책 plugin을 삭제하는 방법
두 번째는 비밀번호 정책을 수정하는 방법
그냥 정책을 삭제해버린다.
uninstall plugin validate_password;
계정을 만들었으면 권한을 부여한다.
grant 권한이름(select, insert, update 등등) privileges on DB이름.테이블이름 to '계정'@'ip주소';
의 형식인데 아래처럼 입력한다. 모든 권한과 모든 DB, 모든 Table에 대해서 권한을 줘버린다.
grant all privileges on *.* to 'hive'@'%';
그리고 항상 사용자를 만들거나 수정, 권한 등을 변경하고 나서는 flush 명령어를 실행한다. 그렇지 않으면 변경사항 적용이 안된다.
flush privileges;
그리고 조금 이따가 import할 데이터베이스와 테이블을 미리 만들어준다.
create database test;
use test;
create table dept(
deptno int(10) not null,
deptname varchar(30) not null
)
insert into dept values( 1, 'aaa');
insert into dept values( 2, 'bbb');
insert into dept values( 3, 'ccc');
insert into dept values( 4, 'ddd');
insert into dept values( 5, 'eee');
insert into dept values( 6, 'fff');
select * from dept;
이제 빠져나와서 스쿱 명령어를 간단하게 쳐본다.
sqoop help
에러 안나면 스쿱은 잘 설치가 된 것이다.
로그 중에 무슨 hbase, zookeeper, 어쩌고저쩌고 하는데 이는 어큐물로 및 HBase연동을 위한 주키퍼 경로가 설정돼 있지 않다는 그냥 경고 메세지이다. 스쿱은 하둡경로만 잘 설정되어 있으면 기본적인 기능들은 문제없이 실행된다.
이제 정말로 준비가 다 된 것 같다...나는 여기까지 오는데 여러번의 삽질이 있었다.
하둡에코시스템들을 수동설치하는 것은 너무나 고된 일이다...정말..
2. 데이터베이스 리스트 확인 및 import하기
먼저 잘 연결이 되는지 확인하기 위해서
MySQL의 테이블을 스쿱에서 출력해보자.
sqoop list-databases --connect jdbc:접속할DB이름://ip주소:포트번호 --username DB에접속하는계정명 --P
--P는 비밀번호를 따로 입력하겠다는 의미이다.
그리고 ip주소같은 경우 나는 192.168.56.121가 hadoop02으로 설정되어 있어서 바로 hadoop02로 썼다.
sqoop list-databases --connect jdbc:mysql://hadoop02:3307 --username hive --P
information_schema
metastore
mysql
performance_schema
sys
test
이제 대망의 import를 시켜보자. hdfs에 mysql에 있는 테이블을 저장하기 위해 하둡을 미리 구동시킨다.
아래 import명령어를 입력한다.
sqoop import --connect jdbc:mysql://hadoop02:3307/test --table dept --target-dir /user/hadoop01/mysql_table --username hive --P -m 1
여기서 --tabel은 어떤 테이블을 가져올 건지 명시하는 곳이다.
--target-dir은 어디에 저장시킬 지를 명시한다. 나는 하둡 저장소에 저장시킨다. 또한 이미 존재하는 디렉토리를 쓰면 에러난다.
맨 뒤에 -m 1은 맵리듀스의 매퍼를 몇 개 실행시킬 지 적는 것이다. 매퍼수를 지정해서 하둡의 처리속도를 향상시킬 수 있다.
아무 에러없이 작업이 끝나면 hdfs에 잘 들어갔는지 확인한다.
hdfs dfs -cat /user/hadoop01/mysql_table/part-m-00000
1,aaa
2,bbb
3,ccc
4,ddd
5,eee
6,fff
3. export하기
미리 mysql에 테이블을 만들어준다. hdfs에 저장되어있는 테이블값이 들어갈 수 있게 만들어줘야 한다.
create table dept2(
deptno int(10) not null,
deptname varchar(10) not null
);
그리고 hdfs에 방금 import시킨 dept 테이블을 export해서 dept2 테이블에 넣어보자.
sqoop export --connect jdbc:mysql://hadoop02:3307/test --table dept2 --export-dir /user/hadoop01/mysql_table/part-m-00000 --username hive --P
--table에는 데이터가 집어넣어질 mysql의 테이블명을 적는다.
--export-dir은 hdfs의 테이블 파일이 있는 경로를 적어준다.
에러가 없이 성공하면 mysql에 접속해서 데이터가 잘 들어갔는지 확인한다.
아래처럼 dept2 테이블에 6개의 데이터가 잘 들어간 것을 확인할 수 있다.
mysql> select * from dept2;
+--------+----------+
| deptno | deptname |
+--------+----------+
| 1 | aaa |
| 2 | bbb |
| 5 | eee |
| 3 | ccc |
| 4 | ddd |
| 6 | fff |
+--------+----------+
6 rows in set (0.00 sec)
스쿱이 정상작동하니깐 버추얼박스에 또 다시 스냅샷을 찍어주자!! 스냅샷은 필수
끝~
'데이터 엔지니어링 정복 > Sqoop' 카테고리의 다른 글
[Sqoop] Sqoop 개념, 구성요소, 아키텍처 (0) | 2021.05.11 |
---|