SlideShare a Scribd company logo
tost@indf.net
. 설치하기
“중복되지 않은 아이템들의 갯수”
수학적 용어로 기수(CARDINAL NUMBER)
1233 3개
* UV vs PV
UV (Unique Visitor) - 설정된 기간동안 방문한 순방문
- 해당사이트를 1회 방문하건, 10회 방문
하건, 방문자는 1로 체크
PV (Page View) - 페이지가 열린 횟수
- 구분없이 페이지가 열린 경우 카운팅 됨
PV에서는 극단적으로 1명의 헤비유저가 데이터를 훼손 할 수 있음
(새로고침으로 신공으로 PV올리기)
날짜 요소
Count/
SUM
Max Min UC
2014-01 1, 2, 3, 4, 4 5 4 1 4
2014-02 1, 4, 1 3 4 1 2
2014-03 2, 6 2 6 2 2
2014-05 7, 5 2 7 5 2
2014-06 5, 1, 3 3 5 1 2
2014-01 ~ 2014-06 의 결과?
날짜 요소
Count/
SUM
Max Min UC
2014-01
~
2014-06
1, 2, 3, 4, 4
1, 4, 1
2, 6
7, 5
5, 1, 3
15 6 1 7
2014-01 ~ 2014-06 의 결과임.
날짜 요소
Count/
SUM
Max Min UC
2014-01 1, 2, 3, 4, 4 5 4 1 4
2014-02 1, 4, 1 3 4 1 2
2014-03 2, 6 2 6 2 2
2014-05 7, 5 2 7 5 2
2014-06 5, 1, 3 3 5 1 2
15 7 1
하지만, UC를 제외한 값은 부분집계 값(value)를 통해 더 쉽게 구할 수 있음
????
UC에서는
집계한 결과(Value)로는
전체결과를 유도 할 수 없음
즉,
모든 요소를 유지 해야 함
값은 부모 단계로 승계 안되나, 부분집합형태로 구성이 가능함
집합 개념으로 보면 이해가 편함.
1
2
3
4
6
1
2
3
4
6
∪
5개 2개 3개
단, 서브셋으로 구성할 때 교집합이 존재하면 안됨.
분배할때 상호배제 되어야 함.
12 3 46 1
2
3
4
6
∪
UC=5개 3개 3개
2
2
+=
select
count(distinct 필드명) as uc
from
t_table
Set<String> set = new HashSet<String>();
set.add(“a”);
set.add(“a”); //중복
set.add(“xxx”);
set.add(“yyy”);
System.out.println( set.size() ); // print : 3
쿼리문
소스코드 (set)
하둡 M/R로는 UC에 적당하지 않음.
하둡은 KEY단위로 모아서 iterator<Value> 형태로 모아줌.
즉, Value에서 중복을 제거해야 하는데 사이즈가 크면 메모리가 부족함
하둡은 KEY단위로 분산을 해주는것이지
Value단위로 분산해주는것이 아님!!!!
그럼? KEY 요소로 써서 카운팅 하면 되지 않을까?
가능함.
하지만 결과 파일은 중복이 제거된 값들을 결과로 받음.
즉, ‘wc –l’ 같은 명령으로 라인수를 세어야 할 것임.
그리고 더 A결과와 B결과의 UC 를 구하려면
또 M/R을 돌리기 다양한 부분집합들로 구성될 때 몹시 화가 날것임.
아이폰유저 아이패드유저
안드로이드 유저
A
B
E
C
D
F
G
- 대용량 INPUT은 하둡에서 Map작업으로 요청 (리듀스 안씀)
- 메모리 서버는 별도의 서버로 존재하며 네트워크로 전송
( 성능을 위해 건별 요청을 하지 않고 내부 버퍼를 둬서 전달)
- 서브셋으로 구성하여 스케일아웃한 구성
- 메모리 절약을 위해 대상값은 모두 숫자형으로 전환 (=bitset사용)
MOD
(파티셔닝)
[4,1,123,6,2,324,234, 6, 4,1,123]
[123,6,234]
[4,1,324]
[2]
하둡서버
(여러대임)
merge 결과
메모리를 확장한 서버를 마련하여 구하고.
Set의 구현체를 이용한다면 쉽게 UC를 구할수 있고 부모/자식관계의 UC
도 구하는 비용이 비교적 손쉬움.
Set p = new Set();
Set c1 = new Set();
Set c2 = new Set();
p.addAll(c1);
p.addAll(c2);
p.size();
HashSet의 경우 integer타입을 쓴다고 하면 ,
이론상 4바이트로 계산하면 2.5억개 정도 담겨야 하지만,
실제로 테스트해보면 563만개 정도 담을 수 있음
단일 차원으로 보면 충분해 보이지만,
다양한 차원으로 값이 승계되어야 한다면,
모든 상태를 유지해야 하므로 메모리가 매우 많이 필요함.
Bitmask 를 이용해 계산함
이론상 4byte면 32개의 표현이 가능함
1024mb에서 5.3억개 수준의 상태가 표현가능함.
단점은, 숫자형만 가능하다는 점.
그리고 메모리의 크기가 개수가 아닌 max값에 영향을 받는 문제가 있음.
‘394762’이라면, hashset에서는 4byte, bitset에서는 49345byte
Bitset의 단점을 보완하기 위해
1만건 정도는 HashSet, 그 이상이 넘어가면 BitSet으로 전환하는
Set을 구현 함.
하지만,
어느순간 대부분 1만건이 넘어서
오히려 오버헤드가 되고 있음
앞의 문제를 해결 하기위해 최근 개발한 구현체
하나의 bitset이 아니라 논리적 블럭단위로 bitset을 사용함.
public class SmartWappedBitSet implements Set<Integer> {
private static final int DEFAULT_BLOCK_SIZE = 10000;//bit갯수
private int INIT_BLOCK_SIZE;
private final Map<Integer,BitSet> folder;
public SmartWappedBitSet(final int blockSize) {
this.INIT_BLOCK_SIZE = blockSize;
folder = new HashMap<Integer,BitSet>();
}
public SmartWappedBitSet() {
this(DEFAULT_BLOCK_SIZE);
}
@Override
public boolean add(Integer e) {
final int index = e / INIT_BLOCK_SIZE;
final int value = e % INIT_BLOCK_SIZE;
if (!folder.containsKey(index)) {
folder.put(index, new BitSet());
}
folder.get(index).set(value);
return true;
}
.
bitset
smart
bitset
메모리는 반으로
시간은 두배
.
block bitset
Hybridset
(HashSet + Bitset)
Hybridset2
(HashSet + smartbitset)
성능이 더 안좋아짐
으응?
심지어 GC도 더 많이 발생함.
- 예상과 다르게, HashSet의 속도가 매우 느림.
- Smartbitset에서는 여러 개의 bitset을 쓰는데, 생성시간도 꽤 소요됨
- 데이터 분포를 본 결과 만건을 넘는 경우가 대부분이었음
- Hashset에서 bitset전환은 loop로 돌아야 해서 비용이 싸지 않음
- 기존대비 1/3 정도 메모리 절약
- 실행속도 3배 상승
- 성능저하는 loop, GC, 잦은 instance가 문제임
. 설치하기

More Related Content

What's hot

하둡완벽가이드 Ch9
하둡완벽가이드 Ch9하둡완벽가이드 Ch9
하둡완벽가이드 Ch9HyeonSeok Choi
 
Hadoop Introduction (1.0)
Hadoop Introduction (1.0)Hadoop Introduction (1.0)
Hadoop Introduction (1.0)
Keeyong Han
 
Hdfs
HdfsHdfs
하둡 맵리듀스 훑어보기
하둡 맵리듀스 훑어보기하둡 맵리듀스 훑어보기
하둡 맵리듀스 훑어보기
beom kyun choi
 
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료20180714 하둡 스터디 종료 보고 및 연구과제 발표자료
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료
BOMI KIM
 
HDFS Overview
HDFS OverviewHDFS Overview
HDFS Overview
JEONGPHIL HAN
 
Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정HyeonSeok Choi
 
하둡관리
하둡관리하둡관리
하둡관리
Choonghyun Yang
 
서울 하둡 사용자 모임 발표자료
서울 하둡 사용자 모임 발표자료서울 하둡 사용자 모임 발표자료
서울 하둡 사용자 모임 발표자료
Teddy Choi
 
Hive 입문 발표 자료
Hive 입문 발표 자료Hive 입문 발표 자료
Hive 입문 발표 자료
beom kyun choi
 
Hadoop과 SQL-on-Hadoop (A short intro to Hadoop and SQL-on-Hadoop)
Hadoop과 SQL-on-Hadoop (A short intro to Hadoop and SQL-on-Hadoop)Hadoop과 SQL-on-Hadoop (A short intro to Hadoop and SQL-on-Hadoop)
Hadoop과 SQL-on-Hadoop (A short intro to Hadoop and SQL-on-Hadoop)
Matthew (정재화)
 
Tajo and SQL-on-Hadoop in Tech Planet 2013
Tajo and SQL-on-Hadoop in Tech Planet 2013Tajo and SQL-on-Hadoop in Tech Planet 2013
Tajo and SQL-on-Hadoop in Tech Planet 2013
Gruter
 
Hadoop 제주대
Hadoop 제주대Hadoop 제주대
Hadoop 제주대
DaeHeon Oh
 
하둡 HDFS 훑어보기
하둡 HDFS 훑어보기하둡 HDFS 훑어보기
하둡 HDFS 훑어보기
beom kyun choi
 
20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제
Tae Young Lee
 
about hadoop yes
about hadoop yesabout hadoop yes
about hadoop yes
Eunsil Yoon
 
Hadoop administration
Hadoop administrationHadoop administration
Hadoop administration
Ryan Guhnguk Ahn
 

What's hot (20)

Hadoop overview
Hadoop overviewHadoop overview
Hadoop overview
 
하둡완벽가이드 Ch9
하둡완벽가이드 Ch9하둡완벽가이드 Ch9
하둡완벽가이드 Ch9
 
Hadoop Introduction (1.0)
Hadoop Introduction (1.0)Hadoop Introduction (1.0)
Hadoop Introduction (1.0)
 
Hdfs
HdfsHdfs
Hdfs
 
Apache hive
Apache hiveApache hive
Apache hive
 
Hadoop발표자료
Hadoop발표자료Hadoop발표자료
Hadoop발표자료
 
하둡 맵리듀스 훑어보기
하둡 맵리듀스 훑어보기하둡 맵리듀스 훑어보기
하둡 맵리듀스 훑어보기
 
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료20180714 하둡 스터디 종료 보고 및 연구과제 발표자료
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료
 
HDFS Overview
HDFS OverviewHDFS Overview
HDFS Overview
 
Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정
 
하둡관리
하둡관리하둡관리
하둡관리
 
서울 하둡 사용자 모임 발표자료
서울 하둡 사용자 모임 발표자료서울 하둡 사용자 모임 발표자료
서울 하둡 사용자 모임 발표자료
 
Hive 입문 발표 자료
Hive 입문 발표 자료Hive 입문 발표 자료
Hive 입문 발표 자료
 
Hadoop과 SQL-on-Hadoop (A short intro to Hadoop and SQL-on-Hadoop)
Hadoop과 SQL-on-Hadoop (A short intro to Hadoop and SQL-on-Hadoop)Hadoop과 SQL-on-Hadoop (A short intro to Hadoop and SQL-on-Hadoop)
Hadoop과 SQL-on-Hadoop (A short intro to Hadoop and SQL-on-Hadoop)
 
Tajo and SQL-on-Hadoop in Tech Planet 2013
Tajo and SQL-on-Hadoop in Tech Planet 2013Tajo and SQL-on-Hadoop in Tech Planet 2013
Tajo and SQL-on-Hadoop in Tech Planet 2013
 
Hadoop 제주대
Hadoop 제주대Hadoop 제주대
Hadoop 제주대
 
하둡 HDFS 훑어보기
하둡 HDFS 훑어보기하둡 HDFS 훑어보기
하둡 HDFS 훑어보기
 
20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제
 
about hadoop yes
about hadoop yesabout hadoop yes
about hadoop yes
 
Hadoop administration
Hadoop administrationHadoop administration
Hadoop administration
 

Similar to 20140522 uc집계 정민철_발표자료_최종

집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03
Kwang Woo NAM
 
R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1
happychallenge
 
머신러닝 프로젝트 - LSTM을 이용한 주가(KODEX200) 예측
머신러닝 프로젝트 - LSTM을 이용한 주가(KODEX200) 예측머신러닝 프로젝트 - LSTM을 이용한 주가(KODEX200) 예측
머신러닝 프로젝트 - LSTM을 이용한 주가(KODEX200) 예측
PARK SUNGMIN
 
성능 좋은 SQL 작성법
성능 좋은 SQL 작성법성능 좋은 SQL 작성법
성능 좋은 SQL 작성법
Devgear
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기
NAVER D2
 
3.unsupervised learing
3.unsupervised learing3.unsupervised learing
3.unsupervised learing
Haesun Park
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
NAVER D2
 
R 스터디 세번째
R 스터디 세번째R 스터디 세번째
R 스터디 세번째
Jaeseok Park
 
면접 대비 벡터, CS 개념과 사례
면접 대비 벡터, CS 개념과 사례면접 대비 벡터, CS 개념과 사례
면접 대비 벡터, CS 개념과 사례
Soochan Park
 
C++ stl
C++ stlC++ stl
C++ stl
은아 정
 
MySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxMySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docx
NeoClova
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
Jongwook Choi
 
라이브 중에 실행할 쿼리 작성하기
라이브 중에 실행할 쿼리 작성하기라이브 중에 실행할 쿼리 작성하기
라이브 중에 실행할 쿼리 작성하기
진화 손
 
FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기
Jongwon Kim
 
Mongo db 최범균
Mongo db 최범균Mongo db 최범균
Mongo db 최범균
beom kyun choi
 
STL.doc
STL.docSTL.doc
STL.doc
Daniel Shin
 
Oracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameterOracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameter
엑셈
 
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
MongoDB
 
머신러닝 + 주식 삽질기
머신러닝 + 주식 삽질기머신러닝 + 주식 삽질기
머신러닝 + 주식 삽질기
HoChul Shin
 

Similar to 20140522 uc집계 정민철_발표자료_최종 (20)

집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03
 
R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1
 
머신러닝 프로젝트 - LSTM을 이용한 주가(KODEX200) 예측
머신러닝 프로젝트 - LSTM을 이용한 주가(KODEX200) 예측머신러닝 프로젝트 - LSTM을 이용한 주가(KODEX200) 예측
머신러닝 프로젝트 - LSTM을 이용한 주가(KODEX200) 예측
 
성능 좋은 SQL 작성법
성능 좋은 SQL 작성법성능 좋은 SQL 작성법
성능 좋은 SQL 작성법
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기
 
3.unsupervised learing
3.unsupervised learing3.unsupervised learing
3.unsupervised learing
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
 
R 스터디 세번째
R 스터디 세번째R 스터디 세번째
R 스터디 세번째
 
면접 대비 벡터, CS 개념과 사례
면접 대비 벡터, CS 개념과 사례면접 대비 벡터, CS 개념과 사례
면접 대비 벡터, CS 개념과 사례
 
C++ stl
C++ stlC++ stl
C++ stl
 
Mem cached
Mem cachedMem cached
Mem cached
 
MySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxMySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docx
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
라이브 중에 실행할 쿼리 작성하기
라이브 중에 실행할 쿼리 작성하기라이브 중에 실행할 쿼리 작성하기
라이브 중에 실행할 쿼리 작성하기
 
FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기
 
Mongo db 최범균
Mongo db 최범균Mongo db 최범균
Mongo db 최범균
 
STL.doc
STL.docSTL.doc
STL.doc
 
Oracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameterOracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameter
 
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
 
머신러닝 + 주식 삽질기
머신러닝 + 주식 삽질기머신러닝 + 주식 삽질기
머신러닝 + 주식 삽질기
 

20140522 uc집계 정민철_발표자료_최종

