데이터이야기

DB 노하우, 데이터직무, 다양한 인터뷰를 만나보세요.

Hive 및 Sqoop을 이용한 간단 통계 배치 예제

데이터 이야기
작성자
dataonair
작성일
2015-10-12 00:00
조회
5719


Hive 및 Sqoop을 이용한 간단 통계 배치 예제



이전 글을 통해 Flume을 통한 로그 수집, Sqoop을 통한 DB 데이터 수집에 대해 알아보았으며, Hadoop에 저장된 데이터를 분석하기 위한 Hive, Spark에 대해서도 간략히 알아보았다.
이번 글에서는 Hadoop에 저장된 로그 데이터에서 Hive를 이용하여 통계 배치 스크립트를 만들고, 그 결과를 Sqoop을 통해 RDBMS로 저장하는 간단한 예제를 만들어 보겠다.
대용량 데이터를 저장하기 위해 Data Store로 Hadoop FileSystem, 즉, HDFS를 저장하며, 분석을 위해 MR(Map/Reduce) 를 직접 작성하거나, Pig나 Hive를 활용할 것이다.
아래 예제는, WAS나 Web Server의 access log를 수집하고, log상에 있는 query중, 검색어에 대한 일일 통계를 뽑는 샘플이다.

샘플은 Flume 등을 활용하여 수집된 데이터가 HDFS에 저장이 되어 있고, 분석하기 위해 Hive용 테이블이 생성되어 있다는 전제하에 시작한다.


1. 로그 수집을 통해 HADOOP / HIVE 테이블에 아래와 같은 테이블 및 데이터가 있다고 가정

Hive Table명 : keywordlog
Hive Table Column

2. 해당 HIVE 테이블에서 일 단위로 입력된 검색어 Keyword 랭킹 추출 Java 소스

소스명 : StatManager.java
/**
* SAMPLE CODE : Stat - Hive
* @author Lee,Ho-Chul (hironlee@gmail.com)
*/

import java.io.*;
import java.util.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.DriverManager;
import java.text.SimpleDateFormat;

public class StatManager {
private static String hiveDriverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
Connection nConn = null;

public static void main(String[] args) {
try {
Class.forName(hiveDriverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.exit(1);
}
StatManager sm = new StatManager();
sm.StatStart();
}

public StatManager(){
//
}

public void StatStart() {
Connection nDBCon = null;
String szQueryString = "";
String szQueryStringFile = "";

try {
//Hive Connection
nDBCon = DriverManager.getConnection("jdbc:hive://192.168.0.1:10000/hclee", "", "");
Statement szStmt = nDBCon.createStatement();
//keywordlog TABLE에서 Group/Order by Query 결과를 rankingtable에 저장
szQueryString = "INSERT INTO TABLE rankingtable SELECT keywords, count(seqno) as hitrating
FROM keywordlog GROUP BY keywords ORDER BY hitrating DESC LIMIT 100";
//동일하게 해당 결과 내용을 HDFS내 파일에 데이터 저장
szQueryStringFile = "INSERT OVERWRITE DIRECTORY '/user/warehouse/test_log/daydata'
SELECT keywords, count(seqno) as hitrating FROM keywordlog
GROUP BY keywords ORDER BY hitrating DESC LIMIT 100";
szStmt.executeQuery(szQueryString);
szStmt.executeQuery(szQueryStringFile);
szStmt.close();
nDBCon.close();
}
catch(SQLException se) {
//se.printStackTrace();
}
catch(Exception e) {
//e.printStackTrace();
}
finally {
if(nDBCon != null) {
nDBCon = null;
}
}
return;
}
}

3. Java Source(StatManager.java) Compile

사용한 ant의 build.xml 내 일부

결과 파일은 StatManager.jar 생성

아래 classpath 내 설치된 hive 디렉토리 아래 lib 에 속한 패키지들 추가

<target name="compile" depends="init"
description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}">
<classpath refid="master-classpath"/>
</javac>
<jar jarfile="${bin.dir}/StatManager.jar" basedir="${build}">
<manifest>
<attribute name="Built-By" value="Lee,HoChul(hironlee@gmail.com)"/>
<attribute name="Main-Class" value="com/kthcorp/daisy/teststat/StatManager"/>
<attribute name="Class-Path" value=". /home/hclee/hclee/teststat/lib/mysql-connector-java-5.1.21-bin.jar
/home/hclee/hadoop/hadoop/hadoop-core-1.0.3.jar /home/hclee/hadoop/hadoop/hadoop-core-1.0.3.jar
/home/hclee/hadoop/hive/conf ~~~~ ..중략.. HIVE LIB 아래 JAR 들 등록 .. 중략.. ~~~~
/home/hclee/hadoop/hive/lib/zookeeper-3.4.3.jar"/>
</manifest>
</jar>
</target>

