Brendan McAdams explores the deeper relationship between the MongoDB database and various languages on the Java Virtual Machine such as Java, Scala, Clojure, JRuby and Python as well as the challenges posted getting MongoDB to play nice with these tools and their syntax. Also examined will be frameworks and integration points popular between MongoDB and the JVM such as Spring Data, Morphia and Lift’s MongoDB-Record component
3. Let’s Face It ...
SQL Sucks.
For some problems at least.
Tuesday, October 16, 12
4. Stuffing an object graph into a relational model is
like fitting a square peg into a round hole.
Tuesday, October 16, 12
5. Stuffing an object graph into a relational model is
like fitting a square peg into a round hole.
Databases should simplify application development - they
should present a model that fits naturally with our code
Tuesday, October 16, 12
16. MongoDB as a Database
• Document Oriented Data
Tuesday, October 16, 12
17. MongoDB as a Database
• Document Oriented Data
• Instead of flat row structures, “document oriented”
data (similar to JSON)
Tuesday, October 16, 12
18. MongoDB as a Database
• Document Oriented Data
• Instead of flat row structures, “document oriented”
data (similar to JSON)
• Rich: Embed other documents and arrays as values
Tuesday, October 16, 12
19. Rich Documents Represent MongoDB Data
{
“title”: “Programming Erlang: Software for a Concurrent World”,
“author”: “Joe Armstrong”,
“publicationYear”: 2007,
“publisher”: “The Pragmatic Programmers, LLC”,
}
Tuesday, October 16, 12
20. Rich Documents Represent MongoDB Data
{
“title”: “Programming Erlang: Software for a Concurrent World”,
“author”: “Joe Armstrong”,
“publicationYear”: 2007,
“publisher”: “The Pragmatic Programmers, LLC”,
}
Like JSON , MongoDB Documents are made up of key and
value pairs.
Tuesday, October 16, 12
26. Querying with MongoDB
• Querying in MongoDB is similar to a ‘query by example’
interface
Tuesday, October 16, 12
27. Querying with MongoDB
• Querying in MongoDB is similar to a ‘query by example’
interface
Tuesday, October 16, 12
28. Querying with MongoDB
• Querying in MongoDB is similar to a ‘query by example’
interface
• Finding items by exact match via “key” = “value”
Tuesday, October 16, 12
29. Querying with MongoDB
• Querying in MongoDB is similar to a ‘query by example’
interface
• Finding items by exact match via “key” = “value”
• Built-in Query Expressions for more advanced
statements
Tuesday, October 16, 12
30. Querying With MongoDB
> db.books.find({“author”: “Joe Armstrong”})
{
“title”: “Programming Erlang: Software for a Concurrent World”,
“author”: “Joe Armstrong”,
“publicationYear”: 2007,
“price”: {
"currency": "USD",
"discount": 24.14,
"msrp": 36.95
},
“publisher”: “The Pragmatic Programmers, LLC”,
“tags”: [
“erlang”,
“concurrent programming”,
“multicore”,
“programming”
]
}
Tuesday, October 16, 12
31. Querying With MongoDB
> db.books.find({“author”: “Joe Armstrong”})
{
“title”: “Programming Erlang: Software for a Concurrent World”,
“author”: “Joe Armstrong”,
“publicationYear”: 2007,
“price”: {
"currency": "USD",
"discount": 24.14,
"msrp": 36.95
},
“publisher”: “The Pragmatic Programmers, LLC”,
“tags”: [
“erlang”,
“concurrent programming”,
“multicore”,
“programming”
]
}
Basic queries consist of “key” = “value”
Tuesday, October 16, 12
32. Querying With MongoDB
> db.books.find({“price.currency”: “USD”})
{
“title”: “Programming Erlang: Software for a Concurrent World”,
“author”: “Joe Armstrong”,
“publicationYear”: 2007,
“price”: {
"currency": "USD",
"discount": 24.14,
"msrp": 36.95
},
“publisher”: “The Pragmatic Programmers, LLC”,
“tags”: [
“erlang”,
“concurrent programming”,
“multicore”,
“programming”
]
}
Tuesday, October 16, 12
33. Querying With MongoDB
> db.books.find({“price.currency”: “USD”})
{
“title”: “Programming Erlang: Software for a Concurrent World”,
“author”: “Joe Armstrong”,
“publicationYear”: 2007,
“price”: {
"currency": "USD",
"discount": 24.14,
"msrp": 36.95
},
“publisher”: “The Pragmatic Programmers, LLC”,
“tags”: [
“erlang”,
“concurrent programming”,
“multicore”,
“programming”
]
} Embedded docs can be accessed by
“key.subkey” = “value”
Tuesday, October 16, 12
34. Querying With MongoDB
> db.books.find({“tags”: “multicore”})
{
“title”: “Programming Erlang: Software for a Concurrent World”,
“author”: “Joe Armstrong”,
“publicationYear”: 2007,
“price”: {
"currency": "USD",
"discount": 24.14,
"msrp": 36.95
},
“publisher”: “The Pragmatic Programmers, LLC”,
“tags”: [
“erlang”,
“concurrent programming”,
“multicore”,
“programming”
]
}
Tuesday, October 16, 12
35. Querying With MongoDB
> db.books.find({“tags”: “multicore”})
{
“title”: “Programming Erlang: Software for a Concurrent World”,
“author”: “Joe Armstrong”,
“publicationYear”: 2007,
“price”: {
"currency": "USD",
"discount": 24.14,
"msrp": 36.95
},
“publisher”: “The Pragmatic Programmers, LLC”,
“tags”: [
“erlang”,
“concurrent programming”,
“multicore”,
“programming”
]
} Embedded arrays can be accessed by
matching just a single value from the array
Tuesday, October 16, 12
36. Querying With MongoDB
> db.books.find({“price.discount”: {$lt: 25.00}})
{
“title”: “Programming Erlang: Software for a Concurrent World”,
“author”: “Joe Armstrong”,
“publicationYear”: 2007,
“price”: {
"currency": "USD",
"discount": 24.14,
"msrp": 36.95
},
“publisher”: “The Pragmatic Programmers, LLC”,
“tags”: [
“erlang”,
“concurrent programming”,
“multicore”,
“programming”
]
}
Tuesday, October 16, 12
37. Querying With MongoDB
> db.books.find({“price.discount”: {$lt: 25.00}})
{
“title”: “Programming Erlang: Software for a Concurrent World”,
“author”: “Joe Armstrong”,
“publicationYear”: 2007,
“price”: {
"currency": "USD",
"discount": 24.14,
"msrp": 36.95
},
“publisher”: “The Pragmatic Programmers, LLC”,
“tags”: [
“erlang”,
“concurrent programming”,
“multicore”,
“programming”
]
} Finally, MongoDB provides a set of query expressions for
concepts such as greater than, less than, etc.
Tuesday, October 16, 12
39. MongoDB as a Database
• Scalability
Tuesday, October 16, 12
40. MongoDB as a Database
• Scalability
• Database should grow and scale with our application
Tuesday, October 16, 12
41. MongoDB as a Database
• Scalability
• Database should grow and scale with our application
• Replica Sets: Robust, modernized Replication Model with
automatic failover
Tuesday, October 16, 12
42. MongoDB as a Database
• Scalability
• Database should grow and scale with our application
• Replica Sets: Robust, modernized Replication Model with
automatic failover
• Sharding: n-scalable horizontal partitioning with automatic
management
Tuesday, October 16, 12
44. MongoDB on the JVM
• MongoDB has strong, wide support on the JVM
Tuesday, October 16, 12
45. MongoDB on the JVM
• MongoDB has strong, wide support on the JVM
• Java
Tuesday, October 16, 12
46. MongoDB on the JVM
• MongoDB has strong, wide support on the JVM
• Java
• Scala
Tuesday, October 16, 12
47. MongoDB on the JVM
• MongoDB has strong, wide support on the JVM
• Java
• Scala
• Hadoop
Tuesday, October 16, 12
48. MongoDB on the JVM
• MongoDB has strong, wide support on the JVM
• Java
• Scala
• Hadoop
• Also, fantastic work occurring in Clojure community
(see Monger - http://clojuremongodb.info/ )
Tuesday, October 16, 12
53. MongoDB + Java
• Java + MongoDB
• “Core” MongoDB Driver (mongo-java-driver)
• Manipulate MongoDB Docs as Map-like structures
• “Object Document Mapping” (like Hibernate, but less
painful)
Tuesday, October 16, 12
54. MongoDB + Java
• Java + MongoDB
• “Core” MongoDB Driver (mongo-java-driver)
• Manipulate MongoDB Docs as Map-like structures
• “Object Document Mapping” (like Hibernate, but less
painful)
• Morphia
Tuesday, October 16, 12
55. MongoDB + Java
• Java + MongoDB
• “Core” MongoDB Driver (mongo-java-driver)
• Manipulate MongoDB Docs as Map-like structures
• “Object Document Mapping” (like Hibernate, but less
painful)
• Morphia
• Map domain objects to MongoDB with JPA-like
annotations
Tuesday, October 16, 12
56. MongoDB + Java
• Java + MongoDB
• “Core” MongoDB Driver (mongo-java-driver)
• Manipulate MongoDB Docs as Map-like structures
• “Object Document Mapping” (like Hibernate, but less
painful)
• Morphia
• Map domain objects to MongoDB with JPA-like
annotations
• Spring Data
Tuesday, October 16, 12
57. MongoDB + Java
• Java + MongoDB
• “Core” MongoDB Driver (mongo-java-driver)
• Manipulate MongoDB Docs as Map-like structures
• “Object Document Mapping” (like Hibernate, but less
painful)
• Morphia
• Map domain objects to MongoDB with JPA-like
annotations
• Spring Data
• Spring ODM for many NoSQL databases, supports
MongoDB
Tuesday, October 16, 12
58. MongoDB + Java
• Java + MongoDB
• “Core” MongoDB Driver (mongo-java-driver)
• Manipulate MongoDB Docs as Map-like structures
• “Object Document Mapping” (like Hibernate, but less
painful)
• Morphia
• Map domain objects to MongoDB with JPA-like
annotations
• Spring Data
• Spring ODM for many NoSQL databases, supports
MongoDB
• GA Release announced today
Tuesday, October 16, 12
60. Core MongoDB + Java
The Mongo class represents a connection pool
com.mongodb.Mongo m = new Mongo();
Tuesday, October 16, 12
61. Core MongoDB + Java
The Mongo class represents a connection pool
com.mongodb.Mongo m = new Mongo();
The DB class represents a Database context
com.mongodb.DB db = m.getDB( "bookstore" );
Tuesday, October 16, 12
62. Core MongoDB + Java
The Mongo class represents a connection pool
com.mongodb.Mongo m = new Mongo();
The DB class represents a Database context
com.mongodb.DB db = m.getDB( "bookstore" );
The DBCollection class represents a Collection
(Mongo’s version of a table) handle
com.mongodb.DBCollection coll = db.getCollection( "books" );
Tuesday, October 16, 12
64. Core MongoDB + Java
Documents are represented by DBObject
com.mongodb.DBObject q = new BasicDBObject();
q.put( “tag”, “scala” );
q.put( “price”, new BasicDBObject( “$lt”, 40.00 ) );
Tuesday, October 16, 12
65. Core MongoDB + Java
Documents are represented by DBObject
com.mongodb.DBObject q = new BasicDBObject();
q.put( “tag”, “scala” );
q.put( “price”, new BasicDBObject( “$lt”, 40.00 ) );
Queries return a DBCursor, which is both
Iterator<DBObject> and Iterable<DBObject>
for ( DBObject doc : coll.find( q ) ) {
// ...
}
Tuesday, October 16, 12
67. Core MongoDB + Java
There is also a QueryBuilder helper class for
querying
DBObject q = QueryBuilder.start( “price” ).lessThan( 40.00 ).
and( “tag” ).is( “scala” ).get();
Tuesday, October 16, 12
68. Core MongoDB + Java
There is also a QueryBuilder helper class for
querying
DBObject q = QueryBuilder.start( “price” ).lessThan( 40.00 ).
and( “tag” ).is( “scala” ).get();
If you don’t fancy doing everything by hand, you
can use tools like Morphia to map domain objects
automatically...
Tuesday, October 16, 12
70. Object Mapping Java via Morphia
Morphia uses JPA-like Annotations to mark up
domain objects for MongoDB persistence
@Entity("books") // Book classes persist to / from “books”
class Book {}
Tuesday, October 16, 12
71. Object Mapping Java via Morphia
Morphia uses JPA-like Annotations to mark up
domain objects for MongoDB persistence
@Entity("books") // Book classes persist to / from “books”
class Book {}
Any field can be tagged as the primary key via the
@Id annotation
@Id private ObjectId id;
Tuesday, October 16, 12
72. Object Mapping Java via Morphia
Morphia uses JPA-like Annotations to mark up
domain objects for MongoDB persistence
@Entity("books") // Book classes persist to / from “books”
class Book {}
Any field can be tagged as the primary key via the
@Id annotation
@Id private ObjectId id;
List fields are automatically persisted as
MongoDB arrays
private List<String> tags = new ArrayList<String>();
Tuesday, October 16, 12
74. Object Mapping Java via Morphia
Complex sub-objects can be marked to either
“embed” or “reference” automatically
/**
* Could also use "reference", which are stored to
* their own collection and loaded automatically
*
* Morphia uses the field name for where to store the value,
*/
@Embedded private Price price;
Tuesday, October 16, 12
75. Object Mapping Java via Morphia
Complex sub-objects can be marked to either
“embed” or “reference” automatically
/**
* Could also use "reference", which are stored to
* their own collection and loaded automatically
*
* Morphia uses the field name for where to store the value,
*/
@Embedded private Price price;
It’s trivial to name a field one thing in MongoDB
and another in our Morphia model
/**
* Can rename a field for how stored in MongoDB
*/
@Property("publicationYear") private int year;
Tuesday, October 16, 12
79. MongoDB + Scala
• Scala + MongoDB
• “Core” MongoDB Driver (casbah)
•Wraps the Java driver, provides strong Scala API
Tuesday, October 16, 12
80. MongoDB + Scala
• Scala + MongoDB
• “Core” MongoDB Driver (casbah)
•Wraps the Java driver, provides strong Scala API
•Documents manipulated in a 2.8+ collections Map structure including
Builder, Factory and CanBuildFrom
Tuesday, October 16, 12
81. MongoDB + Scala
• Scala + MongoDB
• “Core” MongoDB Driver (casbah)
•Wraps the Java driver, provides strong Scala API
•Documents manipulated in a 2.8+ collections Map structure including
Builder, Factory and CanBuildFrom
•ODMs
Tuesday, October 16, 12
82. MongoDB + Scala
• Scala + MongoDB
• “Core” MongoDB Driver (casbah)
•Wraps the Java driver, provides strong Scala API
•Documents manipulated in a 2.8+ collections Map structure including
Builder, Factory and CanBuildFrom
•ODMs
• Salat - Case class mapping with some optional annotations, very
fast and lightweight
Tuesday, October 16, 12
83. MongoDB + Scala
• Scala + MongoDB
• “Core” MongoDB Driver (casbah)
•Wraps the Java driver, provides strong Scala API
•Documents manipulated in a 2.8+ collections Map structure including
Builder, Factory and CanBuildFrom
•ODMs
• Salat - Case class mapping with some optional annotations, very
fast and lightweight
• Lift - Popular Scala web framework includes a MongoDB ODM
layer based on the ActiveRecord pattern
Tuesday, October 16, 12
84. MongoDB + Scala
• Scala + MongoDB
• “Core” MongoDB Driver (casbah)
•Wraps the Java driver, provides strong Scala API
•Documents manipulated in a 2.8+ collections Map structure including
Builder, Factory and CanBuildFrom
•ODMs
• Salat - Case class mapping with some optional annotations, very
fast and lightweight
• Lift - Popular Scala web framework includes a MongoDB ODM
layer based on the ActiveRecord pattern
•Next-Generation Drivers (async focus) [Pure rewrites of driver]
Tuesday, October 16, 12
85. MongoDB + Scala
• Scala + MongoDB
• “Core” MongoDB Driver (casbah)
•Wraps the Java driver, provides strong Scala API
•Documents manipulated in a 2.8+ collections Map structure including
Builder, Factory and CanBuildFrom
•ODMs
• Salat - Case class mapping with some optional annotations, very
fast and lightweight
• Lift - Popular Scala web framework includes a MongoDB ODM
layer based on the ActiveRecord pattern
•Next-Generation Drivers (async focus) [Pure rewrites of driver]
• Hammersmith - my pet project, Netty + Akka.IO interfaces, strongly
functional and callback based
Tuesday, October 16, 12
86. MongoDB + Scala
• Scala + MongoDB
• “Core” MongoDB Driver (casbah)
•Wraps the Java driver, provides strong Scala API
•Documents manipulated in a 2.8+ collections Map structure including
Builder, Factory and CanBuildFrom
•ODMs
• Salat - Case class mapping with some optional annotations, very
fast and lightweight
• Lift - Popular Scala web framework includes a MongoDB ODM
layer based on the ActiveRecord pattern
•Next-Generation Drivers (async focus) [Pure rewrites of driver]
• Hammersmith - my pet project, Netty + Akka.IO interfaces, strongly
functional and callback based
• ReactiveMongo - from the amazing team @ Zenexity who brought us
the Play! Framework - new, but very promising
Tuesday, October 16, 12
90. Basic MongoDB + Scala via Casbah
Because it is a full Collection implementation,
construction Builder style is easy as well
val b = MongoDBObject.newBuilder
b += "foo" -> "bar"
b += "x" -> 5
b += "map" -> Map("spam" -> 8.2, "eggs" -> "bacon")
val dbObj = b.result
Tuesday, October 16, 12
91. Basic MongoDB + Scala via Casbah
Because it is a full Collection implementation,
construction Builder style is easy as well
val b = MongoDBObject.newBuilder
b += "foo" -> "bar"
b += "x" -> 5
b += "map" -> Map("spam" -> 8.2, "eggs" -> "bacon")
val dbObj = b.result
It’s even easy to start with a blank DBObject
val dbObj = MongoDBObject.empty
dbObj must beDBObject
dbObj must have size (0)
Tuesday, October 16, 12
93. Basic MongoDB + Scala via Casbah
While Casbah wraps the Java Driver for the
Mongo protocol, its API aims to be as Scala pure
as possible
val mongo: MongoCollection = MongoConnection()("bookstore")("books")
Tuesday, October 16, 12
94. Basic MongoDB + Scala via Casbah
While Casbah wraps the Java Driver for the
Mongo protocol, its API aims to be as Scala pure
as possible
val mongo: MongoCollection = MongoConnection()("bookstore")("books")
Casbah’s Cursors can easily be iterated in
standard Scala style
def findAll() = for ( book <- mongo.find() ) yield newBook(book)
findAll().foreach(b => println("<Book> " + b))
Tuesday, October 16, 12
96. Basic MongoDB + Scala via Casbah
Leveraging Scala’s great support for composable
DSLs, Casbah provides a Query DSL that feels
natural to a MongoDB user...
val q: DBObject = ("price" $lt 40.00) ++ ("tag" -> "scala")
Tuesday, October 16, 12
97. Basic MongoDB + Scala via Casbah
Leveraging Scala’s great support for composable
DSLs, Casbah provides a Query DSL that feels
natural to a MongoDB user...
val q: DBObject = ("price" $lt 40.00) ++ ("tag" -> "scala")
Like with Java, the Scala MongoDB Community
has created a few ways of mapping Objects as
well...
Tuesday, October 16, 12
99. Object Mapping in Scala via Lift
Lift uses an ActiveRecord style API for mapping
MongoDB + Scala
class Book private() extends BsonRecord[Book] with ObjectIdPk[Book]
{ }
Tuesday, October 16, 12
101. Object Mapping in Scala via Lift
Fields in Lift-Mongo are declared as objects
implementing a special typed trait.
object isbn extends StringField(this, 64)
Tuesday, October 16, 12
102. Object Mapping in Scala via Lift
Fields in Lift-Mongo are declared as objects
implementing a special typed trait.
object isbn extends StringField(this, 64)
Fields can be declared optional by overriding a
trait attribute
object edition extends StringField(this, 32) {
override def optional_? = true
}
Tuesday, October 16, 12
103. Object Mapping in Scala via Lift
Fields in Lift-Mongo are declared as objects
implementing a special typed trait.
object isbn extends StringField(this, 64)
Fields can be declared optional by overriding a
trait attribute
object edition extends StringField(this, 32) {
override def optional_? = true
}
And Lists can be automatically handled via a
MongoListField
object author extends MongoListField[Book, String](this)
Tuesday, October 16, 12
105. Object Mapping in Scala via Lift
Embedding objects represented by another entity
is easy as well
object price extends BsonRecordField(this, Price)
class Price private() extends BsonRecord[Price] {
// ...
object currency extends StringField(this, 3)
object discount extends DoubleField(this)
object msrp extends DoubleField(this)
}
Tuesday, October 16, 12
106. Object Mapping in Scala via Lift
Embedding objects represented by another entity
is easy as well
object price extends BsonRecordField(this, Price)
class Price private() extends BsonRecord[Price] {
// ...
object currency extends StringField(this, 3)
object discount extends DoubleField(this)
object msrp extends DoubleField(this)
}
To make working with Lift + MongoDB as easy as
possible, Foursquare has created a fantastic
Query DSL called Rogue:
https://github.com/foursquare/rogue
Tuesday, October 16, 12
108. Object Mapping in Scala via Lift
The downside to Lift is the need to use specially
structured objects. For those who want a less
formal API, Salat makes it easy...
Tuesday, October 16, 12
110. Object Mapping in Scala via Salat
Salat uses Scala’s case classes as the core of
their model (immutability is good!)
case class Book(id: ObjectId, author: Seq[Author], isbn: String,
price: Price, publicationYear: Int, tags: Seq[String],
title: String, publisher: String, edition: Option[String])
case class Author(name: String)
case class Price(currency: String, discount: Double, msrp: Double)
val authors = Seq( Author("Timothy Perrett") )
val price = Price("USD", 39.99, 39.99)
val tags = Seq("functional programming", "scala",
"web development", "lift", "#legendofklang")
val liftInAction = Book(new ObjectId, authors, "9781935182801",
price, 2011, tags,
"Lift in Action",
"Manning Publications Co.", Some("First"))
Tuesday, October 16, 12
112. Object Mapping in Scala via Salat
Persistence is made simple (through Scala
reflection) via the Grater object
/**
* The Salat Grater uses runtime Scala type reflection to
* generate a MongoDB Object.
*/
val dbo = grater[Book].asDBObject(liftInAction)
mongo.save(dbo)
Tuesday, October 16, 12
113. Object Mapping in Scala via Salat
Persistence is made simple (through Scala
reflection) via the Grater object
/**
* The Salat Grater uses runtime Scala type reflection to
* generate a MongoDB Object.
*/
val dbo = grater[Book].asDBObject(liftInAction)
mongo.save(dbo)
Some annotations are available to mark indexed
fields, etc but the core ideas in Salat are elegantly
simple
Tuesday, October 16, 12
117. MongoDB + Clojure
• Clojure + MongoDB
• “Core” MongoDB Driver (monger)
• Fairly new, similarities to Casbah, including a “native”
Query API
Tuesday, October 16, 12
118. MongoDB + Clojure
• Clojure + MongoDB
• “Core” MongoDB Driver (monger)
• Fairly new, similarities to Casbah, including a “native”
Query API
• Not officially supported
Tuesday, October 16, 12
119. MongoDB + Clojure
• Clojure + MongoDB
• “Core” MongoDB Driver (monger)
• Fairly new, similarities to Casbah, including a “native”
Query API
• Not officially supported
• The Monger team was nice enough to share some
snippets (my Clojure is a bit rusty)...
Tuesday, October 16, 12
121. Basic MongoDB + Clojure via Monger
Monger’s version of a Document is a simple
Clojure data structure
A Query API similar to Casbah’s is supported, and
very fluid
(monger.collection/find-maps collection {:price.discount {$lt 25.00}})
(monger.collection/update "things" { :_id oid } { $set { :weight 20.5 } })
Tuesday, October 16, 12
124. MongoDB + Hadoop
• Hadoop + MongoDB
• Hadoop integration with MongoDB is one of my key projects
at 10gen
Tuesday, October 16, 12
125. MongoDB + Hadoop
• Hadoop + MongoDB
• Hadoop integration with MongoDB is one of my key projects
at 10gen
• Feed MongoDB data directly (“live”) into MapReduce jobs & save
MapReduce results directly to MongoDB
Tuesday, October 16, 12
126. MongoDB + Hadoop
• Hadoop + MongoDB
• Hadoop integration with MongoDB is one of my key projects
at 10gen
• Feed MongoDB data directly (“live”) into MapReduce jobs & save
MapReduce results directly to MongoDB
• Coming Soon: Read/Write “archived BSON” (basically, MongoDB
Backup Files)
Tuesday, October 16, 12
127. MongoDB + Hadoop
• Hadoop + MongoDB
• Hadoop integration with MongoDB is one of my key projects
at 10gen
• Feed MongoDB data directly (“live”) into MapReduce jobs & save
MapReduce results directly to MongoDB
• Coming Soon: Read/Write “archived BSON” (basically, MongoDB
Backup Files)
• Support for “Core MapReduce” as well as the wider Hadoop
ecosystem
Tuesday, October 16, 12
128. MongoDB + Hadoop
• Hadoop + MongoDB
• Hadoop integration with MongoDB is one of my key projects
at 10gen
• Feed MongoDB data directly (“live”) into MapReduce jobs & save
MapReduce results directly to MongoDB
• Coming Soon: Read/Write “archived BSON” (basically, MongoDB
Backup Files)
• Support for “Core MapReduce” as well as the wider Hadoop
ecosystem
• Pig
Tuesday, October 16, 12
129. MongoDB + Hadoop
• Hadoop + MongoDB
• Hadoop integration with MongoDB is one of my key projects
at 10gen
• Feed MongoDB data directly (“live”) into MapReduce jobs & save
MapReduce results directly to MongoDB
• Coming Soon: Read/Write “archived BSON” (basically, MongoDB
Backup Files)
• Support for “Core MapReduce” as well as the wider Hadoop
ecosystem
• Pig
• Streaming
Tuesday, October 16, 12
130. MongoDB + Hadoop
• Hadoop + MongoDB
• Hadoop integration with MongoDB is one of my key projects
at 10gen
• Feed MongoDB data directly (“live”) into MapReduce jobs & save
MapReduce results directly to MongoDB
• Coming Soon: Read/Write “archived BSON” (basically, MongoDB
Backup Files)
• Support for “Core MapReduce” as well as the wider Hadoop
ecosystem
• Pig
• Streaming
• Hive & Scoobi (coming soon)
Tuesday, October 16, 12
131. MongoDB + Hadoop
• Hadoop + MongoDB
• Hadoop integration with MongoDB is one of my key projects
at 10gen
• Feed MongoDB data directly (“live”) into MapReduce jobs & save
MapReduce results directly to MongoDB
• Coming Soon: Read/Write “archived BSON” (basically, MongoDB
Backup Files)
• Support for “Core MapReduce” as well as the wider Hadoop
ecosystem
• Pig
• Streaming
• Hive & Scoobi (coming soon)
• See http://api.mongodb.org/hadoop to learn more
Tuesday, October 16, 12
132. [Want to Know More About MongoDB?]
Free Online Classes, Starting in October!
http://education.10gen.com
[Docs]
http://mongodb.org
http://api.mongodb.org/
*Contact Me*
brendan@10gen.com
(twitter: @rit)
Tuesday, October 16, 12