Skip to main content
Presto,	Zeppelin 을 이용한
초간단 BI 구축 사례
김형준
2016.06
김형준(babokim)
JOBPLANET
Bigdata,	Tajo	(Gruter)
Hadoop,	Neptune,	Naver Mail	(Naver)
공공 SI,	전자 ITO	(SDS)
www.jaso.co.kr
Open	source
Apache	Tajo
Naver Neptune
Jobplanet
기업의 리뷰,	연봉, 인터뷰, 채용 정보 제공
• 2014년 서비스 오픈
• 약 60	만개의 기업 리뷰, 연봉
인터뷰 정보 제공
• 한국, 인도네시아, 대만 서비스 중,
다수 국가 확장 진행중
(한국, 인도네시아 점유율 1위)
Image:	http://www.brainlazy.com/article/random-nonsense/over-engineered/
이런게 좋아요!
데이터를 필요로 하는 사람이 직접 데이터를 볼 수
있으면 좋겠어요.	
개발자들 너무 바빠서 부탁하기에 눈치 보여요.
여러 데이터를 조합해서 볼 수 있으면 좋겠어요.
전체 데이터를 볼 수 있으면 좋겠어요.
쉽고 빨랐으면 좋겠어요.
무엇보다도 Data	보안이 가장 중요해요.
이런거는 필요 없어요!
멋진 챠트나 그래프는 있으면 좋지만 아직 필요
없어요.
엑셀이면 충분해요.
실시간으로 분석할 필요는 없지만 점차 필요하겠죠.
Not	Data	Analytics,
But	Data	Exploration
처음에는,
가장 Simple(?)한 구성은?
Structured
Query
Language
Database Workbench
SQL
Database
(HDFS,	S3	등)
SQL-on-Hadoop Workbench
Simple	and	Fast,	But...
Not	End-user	friendly
ES	data	only
Out	Of	Memory
실제는,
로그 수집 및 저장이 우선
좋다고들 하는데 선뜻
사용하기가...
Daemon도 관리해야 하고...
이미 사용하고 있어
운영 경험이 있음
SQL 실행 엔진은?
기능이외 검토 항목
최근 기술인가?
오픈된 커뮤니티를
운영하고 있는가?
내부 구조까지 잘 아는
지인이 있는가?
- JSON 포맷을 지원해야 함
- S3,	HDFS,	MySQL 등에 저장된 데이터로
Join이 되어야 함
- 여러 사용자가 동시에 질의를 실행할 수 있어야 함
- Ruby에서 SQL을 실행할 수 있어야 함
- 가능하면 표준 SQL을 지원해야 함
- 기존 Hive 보다는 빨라야 함
- 하지만, Large	Scale	Data	처리는 필요 없음
(적당한 Scale 이면 충분)
기능 검토 항목
최종 선택은
4,868
그러면 SparkSQL 은?
https://www.quora.com/What-are-the-main-use-case-differences-between-Apache-Spark-SQL-and-Apache-Impala-incubating
Impala	is	designed	for	use	by	analysts	for	data	discovery(BI)	
across	massive	data	sets.	For	that	reason,	it	provides	the	low-
latency	queries	under	multi-user	load	expected	by	those	users	
who	want	a	BI-style	experience.
Conversely,	Spark	SQL	is	designed	to	let	developers	&	data	
scientists	use	SQL	constructs	when	doing	procedural	
development,	whether	for	ML	apps	or	perhaps	ETL.
If	you	are	plugging	in	via	a	real	BI	tool,	SparkSQL isn't	the	
answer.
가장 큰 고민은?
실무자가 SQL을 사용할 수 있을까?
(대부분의 질의는 Join,	Filter,	Group	by,	Order	by)
단순히 학습만 하는 것으로는 한계가 있음
개발자와 실무자의 협업을 통해
SQL 사용 능력 향상
Spark 연동이 아닌 협업 도구로 Zeppelin 활용
실무자의 SQL 학습 과정
사용자는 KPI 등 데이터 요청
개발자가 Notebook에 SQL 작성
(상단 Paragraph에 Query에 대한 설명)
유사한 패턴은 실무자가
Paragraph의 SQL 복사 후
일부 수정하여 직접 데이터 처리
(6개월 정도하면...)
Zeppelin에 추가 기능 필요
Presto	Interpreter
질의 Progress, Kill 기능
리소스를 많이 사용하는 질의 실행 제한
Notebook에 대한 생성, 수정, 실행 권한
특정 기능에 대한 접근 제한
데이터의 접근 제한
Presto	Interpreter	for	Zeppelin
기존 Presto	interpreter	patch가 존재
.	https://github.com/danielhaviv/incubator-zeppelin
.	Not	merged	into	presto	trunk(JDK	version	mismatch)	
.	Presto	JDBC를 이용하여 개발되어
Progress,	kill	지원 안됨
Presto	interpreter	made	by	Jobplanet
.	https://github.com/babokim/incubator-zeppelin
.	Presto	native	client,	REST	API	이용
Progress,	Kill	기능 지원
.	Zeppelin에서 지원하지 않는 일부 기능 지원
.	Not	merged
Presto	Interpreter:	Data	ACL
Presto	권한 관리는 각 Connector의 ACL	기능 이용
But,	Kafka	등은 지원하지 않음
각 스토리지에 권한관리 별도 설정 해야 함
Presto	Zeppelin	Interpreter의 권한관리
. Catalog,	Schema,	Table,	Column	단위로 권한 관리
. Read/Write는 schema	레벨로 관리
. Operation(INSERT,	SELECT	등)별로 권한 관리는
지원하지 않음
Presto	Interpreter:	Data	ACL
접근 제안 관리 설정
.	{ZEPPELIN_HOME}/conf/presto-acl.properties
.	{group}.{catalog}.{schema}.{table}.{columns}=allow|deny
국가별 사용자 Schema 접근 제한 예
. ko_emp.hive.korea.*=allow (한국 사용자만 접근)
컬럼 접근 제한
. ko_dev.hive.korea.logs.*=allow
(한국 개발자 logs	테이블 모든 컬럼 접근 권한 허용)
. ko_emp.mysql.korea.users.id,created_at=allow
(한국 일반 사용자에게 users 테이블의 id,	created_at 컬럼만 허용)
Presto	Interpreter:	Query	검증
다음과 같은 잘못된 질의 실행 요청에 대한 검증
Partition	column	반드시 사용
. Fact	테이블(logs)	질의 시 Where	절에 반드시
Partition	column	존재 해야 함
. Join,	Sub	query	등 복잡한 질의도 검증 가능
Limit	절이 없는 경우 불필요한 데이터가 조회
. Plugin	설정에서 max	limit	수 설정 가능
. 해당 설정 초과되는 데이터는 개발팀으로 요청
Zeppelin	Improvement
Paragraph	결과 데이터 다운로드 기능이 없어서
. Paragraph	결과 데이터가 많은 경우 사용자 브라우저 속도 저하
. Copy	&	Paste	시 번거롭고, Excel	Cell이 잘 깨짐
개선 사항
. 최대 1000개 레코드만 브라우저에 표시
. 1000개 이상의 데이터는 서버에 파일로 저장(retention 설정)
. Paragraph	Download	버튼 추가
Zeppelin	Improvement
Authentication
. Zeppelin	기본 기능 이용(Apache	Shiro 기반)
. Presto	Interpreter의권한관리에서 user,	group	으로 사용
Authorization
. Zeppelin	커뮤니티 내에서도 꾸준히 개선 작업하고 있지만
바로 사용하기 위해 소스 코드내 권한 제어 코드 임의 추가
. Group 명 수정: User1,	User2,	User3	->	dev,	emp,	emp_writer
. 화면 특정 기능에 대한 접근 제한 기능
. Admin,	Dev	계정만 Notebook	생성 가능
. Admin	계정만 Interpreter,	Configuration	메뉴 사용 가능 등
Zeppelin	사용 화면
Presto	Query	예제
presto:ko>	select	dt,	count(*)	from	hive.action_log
where	user_id =	'1234'	group	by	dt order	by	dt;
dt |	_col1
----------+-------
...	
20160615	|				14
20160616	|				14
(66	rows)
Splits:	1,130	total,	1,130	done (100.00%)
3:19	[86.7M	rows,	66.4GB]	[436K	rows/s,	341MB/s]
presto:ko>	select	dt,	count(*)	from	hive.action_log_orc
where	user_id =	'1234'	group	by	dt order	by	dt;
dt |	_col1
----------+-------
...
20160615	|				14
20160616	|				14
(66	rows)
Splits:	328	total,	328	done (100.00%)
0:03	[85.7M	rows,	9.52GB]	[29.1M	rows/s,	3.24GB/s]
Good	Bike를 만들었을까?
직접...
바빠서...
조합...
전체...
쉽고/빨랐...
보안...
Zeppelin	+	SQL	+	Download	->	Excel
관리 화면 만들 필요 없음. Spark	or	Map/Reduce
프로그램 없이 SQL 만으로도 처리
로그 저장을 ES	->	S3,	분석은 Presto등
MySQL,	Log	Data	Join 가능
SQL(Not	best,	but	not	bad),	DistributedComputing
Table의 Column 단위까지 제어 가능
현재는
S3를 저장소로 사용할 경우 실시간으로
로그 데이터를 볼 수 없음
Topic을 Presto Query로 실행하는
구성 중
문제는 Kafka	Connector가 Offset	관리를
하지 않고 전체 Topic 데이터를 Scan
Partition	pruning	&	Filter	pushdown	작업 중
Machine	Learning/
Streaming	Analysis
Interactive	
Data	Exploration
다음 모습은...
Real-time
Data	Ingestion
Real-time
Network	Analysis
Caravel
References
• https://prestodb.io
• http://zeppelin.apache.org/
• http://www.slideshare.net/dongminyu/presto-anatomy
• http://www.slideshare.net/AmazonWebServices/bdt30
3-running-spark-and-presto-on-the-netflix-big-data-
platform
• https://www.quora.com/What-is-the-difference-
between-Spark-and-Presto
• http://cleverowl.uk/2015/11/19/the-sql-on-hadoop-
landscape-an-overview-part-i/
• http://cleverowl.uk/2015/12/25/the-sql-on-hadoop-
landscape-an-overview-part-ii/