62. Zeppelin Notebook이란?
• Hadoop에 HIVE가 있다면 Spark에는 Zeppelin이? ^^
• 사실 HIVE 보다 더 많은 기능을 제공합니다.
• Spark와 연동하는 쉬운 interface를 제공하는 오픈소스 도구
• interpreter방식의 명령과 수행을 제공 (iPython 노트북과 비
슷하게 동작)
• html, sql, shell script, scala/python/java 등을 지원
63. 왜 Zeppelin Notebook인가?
• Spark 과 함께 사용한다면, 확실히 빠릅니다.
• 데이터를 분석하고 싶은 사람의 입장에서, 한 화면에서
데이터의 추출, 처리, 분석을 (손쉽게!) 처리할 수 있습니
다.
• 오픈소스 입니다. ^^
98. • S3에 로그가 있는 경우
val logs = sc.textFile(“s3n://daily_log_path/*”)
logs.toDF.registerTempTable(“DAY_LOGS”)
• 이때 경로에 변수를 넣을 수 있습니다.
val log_path = f”s3n://daily_log_path/$year/$month%02d/
$day%02d/*/*”
val logs = sc.textFile(log_path)
• 파케이 파일의 경우는 파티션 조건을 주고 읽습니다.
val todayPQ = sqlContext.parquetFile(“s3n://
parquet_daily_log_path/day=20150419”)
todayPQ.registerTempTable(“DAY_PARQUET”)
145. • DB 접속정보를 입력하고, 읽어올 정보를 SQL로 정의한
후에 load()를 수행하면 필요한 정보를 데이터베이스로
부터 가져올 수 있습니다.
val dbAddr = “111.1111.111.11:3300”
val dbUser = “user_name
val dbPw = password
val dbName = “test_db”
val dbTable = “”( SELECT id AS user_id, nickname,
created_at as join_date FROM users ) user_info”
val jdbcDF = sqlContext.load(jdbc, Map( url -
s”jdbc:mysql://${dbAddr}/${dbName}?user=${dbUser}
password=${dbPw}, dbtable - s”${dbTable}”)).persist()
jdbcDF.registerTempTable(USER_TABLE)
146. 둘. 데이터를 처리한다!
• 테이블 형태로 등록해서 SQL문을 이용 할 수 있습니다.
• 또는 스칼라 코딩으로 조작 할 수도 있지요.
• 둘을 섞어가며 (스칼라
161. 섞는다든지...) 작업
하는 것도 물론! 가능합니다.
• SQL이 손쉽고 따로 공부 할 것도 없지만, 스칼라가 조금
더 빠르고, 폼이 납니다. ^^;
162. • 테이블 형태로 등록해서 SQL문을 이용 할 수 있긴 하지
만,
• 가끔 수행이 안되는 경우도 있어요. 복잡한 SQL함수를
사용하고자 하는 경우에...
• 그러나 더욱 강력한 user define fuction을 등록 할 수
있으니 염려마시구요.
163. • registerTempTable()로 등록했다면, SQL을 통해 조회가
가능합니다. 입력 값을 받을 수도 있구요. 이때, 내가 등록
한 함수를 사용할 수 있습니다.
def getClickCount(input:Int) : Int = {
val click_type = input.toString
var cnt = 0
if (click_type != error) cnt = 1
return cnt
}
sqlContext.udf.register(getClickCount, getClickCount _)
%sql
SELECT day, age, SUM(getClickCount(click_type) )
FROM remain_report
WHERE age = 10 AND age = 30
GROUP BY day, age
ORDER BY day, age
171.
• 스칼라에서 당연한 경우에는 파라미터를 _
(underscore)로 대체 할 수 있습니다. 아래 두 라인은
똑같은 의미 입니다.
val fmap = rdd.flatMap(line = line.split( )).map(word =
(word,1)).reduceByKey{(a: Int, b: Int) = a + b}
val fmap = rdd.flatMap(line = line.split( )).map(word =
(word,1)).reduceByKey(_+_)
172. • 빅데이터 에서는 보통 (key,value) 를 처리합니다.
• 로그에서 필요한 데이터만 잘라내서 key 부분에 넣고, 적절한 함수
를 호출해 주면 됩니다.
val invalidLineCounter = sc.accumulator(0)
val pairs = c_logs.map(s = (
try {
s.split(t)(1).split(:)(0) + _ + s.split(t)(1).split(:)(5)
} catch {
case _:Exception = {
invalidLineCounter += 1
None
}
}
, 1 )
)
val counts = pairs.reduceByKey(_+_) (사용자ID_날짜, 노출횟수)
173. 셋. 처리 결과를 저장/제공 한다!
• 가장 간단한 방법 : 화면에 EXCEL DOWNLOAD !! 아싸…
• 하지만 화면에 뿌려진 만큼만 download되기 때문에, 결과 화
면 아래 빨간줄 메시지가 나온 경우에는 사용할 수 없습니다.
• 그런 경우에는? 파일로 쓰자!
174. • 결과를 직접 파일로 저장하는 경우
• 위치는 별도 (S3) 서버 또는 Zeppelin이 구동중인 서버에도 저
장 가능합니다.
• 단 RDD 타입이어야 해요.
resultRDD.coalesce(1).saveAsTextFile(“s3n://result_upload_path/
test_result”)
• 결과를 메일로 보낼 수도 있구요. java 를 지원하니까요.
import java.util.*
import java.mail.*
…
메일 본문을 만들고... 보내고....