using r with mongodb(r user conference korea 2015, sk c&c 김인범)
TRANSCRIPT
MongoDB 첫 질문?
• Mongol 사람들이 만들었나요? • MongoDB 만든 곳의 대주주가 Mongol 사람...? • 알고보니 MongoDB 만든 사람이 Mongol 후손...?
What is MongoDB?
• Document Oriented Database • Replication / Sharding • Multiple Transaction(CRUD) • Map-Reduce also possible • Latest Stable Version is 3.0.3(May 2015, bug hunting)
MongoDB 구조 간단 review - 2
mongod - 데이터를 저장, 관리하는 서버(복제 정책 적용 가능) mongos - client의 요청 받아 환경 설정 서버의 partitioning 정보를 참고해 적절한 데이터 서버로 요청을 포워딩 Config Server - sharding에 대한 환경 설정 서버 - partitioning에 대한 정보를 관리
MongoDB Benefit
Elements of MongoDB fit for Cloud Environment • Open Source • Easy Scalability(Scale out), Easy Install, Easy Use • Scheme-less • High Availability
MongoDB use (해외)
• facebook, google, twitter
• MetLife, foursquare, NewYork Times, Forbes
• 이외에도…
http://www.mongodb.com/who-uses-mongodb
MongoDB use (국내)
• FIFA Online 2 • DaumKakao ‘My Agora’ • LG U+ 그룹웨어, 패턴 분석 처리 시스템 • 인터파크, 상품 검색 및 채팅 서비스 시스템
MongoDB 이럴 때 쓰지 마세요!
• 고객이 Oracle이랑 비교할 때(RDBMS와는 태생이 다름) • 무료라는 이야기 듣고 고객이 들이댈 때 • 재정적으로 여유가 있을 때 • License에 대한 이해가 불충분한 경우
고객이 말합니다(feat. 불특정 다수의 갑님)
• 오픈 소스인데 추가 비용이 왜 필요하죠? 라이선스....? 뭐래.. • 아니 왜 오라클 보다 성능이 안 나오는것 같죠? • 오라클은 어쩌구, MySQL은 저쩌구, 나는 왕년에 #$1!@$#$..
MongoDB 이럴 때 쓰세요!
• 유연함과 확장이 필요할 때 • log data, SNS data 등을 적재할 때 • 다양한 open source와 연계할 때 (ex. Hadoop) • 서비스 구성 시 다양한 시도가 필요할 때 • 고객이 open source에 대한 이해가 충분할 때
“Rmongo” Package
• MongoDB interface for R • 인터페이스는 mongo-java-driver로의 java call을 통해 제공됨. • 0.0.25, GPL-3 • R( >= 2.14.1), Java( >= 1.6), MongoDB( >= 1.6)
“Rmongo” : Dis-advantage
• 성능 상의 아쉬움 • 인터페이스가 mongo-java-driver이기 때문에 java에 대한 두려움이 있는 이들에게는 장벽으로 다가올 수 있음 (단순 사용이 아닌 패키지 구조 확인 및 customizing에 있어서..)
“rmongodb” Package
• MongoDB interface for R • 인터페이스는 mongo-C-driver(ver 0.8) 를 이용하여 제공됨 • 1.8.0, Apache License • R( >= 2.10), MongoDB, GNU Make
“rmongodb” Dis-Advantage
• MongoDB 3.0 이상에서부터는 인증 이슈 존재 • 패키지 유지 문제와 신규 기능에 대한 릴리즈의 어려움 → Mongo-C-Driver 1.0+ 은 완전히 다른 API 가짐 → 즉 0.8에서 1.0으로 업그레이드 하려면 거의 처음부터 모든 패키지를 다시 써야 함
RMongo workflow
mongo <- mongoDbConnect("test", "localhost", 27017) output <- dbInsertDocument(mongo, "test_data", '{"foo": "bar"}')
output <- dbGetQuery(mongo, "test_data", '{"foo": "bar"}')
dbDisconnect(mongo)
rmongodb workflow
mongo <- mongo.create(host="localhost“,db=“test”) mongo.get.databases(mongo) ns=“test.test_data” buf=mongo.bson.buffer.create() Mongo.bson.buffer.append(buf,”foo”,”bar”) a=mongo.bson.from.buffer(buf) Mongo.insert(mongo,ns,a) mongo.find.all(mongo,ns) (or mongo.find.one(mongo,”test.test_data”, a) ) mongo.disconnect (mongo)
R + MongoDB의 매력(1)
• 꾸준히 발전하는 OpenSource (release 주기가 안정적) • 명확한 역할 구분 (r – visualization, mongodb – backend 저장소)
R + MongoDB의 매력(2)
• 대규모의 데이터를 다루는 R에게 NoSQL은 매력적인 선택 • 명확한 역할 구분 (r – visualization, mongodb – backend 저장소)
R + MongoDB의 매력(3)
• 이미 많은 Relational SQL 패키지가 존재. (RMySQL, RPostgreSQL, Roracle, RJDBC 등) • 하지만 이들의 문제는 모든 결과를 R 메모리상에서 read 한다는 것!
R + MongoDB의 매력(4)
• Rmongo 역시 같은 문제, 하지만 rmongodb는 그러한 문제에서 자유로움 • 위와 더불어 MongoDB가 bulk insert에서 탁월한 성능을 보임.
Tips 7. MongoDB상에 concurrent하게 데이터를 read/write 하고 싶다면...
mongodb.splitVector()를 써서
chunk 단위로 collection을 분리하고
각 chunk 상에 mclapply() 적용
감사합니다! [email protected] Special Thanks to Mr. Selivanov