허니몬의 IT 이야기/프로그래머, '코드 엔지니어'

### Daum 내부 Hadoop 활용사례

* 발표자 : 윤석찬

* A role of Big Data

* Analytics(Hadoop)

* Realtime(NoSQL)

* Open Source based semi-real time analytics

* New Buzz

* 데이터 분석 산업의 변화

* Bigdata Stack?

* 지금 떠드는 건 한물 갔다.

* 오픈소스로 채우고 있다.

* Hadoo Platform : Today

* 도대체 국내에 빅 데이터가 있기나 하나요?

* 빅 데이터는 상대적이다.

* 데이터를 쌓아온 적이 없다. 

* 긴 시간 축적해놓으면 빅데이터

* Daum Hadoop 사용 사례

* 전사 로그 분석 

* Tiara 시스템

* Daum 서비스 내 발생하는 모든 트래픽을 수집하여 분석 및 리포팅

* Hive

* 하루 70TB 축적

* UCC 문서 스팸 필터링

* 문서 내부 단어 및 사용자 프로필을 기반한 스팸 필터링

* 일평균 600만개 문서

* 사물 검색 데이터 색인

* 이미지에 있는 데이터를 역 색인

* Daum 의 빅데이터 기술전략

* 사내 기술 코디네이션

* 개발자 데이터 접근성 향상

* 때론 컨트롤 타워가 진입 장벽과 아이디어 고갈을 가져온다. 

* Lessons for big data

* 기술 내재화 필요(No vendors)

- 개발자들이 직접 하둡을 활용할 수 있는 환경 필요

- 오픈소스의 적극활용 및 개발 잉여력 제공

* 데이터 분석 및 처리의 역할 파괴(No data scientist!)

- 개발자들이 직접 실시간 분석을 위한 Hive 활용

- 문서, 이미지 등 다양한 형태의 데이터 처리를 위한 토대 마련

* Small data를 활용강화(No big Mistacke!)

- Small Data라도 실시간으로 저렴하게 데이터를 처리 

* Hadoop 장점

* 분산 처리가 장점

* 관리 Host가 많이 든다. 

* 오픈소스는 기술내재화가 중요하다.


### Hadoop 실전 사용 사례 및 운영 노하우

* 발표자 : 김용우, 이선호(Daum)

* 좋은 검색 품질 : 사용자가 짧은 시간 안에 자신이 원하는 값을 얻어가는 것

* 좋은 검색 결과를 만드는 방법

* 검색하는 사용자를 이해하는 것 

- 로그를 기록 -> Big Data

* 데이터 분석을 위한 하둡(Data Analytics Process with Hadoop)

* **모든 데이터는 정제하지 않고 하둡에 입력**

* 분석 필요가 생겼을 때 필터링하여 툴을 이용하여 분석

* Hadoop - features - Tools

* 많이 본글

* Mission

* Target Data

- Half year Search Logs(About 40TB)

* Features

- Query - Collection Relationship

- Query - Document - Session Relationship

* Modeling

* Batch Process

- Hadoop - Feature - Model - Engine

* Search Spam Index

* Mission

* Data

* Task

* Blog Classification

* Mission

* Data

* Task

* What else?

* Topic Analysis With PLSA

* QUery Chain Filtering

* Reprocessing with Hadoop

* Advantage of Hadoop

* Advantage

* Disadvantage


### Hadoop을 사용하면서 겪을 수 있는 문제들에 대한 트러블 슈팅?

* 이선호(sunholee@daumcorp.com)

* 개발자 같아!

* Hadoop 시작하기

* 빅데이터 분석이 의미가 있는가?

* 하루치 로그 대신 30일치 분석하면?

* 유명인이 언급된 모든 문서를 분석하면?

* 문제

- 잘못된 파일 작업 하나 재시도

- 현재 작업 취소

- 다른 작업 떄문에 서버 리소스 부족

- 결과 취합해 다른 작업 수행

* Hadoop 사용자

- 다양한 배경

- 자바 프로그래밍 보다 분석 로직에 초점

* 주요 작업 방법

- Hadoop streaming(파이썬)

- 데이터 집계 :  pig or Hive

* 인프라

- 여분 하드웨어에 실험적으로 도입

* 설치는 쉽다

- 압축 파일 풀고 디렉토리 환경 변수 설정

- 패키지 설치도 가능

* 설정은 어렵다.