  • 2.
  • 3.
  • 4. “중복되지 않은 아이템들의 갯수” 수학적 용어로 기수(CARDINAL NUMBER)
  • 6. * UV vs PV UV (Unique Visitor) - 설정된 기간동안 방문한 순방문 - 해당사이트를 1회 방문하건, 10회 방문 하건, 방문자는 1로 체크 PV (Page View) - 페이지가 열린 횟수 - 구분없이 페이지가 열린 경우 카운팅 됨 PV에서는 극단적으로 1명의 헤비유저가 데이터를 훼손 할 수 있음 (새로고침으로 신공으로 PV올리기)
  • 7.
  • 8. 날짜 요소 Count/ SUM Max Min UC 2014-01 1, 2, 3, 4, 4 5 4 1 4 2014-02 1, 4, 1 3 4 1 2 2014-03 2, 6 2 6 2 2 2014-05 7, 5 2 7 5 2 2014-06 5, 1, 3 3 5 1 2 2014-01 ~ 2014-06 의 결과?
  • 9. 날짜 요소 Count/ SUM Max Min UC 2014-01 ~ 2014-06 1, 2, 3, 4, 4 1, 4, 1 2, 6 7, 5 5, 1, 3 15 6 1 7 2014-01 ~ 2014-06 의 결과임.
  • 10. 날짜 요소 Count/ SUM Max Min UC 2014-01 1, 2, 3, 4, 4 5 4 1 4 2014-02 1, 4, 1 3 4 1 2 2014-03 2, 6 2 6 2 2 2014-05 7, 5 2 7 5 2 2014-06 5, 1, 3 3 5 1 2 15 7 1 하지만, UC를 제외한 값은 부분집계 값(value)를 통해 더 쉽게 구할 수 있음 ????
  • 11. UC에서는 집계한 결과(Value)로는 전체결과를 유도 할 수 없음 즉, 모든 요소를 유지 해야 함
  • 12. 값은 부모 단계로 승계 안되나, 부분집합형태로 구성이 가능함 집합 개념으로 보면 이해가 편함. 1 2 3 4 6 1 2 3 4 6 ∪ 5개 2개 3개
  • 13. 단, 서브셋으로 구성할 때 교집합이 존재하면 안됨. 분배할때 상호배제 되어야 함. 12 3 46 1 2 3 4 6 ∪ UC=5개 3개 3개 2 2 +=
  • 14.
  • 15. select count(distinct 필드명) as uc from t_table Set<String> set = new HashSet<String>(); set.add(“a”); set.add(“a”); //중복 set.add(“xxx”); set.add(“yyy”); System.out.println( set.size() ); // print : 3 쿼리문 소스코드 (set)
  • 16.
  • 17. 하둡 M/R로는 UC에 적당하지 않음. 하둡은 KEY단위로 모아서 iterator<Value> 형태로 모아줌. 즉, Value에서 중복을 제거해야 하는데 사이즈가 크면 메모리가 부족함 하둡은 KEY단위로 분산을 해주는것이지 Value단위로 분산해주는것이 아님!!!!
  • 18. 그럼? KEY 요소로 써서 카운팅 하면 되지 않을까? 가능함. 하지만 결과 파일은 중복이 제거된 값들을 결과로 받음. 즉, ‘wc –l’ 같은 명령으로 라인수를 세어야 할 것임. 그리고 더 A결과와 B결과의 UC 를 구하려면 또 M/R을 돌리기 다양한 부분집합들로 구성될 때 몹시 화가 날것임.
  • 20.
  • 21.
  • 22. - 대용량 INPUT은 하둡에서 Map작업으로 요청 (리듀스 안씀) - 메모리 서버는 별도의 서버로 존재하며 네트워크로 전송 ( 성능을 위해 건별 요청을 하지 않고 내부 버퍼를 둬서 전달) - 서브셋으로 구성하여 스케일아웃한 구성 - 메모리 절약을 위해 대상값은 모두 숫자형으로 전환 (=bitset사용)
  • 24. 메모리를 확장한 서버를 마련하여 구하고. Set의 구현체를 이용한다면 쉽게 UC를 구할수 있고 부모/자식관계의 UC 도 구하는 비용이 비교적 손쉬움. Set p = new Set(); Set c1 = new Set(); Set c2 = new Set(); p.addAll(c1); p.addAll(c2); p.size();
  • 25.
  • 26. HashSet의 경우 integer타입을 쓴다고 하면 , 이론상 4바이트로 계산하면 2.5억개 정도 담겨야 하지만, 실제로 테스트해보면 563만개 정도 담을 수 있음 단일 차원으로 보면 충분해 보이지만, 다양한 차원으로 값이 승계되어야 한다면, 모든 상태를 유지해야 하므로 메모리가 매우 많이 필요함.
  • 27. Bitmask 를 이용해 계산함 이론상 4byte면 32개의 표현이 가능함 1024mb에서 5.3억개 수준의 상태가 표현가능함. 단점은, 숫자형만 가능하다는 점. 그리고 메모리의 크기가 개수가 아닌 max값에 영향을 받는 문제가 있음. ‘394762’이라면, hashset에서는 4byte, bitset에서는 49345byte
  • 28. Bitset의 단점을 보완하기 위해 1만건 정도는 HashSet, 그 이상이 넘어가면 BitSet으로 전환하는 Set을 구현 함.
  • 29. 하지만, 어느순간 대부분 1만건이 넘어서 오히려 오버헤드가 되고 있음
  • 30. 앞의 문제를 해결 하기위해 최근 개발한 구현체 하나의 bitset이 아니라 논리적 블럭단위로 bitset을 사용함.
  • 31. public class SmartWappedBitSet implements Set<Integer> { private static final int DEFAULT_BLOCK_SIZE = 10000;//bit갯수 private int INIT_BLOCK_SIZE; private final Map<Integer,BitSet> folder; public SmartWappedBitSet(final int blockSize) { this.INIT_BLOCK_SIZE = blockSize; folder = new HashMap<Integer,BitSet>(); } public SmartWappedBitSet() { this(DEFAULT_BLOCK_SIZE); } @Override public boolean add(Integer e) { final int index = e / INIT_BLOCK_SIZE; final int value = e % INIT_BLOCK_SIZE; if (!folder.containsKey(index)) { folder.put(index, new BitSet()); } folder.get(index).set(value); return true; }
  • 33. .
  • 34. block bitset Hybridset (HashSet + Bitset) Hybridset2 (HashSet + smartbitset) 성능이 더 안좋아짐 으응?
  • 35. 심지어 GC도 더 많이 발생함.
  • 36.
  • 37. - 예상과 다르게, HashSet의 속도가 매우 느림. - Smartbitset에서는 여러 개의 bitset을 쓰는데, 생성시간도 꽤 소요됨 - 데이터 분포를 본 결과 만건을 넘는 경우가 대부분이었음 - Hashset에서 bitset전환은 loop로 돌아야 해서 비용이 싸지 않음
  • 38.
  • 39.
  • 40. - 기존대비 1/3 정도 메모리 절약 - 실행속도 3배 상승 - 성능저하는 loop, GC, 잦은 instance가 문제임

Editor's Notes

  1. 수학에서, 기수(基數, 영어: cardinal number)는 수의 일종으로 집합의 크기를 나타내기 위해 사용된다. 여기에서 크기는 간단히 말해 포함된 원소의 수를 뜻하며, 집합론의 용어로는 농도라고 한다
  2. 3이 중복되었으므로 3개임.
  3. 기본적으로 sorting후 중복제거하는 방법, Set은 구현체에 따라 HashSet, TreeSet 같은게 존재함. HashSet은 O(1)임.
  4. 아까말했듯이 미리 구해놓은 값은 소용이 없음, 요소의 Set을 유지해야 하기 때문에 스케일 아웃한 구성이 필요함.
  5. 하둡 M/R로는 UC에 적당하지 않음. 하둡은 KEY단위로 모아서 iterator<Value> 형태로 모아줌. 즉, KEY단위로 묶지만, VALUE에서는 중복체크를 위해 Set을 사용하고 문자열에 구분자를 추가해서 늘려가는 식으로 element를 유지할수밖에없음. reduce에서 value의 uc를 처리하기위해 내부적인 자료구조를 메모리에 로딩하는것이 필요함. 아니면 Key를 이용해 grouping 할수 있지만, 그러면 KEY를 다시 카운팅하는 작업이 필요함. 그리고 트리구조의 UC를 구하기위해서는 map단계에서 데이터를 늘려주는 구조여야함.
  6. 아까말했듯이 미리 구해놓은 값은 소용이 없음, 요소의 Set을 유지해야 하기 때문에 스케일 아웃한 구성이 필요함.
  7. 하지만, 데이터를 로딩하고 파싱하고 병렬 프로세싱을 하기위해서는 하둡을 사용하는것이 용이함. 그래서 map/reduce작업을 사용하지 않고 로그파싱과 요청은 map작업만 사용하여 요청함. 실제 UC를 구하는것은 메모리서버를 구현하 개발함.
  8. 부족하지만, Bitmap과 같은 bitset을 쓴다면 훨씬 많은 수를 담을수 있음. 5.3억개수준. 하지만 bitset은 갯수가 아니라 value에 따라 메모리사용량이 달라짐. 그래서 갯수가 적을땐 hashset, 많을땐 bitset을 쓰도록 함.
  9. 536870910 라는 값 1건이 오면... 1G의 메모리할당이 필요함.
  10. 536870910 라는 값 1건이 오면... 1G의 메모리할당이 필요함.
  11. 536870910 라는 값 1건이 오면... 1G의 메모리할당이 필요함.
  12. 536870910 라는 값 1건이 오면... 1G의 메모리할당이 필요함.
  13. bitset대비해서 성능은 버킷사이즈마다 다르지만 1~5억 사이의 숫자를 램덤하게 돌려 약 3.7억개수준의 uc가 나올때 수준임. 메모리는 반정도 적게 쓰고, 실행속도는 반정도 느려짐
  14. 기존 hybridset에서 bitset을 smartbitset으로 대체. 더 느려지고 더 CPU를 많이 사용. (기존방식은 23G정도 변경했더니 38G정도 cpu도 많이씀)
  15. hashset의 bitset(or smartbitset)생성비용과 전환비용이 컸음. 그래서 hybridset에서 아예 대체.