하둡프로그래밍
#
Find similar titles
- 최초 작성자
-
최근 업데이트
nwchoi@insilicogen.com
Structured data
- Category
- Big Data
Table of Contents
개요 #
더그 커팅의 아들이 노란 코끼리 인형을 하둡(Hadoop)이라 불러 하둡(Hadoop)으로 이름 지어졌다 (출처)
하둡(Hadoop)설치 에 앞서 하둡(Hadoop)은 빅데이터에 대한 신문 기사 등을 보면 하둡(Hadoop)이 함께 등장하고 IT분야에 몸담고 있는 사람들은 대부분 빅데이터 하면 하둡을 떠올릴 정도인 하둡(Hadoop)은 더그 커팅(Doug Cutting)이 2005년 구글이 논문으로 발표 GFS(Google File System)와 맵리듀스(MapReduce)를 대용량 데이터를 분산 처리할 수 있는 자바 기반의 오픈소스 프레임워크로 구현한 결과물이다. 하둡(Hadoop)은 분산 파일 시스템인 HDFS(Hadoop Distributed File System)에 데이터를 저장, 분산 처리 시스템인 맵리듀스를 이용해 데이터를 처리한다. 하둡(Hadoop)이 빅 데이터에서 주목받게 된 이유는 이 한 가지 예를 보면 충분히 이해되리라 생각된다. 2008년 뉴욕 타임스에서 130년 분량의 신문기사 1,100만 페이지를 아마존 EC2, S3, 그리고 이 하둡(Hadoop)을 이용해 하루 만에 PDF로 변환하는 데 성공한 사례이다. 이 엄청난 작업은 당시 일반적인 서버로 진행했을 경우 약 14년이 소요되는 작업량이었다. 그럼 이러한 작업을 가능하게 한 하둡 설치 과정을 알아보도록 하자.
하둡 배포판 #
리눅스에도 다양한 배포판이 존재하듯 하둡(Hadoop)에도 다양한 배포판이 출시되고 있다. 주요 하둡(Hadoop) 배포판에 대해 간략하게 알아보도록 한다.
- Cloudera(클라우데라)
- 명칭 : CDH(Cloudera's Distribution for Apache Hadoop)
- 특징
- 클라우데라가 배포, 하둡 에코시스템(Hadoop-Echosystem) 이 포함.
- 하둡(Hadoop)의 맵리듀스 프레임워크를 별도로 제공.
- 다운로드 URL : CDH
- Hortonworks(호튼웍스)
- 명칭 : HDP(Hortonworks Data Platform)
- 특징
- CDH와 차별화 전략으로 아파치 배포판을 중심으로 구성.
- 암바리(Ambari)를 이용해 설치 및 하둡 에코시스템(Hadoop-Echosystem) 관리를 편리하게 수행
- 다운로드 URL : HDP
- MapR Technologies(MapR 테크놀로지스
- 명칭 : MapR EDTITIONS
- 특징
- MapR은 성능 개선을 위해 자바에 C언어를 더함.
- 다운로드 URL : MapR EDITIONS
설치 #
(출처)
설치하기에 앞서 어떤 방식으로 하둡(Hadoop)을 시행할지 결정해야 한다.
- 독립 실행(Stand alone) 모드
- 하둡의 기본 실행 모드이다. 하둡(Hadoop) 환경설정 파일에 아무런 설정을 하지 않고 실행하면 로컬 장비에서만 실행되기 때문에 로컬 모드라고도 한다. 하둡(Hadoop)에서 제공하는 데몬을 구동하지 않기 때문에 분산 환경을 고려한 테스트는 불가능하다. 단순히 맵리듀스 프로그램을 개발하고, 해당 맵리듀스를 디버깅하는 용도로만 적합한 모드이다.
- 가상 분산(Pseudo-distributed)모드
- 하나의 장비에 모든 하둡(Hadoop) 환경설정을 하고, 하둡(Hadoop) 서비스도 이 장비에서만 제공하는 방식을 말한다. HDFS와 맵리듀스와 관련된 데몬을 하나의 장비에서만 실행하게 된다. 주로 하둡(Hadoop)을 처음 공부하는 이들이 이와 같은 방식으로 테스트 환경을 구성한다.
- 완전 분산(Fully distributed) 모드
- 여러 대의 장비에 하둡(Hadoop)이 설치된 경우. 하둡(Hadoop)으로 라이브 서비스를 하게 될 때 이와 같은 방식으로 구성한다.
본 글에서는 가상 분산 모드 방식으로 설치를 진행한다.
가상머신 다운로드 #
VMware Workstation Pro 다운로드 링크를 통해 VMware 를 다운받고 체험판으로 설치를 진행한다. Multi Cluster 구성 계획은 다음과 같다.
master 1대 - 메모리 1~2GB, HDD 40GB
slave 3대 - 메모리 1GB, HDD 40GB
설치 후 가상환경을 생성하여 CentOS 7 을 설치한다. 이 글에서는 CentOS 7설치에 대한 설명은 생략한다.
자바 다운로드 #
하둡(Hadoop)을 설치하려면 반드시 자바가 미리 설치돼 있어야 한다. 하둡(Hadoop)은 자바로 개발됐고, 데몬을 구동할 때 JAR 파일을 수정하기 때문에 반드시 자바가 필요하다. 버전은 1.7 버전 이상을 권장하며 오라클에서 jdk 64bit 리눅스용 tar.gz 버전을 다운로드한 후 /user/local/ 경로에 압축을 해제하고 ln -s 명렁어로 java라는 링크 파일을 생성한다
오라클 사이트에서 jdk tar파일을 다운받는다.(출처)
$cd /usr/local
$chmod 777 jdk-8u201-linux-x64.tar.gz
$tar xvfz jdk-8u201-linux-x64.tar.gz
$ln -s jdk1.8.0_201 java
이후 jdk의 환경변수를 설정한다. $sudo vi /etc/profile
중단 부에 다음과 같이 입력한다.
#JAVA
export JAVA_HOM=E/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
소스 파일을 업데이트하고 자바 버전을 확인한다.
$source /etc/profile
$java -version
이때 OpenJdk에서 OracleJdk 로 변경된 것을 확인한다.
하둡(Hadoop) 다운로드 #
자바를 성공적으로 설치하였다면 이제 본격적으로 하둡(Hadoop)을 설치하고 환경설정 파일을 설정해보도록 하자.
본 글에서는 하둡(Hadoop) 2.9.2 버전으로 설치 및 실습을 진행할 예정이다.
하둡(Hadoop) 에서 binary 버전
2번째 항목의 mirror.apache~ 파일을 받는다(출처)
이후 /home/opt 에 압축을 해제하고 ln -s 명령어로 hadoop이라는 링크 파일을 생성한다.
$ cd /home/opt
$ tar xvfz hadoop-2.9.2..tar.gz
$ ln -s hadoop-2.9.2 hadoop
환경변수에 HADOOP_HOME 을 추가한다.
$vi /etc/profile
하둡 관련 설정을 추가한 후 소스 파일을 업데이트하고 하둡 버전을 확인한다.
SSH 설치 #
하둡(Hadoop)은 여러 대의 노드와 통신하며 데이터를 교환하기에 보안통신이 필요하므로 SSH를 설치한다.
$yum install openssh*
$/usr/sbin/sshd
##비밀번호를 생략한 ssh 로그인, 공개키와 비밀키 생성
$ssh-keygen -t rsa -P "" ## 이후 기본값.(type enter)
$cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
##localhost 접속 테스트
$ssh localhost
하둡 설정 세팅 #
다음으로는 하둡 환경 설정 파일을 수정한다.
hadoop-env.sh #
하둡(Hadoop)은 자바로 구현되었기 때문에 자바 환경변수 설정을 하둡 설정파일에도 해줘야 한다.
$vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
##약 25번째 줄
export JAVA_HOME=/usr/local/java
core-site.xml #
네임노드를 설정하는 파일이다.
$vi $HADOOP_HOME/etc/hadoop/core-site.xml
##하단부에 추가한다.
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
hdfs-site.xml #
파일 복제 옵션을 설정하는 파일이다. 이 파일을 수정하기 이전에 다음과 같은 작업을 수행한다.
## 이 부분은 master에서만
$ mkdir $HADOOP_HOME/namenode
$ chown root -R $HADOOP_HOME/namenode
$ chmod 777 $HADOOP_HOME/namenode
## 전체 노드에서 수행
$ mkdir $HADOOP_HOME/datanode
$ chown root -R $HADOOP_HOME/datanode
$ chmod 777 $HADOOP_HOME/datanode
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
##이 부분은 추후 slave 노드에서는 제외돼야 하는 부분이므로 참고하길 바란다.
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/opt/hadoop/namenode</value>
</property>
##----------------------------------------------------------------
##본 글에서는 master도 데이터 노드 역할을 수행할 것이기 때문에 밑의 설정을 추가.
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/opt/hadoop/datanode</value>
</property>
</configuration>
가상환경 복제 후 설정 #
slave 복제한 후 네트워크 설정을 해준 후 다음 slave를 복제할 것을 권장한다.
네트워크 설정 #
생성한 네트워크 환경을 각각 다음과 같이 설정한다.
- ip 주소
- master : 192.168.10.1
- slave1 : 192.168.10.2
- slave2 : 192.168.10.3
- 네트 마스크 : 255.255.255.0
- 게이트웨이 : 192.168.109.2
- 네임서버 : 192.168.109.2, 168.126.63.1
복제가 완료되면 첫 기본 가상환경(이후 master라고 지칭)의 네트워크 환경 설정을 변경한다.
master의 네트워크 설정. 위 설정 내용과 같이 다른 slave의 네트워크 설정도 차례대로 변경한다.
호스트 호스트네임 설정 #
네트워크 환경을 변경한 후 전체적으로 재시작한 후 인터넷에 접속되는지 확인하고, 성공적으로 접속이 완료되면 다음으로 host와 hostname을 일치시키는 작업을 한다. 모든 노드에서
$vi /etc/hosts
1 127.0.0.1 localhost
2 192.168.96.1 master
3 192.168.96.2 slave1
4 192.168.96.3 slave2
master에서
$ vi /etc/hostname
master
slave 1에서
$ vi /etc/hostname
slave1
slave 2에서
$ vi /etc/hostname
slave2
모든 노드에서
$/bin/hostname -F /etc/hostname
재부팅 후 변경사항이 적용되었는지 확인한다.
각 노드에 설정한 이름으로 바뀌었는지 확인한다.
ping 테스트를 각 노드에서 수행해본다.
master에서 ping 테스트 수행
SSH 설정 #
앞서 생성한 SSH 공개키를 복사한다. 모든 노드에서 각각의 노드로 공개키를 복사한다. 마스터에서의 예시
$scp -rp ~/.ssh/authorized_keys root@slave1:~/.ssh/authorized_keys
$scp -rp ~/.ssh/authorized_keys root@slave2:~/.ssh/authorized_keys
$ssh slave1
$exit
$ssh slave2
$exit
하둡 데몬 pid 경로 수정 #
위 작업이 원활하게 이뤄졌다면 나머지 slave 1과 slave 2에서도 작업을 수행한다.
그리고 master에서만 실행
$vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
##약 113번 줄 하둡 데몬의 pid 저장경로 수정
export HADOOP_PID_DIR=/home/opt/hadoop/pids
잡트래커 설정 #
모든 노드의 mapred-site.xml.template 파일을 복사하여 mapred-site.xml 만든다
$cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml
##편집
$ vi $HADOOP_HOME/etc/hadoop/mapred-site.xml
## 맵리듀스 프레임 워크 yarn으로 설정
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
모든 노드의 yarn-site.xml 파일을 수정한다.
$vi $HADOOP_HOME/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
부가 설정 #
$vi $HADOOP_HOME/etc/hadoop/master
master
$vi $HADOOP_HOME/etc/hadoop/slaves
master
slave1
slave2
$ $HADOOP_HOME/bin/hdfs namenode -format
모든 노드에서 방화벽 내림
$systemctl stop firewalld.service
$systemctl disable firewalld.service
DFS , Yarn 시작 #
master에서만 실행한다
$start-dfs.sh
$start-yarn.sh
- start-dfs.sh : (NameNode,SecondaryNameNode,DataNode 가 실행)
- start-yarn.sh : (master에서는 ResourceManager와 NodeManager가 실행, slave에서는 NodeManager가 실행)
master와 slave에서 jps를 실행하여 구동이 잘 되는지 확인한다.
데이터 노드가 올라오지 않을 경우 #
각 slave에서
$rm -rf $HADOOP_HOME/datanode
$mkdir $HADOOP_HOME/datanode
$chown root -R $HADOOP_HOME/datanode
$chmod 777 $HADOOP_HOME/datanode
master에서
$stop-dfs.sh
$stop-yarn.sh
$rm -rf $HADOOP_HOME/namenode
$mkdir $HADOOP_HOME/namenode
$chown root -R $HADOOP_HOME/namenode
$chmod 777 $HADOOP_HOME/namenode
$rm -rf $HADOOP_HOME/namenode
$mkdir $HADOOP_HOME/namenode
$chown root -R $HADOOP_HOME/namenode
$chmod 777 $HADOOP_HOME/namenode
$hdfs namenode -format
$start-dfs.sh
$start-yarn.sh
각 환경에서 구동이 잘 되는 것을 확인하면 성공적으로 설치와 설정이 끝난 것이다.
환경 설정 및 DFS, YARN 구동 후 간단한 테스트 #
-
맵리듀스 작업을 실행 하기위해 HDFS 디렉토리 생성(master만 적용)
$hdfs dfs -mkdir /user $hdfs dfs -mkdir /user/root $hdfs dfs -mkdir /user/conf
-
테스트용 파일(README.txt) 업로드
$hdfs dfs -mkdir /input $hdfs dfs -copyFromLocal /home/opt/hadoop/README.txt /input $hdfs dfs -ls /input
-
분석 프로그램 실행(wordcount)
$hadoop jar hadoop-mapreduce-examples-2.9.2.jar wordcount /input/README.txt ~/wordcount-output
-
실행결과 확인
$hdfs dfs -cat ~/wordcount-output/part-r-00000
-
결과 화면
wordcount결과화면
하둡 분산 파일 시스템의 주요 명령어 #
-
형식) hdfs dfs -명령어 옵션 (dfs:Distributed Filesystem Shell(분산시스템 쉘)
$hdfs dfs -help (세부명령어 도움말) 파일 목록 확인 $hdfs dfs -ls /input (input 디렉토리 목록 출력) $hdfs dfs -ls -R / (하위 디렉토리 목록까지 출력) 파일용량 확인 $hdfs dfs -du / (디렉토리 또는 파일의 사용량을 바이트 단위 출력) $hdfs dfs -du -s / (디렉토리의 전체용량만 출력) 파일내용 확인 $hdfs dfs -cat (텍스트파일 전용) $hdfs dfs -text (텍스트파일,압축파일 읽음) 디렉토리 생성,제거 $hdfs dfs -mkdir [디렉토리] (디렉토리 생성) $hdfs dfs -rm [디렉토리] (디렉토리 제거) $hdfs dfs -rm -r [디렉토리] (하위 디렉토리까지 제거) 파일 복사(ex:파일=$HADOOP_HOME/etc/hadoop/core-site.xml) $hdfs dfs -put [파일] [디렉토리] (파일복사) $hdfs dfs -copyFromLocal [파일] [디렉토리/저장할파일이름] (파일복사) $hdfs dfs -copyToLocal(=get) [하둡분산파일시스템파일] [로컬시스템파일] $hdfs dfs -getmerge [하둡분산파일시스템파일] [로컬시스템파일] $hdfs dfs -cp [하둡분산파일시스템소스파일] [하둡분산파일시스템복사파일] 파일 이동 $hdfs dfs -cp 이동전경로 이동후 경로 $hdfs dfs -moveFromLocal [파일] [디렉토리/저장할파일이름] 카운트값 조회 $hdfs dfs -count / (디렉토리 갯수, 파일갯수, 파일사이즈) 파일의 마지막 내용 확인 $hdfs dfs -tail [파일] 권한 변경(hdfs dfs -chmod [권한옵션] [디렉토리/파일]) $hdfs dfs -chmod (-R(하위모두)) 777 conf 0바이트 파일 생성 $hdfs dfs -touchz text.txt
자바 코딩 실습 #
-
이클립스를 사용하여 자바 버전(리눅스 버전과 일치)을 확인 후 프로젝트를 생성 후 필요한 라이브러리(jar) 파일을 하둡 파일 밑에서 libs 폴더를 생성하여 복사한다.
-
필요 라이브러리 위치 및 갯수
- /home/opt/hadoop/share/hadoop/common 디렉토리 밑 jar파일 3개
- /home/opt/hadoop/share/hadoop/mapreduce 디렉토리 밑 jar파일 9개
필요 jar파일 적용
-
자바 패키지(hdfs) 및 클래스 파일(hdfsFile) 생성 후 자바 코드를 작성한다.
-
자바코드
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class hdfsFile { public static void main(String[] args){ //입력 파라미터 확인 if(args.length != 2){ //에러 메세지 출력 System.err.println("사용 방법: HdfsFILE <filename> <contents>"); //프로그램 강제종료 System.exit(2); } try { // 파일 시스템 제어 객체 생성 Configuration conf = new Configuration(); // 하둡분산파일시스템 객체 FileSystem hdfs = FileSystem.get(conf); // 경로 체크 Path path = new Path(args[0]); //파일 경로 존재 여부 확인 if (hdfs.exists(path)) { //파일삭제 hdfs.delete(path,true); } //파일 저장 FSDataOutputStream os = hdfs.create(path); os.writeUTF(args[1]); os.close(); // 파일 내용 읽기 FSDataInputStream is = hdfs.open(path); String inputString = is.readUTF(); is.close(); // 화면에 출력 System.err.println("Input Data:"+inputString); } catch (Exception e) { e.printStackTrace(); } }
}
-
소스 작성 후 jar 파일(Hadoop.jar)로 export를 진행한다.
-
만들어진 jar 파일은 리눅스 서버 /home/opt/source 디렉토리를 생성 후 복사한다.
-
jar 파일 실행 명령어 (패키지명.클래스명 명시 필요) 및 결과
자바 프로그램 실행 결과
항공데이터 예제 실습 #
- 항공 데이터 csv파일을 다운로드 한다.링크 2006,7,8
- home/opt/data/ 경로에 airlne 디렉토리 생성 후 다운로드 한 csv파일을 저장한다.
- $hdfs dfs -mkdir /input 디렉토리 생성복사
- $hdfs dfs -put /home/opt/data/airline /input airline 디렉토리 하위 모든 파일 복사
- 에제 실습에 필요한 java 소스코드를 작성한다.링크 활용
HIVE 설치 #
-
http://hive.apache.org - > HIVE 설치(버전 체크 필요)
1.X 버전 - Hadoop 1.x 버전 호환 2.X 버전 - Hadoop 2.x 버전 호환 3.X 버전 - Hadoop 3.x 버전 호환
-
/home/opt/ 위치에 압축 풀고 폴더명 hive로 변경(관리 편의성)
-
HIVE와 연동할 RDBMS 선택(여기서는 Mysql 선택,포트 오픈)
* DATABASE 생성 (CREATE DATABASE hive) * HIVE 유저 생성 -> 권한,외부접속 가능 create user 'hive'@'%' identified by 'hive; grant all privileges on hive.table to hive@* identified by 'hive';
-
vi /etc/profile 환경변수 파일 구성
export HIVE_HOME=/home/opt/hive PATH 설정 :$HIVE_HOME/bin
-
source /etc/profile 환경변수 파일 적용
-
hive-env.sh 하둡 경로 지정(선작업 : cp hive-env.sh.template hive-env.sh)
export HADOOP_HOME=/home/opt/hadoop
-
http://mvnrepository.com 에서 db명-connector-java-버전-bin.jar)(Mysql의 경우 mysql-connector-java-5.1.45-bin.jar) 다운로드 후 /home/opt/hive/lib 복사->hive와 연동 작용
-
hive-site.xml 수정
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hive.metastore.local</name> <value>true</value> </property> //하이브 연동(RDBMS) <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://서버IP:RDBMS포트번호/hive?useSSL=false&createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true</value> </property> //RDBMS 연동 Driver <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> //RDBMS 연동 계정명 <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> </property> //RDBMS 연동 패스워드 <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hive</value> </property> <property> <name>hive.aux.jars.path</name> <value>file:////home/opt/hive-2.3.4/lib/json-serde-1.1.4.jar</value> </property> </configuration>
-
METASTORE 초기화 작업 /home/opt/hive/bin 밑에 ./schematool -initSchema -dbType mysql 실행
- 실행 시 hive 데이터베이스 안 초기화 셋팅(METASTORE 스크립트 실행)
-
HDFS 디렉토리 생성
hdfs dfs -mkdir /user/hive hdfs dfs -mkdir /user/hive/warehouse hdfs dfs -chmod g+x /user/hive hdfs dfs -chmod g+x /user/hive/warehouse
-
hive 실행
HIVE 실행 화면
참고 출처 #
- lifefost 하둡강좌
- 시작하세요! 하둡 프로그래밍(정재화 지음)
- 하이브 완벽 가이드(저자:에드워드 카프리올로)