- conf/*.xml  너무 많은 설정옵션

- 뭔가 부족한 메뉴얼

- 시행 착오를 거쳐서 안정화

* Hadoop 디자인 - MapReduce

* 사용팁

- 데이터 저장

- 버리지 않고 저장

- 미지의 분석 요구 등장

- 디스크 비용은 감당할 수 있다고 생각

- 데이터 압축

- 빠른 작업 수행을 위해 파일을 쪼개서 압축

- lzo 같은 분할 압축 사용 가능

- 데이터 연동

- ftp로 외부 파일 가져다 분할 압축 저장

- crontab 에 수동 스크립트

- wget .. | zcat ... | hadoop fs ...

- hadoop fs 쉘을 활용하는 스크립트를 잘 짜면 많은 일을 할 수 있음

- Hadoop streaming

- 파이썬 같은 외부 프로그램 실행

- slave는 별도 프로세스를 생성해 표준 입출력으로 데이터만 교환

- Pig or Hive : 과정 명시 vs 결과 명시

- 데이터 정합성

- 데이터가 커서 항상 예외가 발생

- 정형화되어 있지 않은 데이터

- 대책

- 모든 예외 처리를 잘 하거나

- 예외는 버리고, 버려진 데이터 비율 집계 

* 장애상황

* 가장 중요한 자원은 메모리

* 가장 흔한 장애는 디스크 교체

* 가장 위헙한 장애는 네트워크 점유

* 장애 - 메모리 부족

- Slave 메모리 부족

- CPU가 swap 에 묶임 -> 행업, 통제 불가능

- 기본 설정은 hadoop streaming 이 만든 별도 프로세스 메모리까지 통제하지 않음

- 대책

* 장애 - 디스크 교체

- Master 디스크 교체

- 디스크 여러개에 checkpoint 저장 기능 

- Slave 디스크 교체

- hadoop 이 실패한 task 는 다른 서버에서 재시도

* 장애 - 네트워크 점유

- hadoop 클러스터 하나에서 발생한 경우는 없었음

- hadoop 클러스터를 여러 개 만들고, distcp로 대량의 파일을 복사할 떄

- distcp가 병렬로 파일 전송하는 task 생성

- distcp - m 옵션으로 task 개수 제한


### 알고쓰자! NoSQL - Hbase 및 MongoDB 중심

* 발표자 : 유응섭, 최준건

* Group-By Operation

* Secodary Index

*  DualWrite

- Observer를 이용한 구현, 클라이언트는 코드 수정이 필요없음, 부하를 많이 주었을 때 문제 발생해서 보류

* Index Manger

* IDEX_TABLE

* Scan Performance

- 범위가 좁은 검색을 할 때 속도가 높아진다.

- NoSQL의 인덱스를 활용해서 RDBMS처럼 쓰는거야?

* Durability

- 다수 노드 장애시 데이터 복구 불가능

- 다음 HDFS 버전에서 해결될 예정

* MongoDB : Scaling write performance

* 몽고디비!!

* First Impression : Easy

- Easy installation

- Easy data model

* Second thought : not so easy

- No SQL

* Insert throughput on a replica set


* Insert throughput on a second index

- 데이터의 크기가 커질수록 성능저화가 심함

- b+tree 인덱스를 사용

- 균등한 인덱스를 넣을 때는 크게 성능제한 없음

- 균등하지 않은 인덱스를 인서트할 경우에는 성능저하 발생

* 성능저하에 대한 대처

1. partitioning 처리

- 몽고디비는 파티셔닝 지원 안함

- 애플리케이션 수준에서 파티셔닝 해야함

- switch collection every hour

- 레코드 수를 조정?

2. Better HW

- More RAM

- More IOPS

- RAID strinping

- SSD

3. More H/W : sharding

- Automatic partioning across

- 유효한 리소스 메모리자원이 생기면서 성능이 향상됨

- 레이드까지 구성하면 더 높아짐

* Three's no free lunch

- 문제해결을 위한 비용이 든다.

* 몽고디비가 정말 인덱스가 필요하냐?

- 필요한 것에만 사용한다.

* Sharding 을 통해서 입력 성능을 높인다.

- 대용량의 데이터를 입력는 테스트를 어떻게 할꼬?

* Sequential key

- All sharding key to one 

* 문제해결을 위한 시도

* 몽고DB B+tree index 관련한 문제

* 몽고DB에서 sharding 을 통해 입력속도를 높이는 것은 쉽지 않다.

* Lessons learned

* 데이터의 양을 늘려라

* Know the performance impact of secondary index

* 몽고DB


* HBase vs MongoDB

* 인덱스를 사용하지 않을 경우


### 

* 발표자 : 김영한

* 프로젝트 구조와 모순

* 화면 중심 프로젝트

- 화면 중심으로 프로젝트 구조를 구성

- 중복의 상황이 발생한다.

- 프로젝트가 진행된다면

- 같거타 유사한 쿼리가 무수히 나타남

- 회원정보 조회의 경우 11번의 거의 동일한 쿼리 발견

- 수정이 아주 어려움

- 월화수목금금금...

- 화면 중심 프로젝트 구조는 수 많은 중복을 만든다.

* 일반적인 프로젝트

- 데이터와 비즈니스 로직을 중심으로 프로젝트 구조를 구성

- 실전에서 멀티 프로젝트

- 중복 발생

- 멀티 모듈 프로젝트

- 데이터 불일치

- CORE로 통합시 또 다른 문제 발생

- 해결방안

- Row 단위로 전체 조회

- 특별한 경우만 최적화

- 파레토 법칙

- 프로젝트 구조와 모순의 결론

- 엔티티가 쿼리에 의존

- 구멍난 엔티티

- 신뢰할 수 없는 엔티티

- 진정한 의미의 계층 분할이 어려움

* Why ORM

* ORM 을 사용하는 이유

- Projection 문제

- Join 관련 데이터 연결문제

- 엔티티 데이터에 대한 신뢰

- 제대로 된 프로젝트 구조

- CRUD SQL 좀 알아서 해줬으면

- 진정한 객체 지향 개발 가능

- 도메인 주도 개발 가능

* SQL을 사용해야 하는 이유

- 우리가 사용하는 DB는 RDB다

- 통계 데이터

- 아주 복잡한 View

* ORM을 사용하는 이유!

- 컴퓨터가 할 수 있는 일을 더이상 사람이 하지 말자. 나는 SQL Mapper가 아니다.

* JDBC -> iBatis -> ORM

* ORM에 대한 반대

* ORM에 관한 오해

- Object DB 같은 것 아닌가요? 이미 망한 기술로 알고 있는데요?

- 성능이 느리다.

- ORM을 사용하면 SQL을 못쓴다.

- Hibernate 자체도 네이티브 쿼리를 사용할 수 있다.

- SQL을 몰라도 되나요?

- SQL을 잘 아는 사람이 ORM을 해야한다.

- 공부할 내용이 많으면 어쩌지...

- 제대로 된 교육을 했다면 좋았는데

- 모두 iBatis, myBatis만 사용하는데?

- 진실은...

- 우리나라에서만 많이 쓴다.

* ORM을 사용하고 싶은데 어떻게 시작하나요?

- 공부해야 한다.

- 공부해야할 것

- JPA

- Hibernate

- SpringDataJPA

- interface로 repository 자동생성

- Simple queries

- pagination

- Webinding

- Specifications, QueryDSL 지원

- QueryDSL

* ORM 적용시 고민할 2가지 구조

* ORM을 적용하는 방법은 크게 2가지

- Domain Model Everywhere

- Domain 모델을 모든 레이어에서 적극사용하자

- OSIV 사용

- 게터, 세터 사용

- DTO는 중복 악이다.

- 장점

- 개발하기에 빠르고 편리함

- 단점

- 복잡한 View 표현 힘듦

- Domain 모델의 세터 게터 노출, View 로직 추가

- Domain 모델의 순수성이 떨어짐

- XML, JSON, 외부와의 통신 API 위험

- Pure Domain Model

- 도메인을 순수하게 유지

- CQRS

- 장점

- 순수한 도메인 모델

- 단점

- DTO를 만드는 것은 귀찮다. 성가시다. 괴롭다.

- DTO는 또다른 중복이다.

- DTO와 도메인모델의 컨버터를 고민

* 어떻게 해야해!!

- 도메인은 순수해야 한다.

* 우리의 과제

- DDD를 하자

- Pure Domain Model 을 유지하며 실용적으로 개발하는 방법

- DTO를 생성하는 방법, 활용법

* AutoSave : 연관관계에 의한 자동저장이 일어난다고...!? 그럼 왜 우린...Orz...

* SpringDataJpa 소개