4 처리된 결과를 Sqoop 활용하여 RDBMS로 전송하기

결과 데이터를 sqoop를 활용하여 원격 RDBMS(여기서는 MySQL)로 전송
/home/hclee/sqoop/bin/sqoop export --connect jdbc:mysql://DBSERVERIP/statdb --table keyword_ranking \
--username dname --password xyz --export-dir=/user/warehouse/test_log/daydata -m 1 \
--input-fields-terminated-by '\001'


5. 위 내용들로 Batch Shell 작성

statKeyword.sh 파일명으로 아래의 내용 작성 후 crontab에 매시간 배치로 등록하면 매시간 키워드 통계 데이터 생성 완료

#!/bin/bash
JAVA_HOME=/opt/java/jdk
HADOOP_HOME=/home/hclee/hadoop/hadoop
HIVE_HOME=/home/hclee/hadoop/hive
export JAVA_HOME=/opt/java/jdk
export ANT_HOME=/opt/java/ant
export ANT_OPTS=-Xmx512m
export ANT_LIB=/opt/java/ant/lib
export HADOOP_INSTALL=/home/hclee/hadoop/hadoop
export HADOOP_HOME=/home/hclee/hadoop/hadoop
export HIVE_INSTALL=/home/hclee/hadoop/hive
export HIVE_HOME=/home/hclee/hadoop/hive

echo -e '1\x01foo' > /tmp/a.txt
echo -e '2\x01bar' >> /tmp/a.txt
CLASSPATH=.:/home/hclee/hadoop/hadoop/hadoop-core-1.0.3.jar:$HIVE_HOME/conf
for i in ${HIVE_HOME}/lib/*.jar ; do
CLASSPATH=$CLASSPATH:$i
done
$JAVA_HOME/bin/java -cp $CLASSPATH -jar /home/hclee/hclee/stattest/bin/StatManager.jar
sleep 10
/home/hclee/sqoop/bin/sqoop export --connect jdbc:mysql://DBSERVERIP/statdb --table keyword_ranking \
--username dname --password xyz --export-dir=/user/warehouse/test_log/daydata -m 1 \
--input-fields-terminated-by '\001'

6. 완성

위 Batch Shell을 매 시간 실행함으로써 실시간 또는 배치로 수집되는 로그를 기반으로 매시간 인기 검색어를 뽑아 낼 수 있다.
해당 통계 결과는 즉시, 사용하는 RDBMS 로 전송이 되어, DB의 데이터를 읽어 API 형태로 제공하든, 직접 ACCESS 하든지 하여 활용할 수 있다. 또는, HDFS/HIVE에 저장된 파일 자체를 읽어 사용할 수 도 있을 것이다.
간단한 예제이지만, 대용량 분산 클러스터링(HDFS)에 데이터를 저장하여, HIVE QUERY로 분산 작업을 하여, 원하는 분석, 통계로 확장해 사용할 수 있는 예제임.
실제 활용시에는 다양한 배치 작성, 툴, 테이블을 활용하겠지만, 전반적인 이해를 돕기 위한 간단한 예제임

Reference


Apache Hive 데이터 처리를 위한 오픈 소스 - Hive
Apache Sqoop Apache Sqoop을 활용하여 RDBMS 데이터 수집