SlideShare ist ein Scribd-Unternehmen logo
1 von 43
Downloaden Sie, um offline zu lesen
at




                             Jonathan Marmor
                         Software Developer, exfm
                                jm@ex.fm
Tuesday, October 2, 12

Hi, I’m Jonathan Marmor, a software developer at exfm.

Today I’m going to talk about
* what exfm does,
* how exfm uses MongoDB,
* and tell you a little about the Monthly Music Hackathon I’m organizing.

First I should tell you a little about me, to lower your expectations a bit. :)
* musician, all of my schooling is in music
* use python as tool to help compose music
* not an expert in mongo
* not going to talk about advanced topics
* instead will talk basic practicalities of how mongo is used at exfm
* if you want more details,

     get in touch

     
    and I’ll pass you off to our CTO, Lucas
1. What does exfm do?
    2. How does exfm use MongoDB?
      1. Environment overview
      2. Models
      3. Server architecture
      4. Management and tools
      5. Future plans
    3. Monthly Music Hackathon NYC


Tuesday, October 2, 12

what exfm does:

  going to get into this in some depth


how exfm uses mongo:

environment

   which software we use

models

  how our data is organized,

  
   how our code is organized

server architecture

   brief overview of our hardware

management and tools

  monitoring, scripting, handy stuff

future plans

   how we’re going to blow it up

   
    and put it back together again


monthly music hackathon nyc: fun part
1. What does exfm do?
    2. How does exfm use MongoDB?
      1. Environment overview
      2. Models
      3. Server architecture
      4. Management and tools
      5. Future plans
    3. Monthly Music Hackathon NYC

Tuesday, October 2, 12
Browser extension


                            Turns websites into playlists




Tuesday, October 2, 12

We have a browser extension

   It turns websites into playlists

It makes it easier to listen to music which has been posted on a website

   For example: (next)
Soundcloud                                  Music player!

Tuesday, October 2, 12

For    example,

      if I visit this Soundcloud page

      
     with the extension installed

      
     
     it pops up on the bottom

Wow, a music player!

I can click play

    and start listening to the songs on this page
Expanded
         Soundcloud
                                                  music player!
Tuesday, October 2, 12

If I expand it

     * I can see the Playlist

     
    that was discovered on this website,

     * Re-order the songs,

     * Subscribe to be notified

     
    of new music posted to this website,

     * Love a song,

     * Share a song,

     * etc
Expanded
           Bandcamp
                          music player!
Tuesday, October 2, 12

Also works on Bandcamp,
Expanded
          archive.org
                                                      music player!
Tuesday, October 2, 12

and archive.org,

   and basically any other website with audio URLs

   
   or an open API to retrieve audio

(that we’ve implemented, of course)
Music I’ve posted                                     Full-width
     on my Tumblr blog                                    music player!
Tuesday, October 2, 12

And also Tumblr

but this actually isn’t a browser extension,

   it’s a plugin you can install on any website.

So visitors to the website

   get the exfm extension experience

   
    without having the extension installed

There’s a choice between the little guy in the bottom right

   and this full-width player.

But    let’s say you press play, and

       hear the strange sounds I’ve blogged about

       
    and think

       
    “What the heck is a Subharmonic Ogdoad with 12 Tones?”

So you go to wikipedia...
Navigate away and
                                 keep listening!
Tuesday, October 2, 12

Oops! The music stopped because I’m not on the music site anymore!

But not with the exfm extension. The music keeps playing.

Possibly the most can’t-live-without feature of the extension

is that you can navigate away from the page

    where you found the music

    
   you are listening to

and continue listening.

So the extension is handy and fun, but...

Only nerds use extensions

   Only a small percentage of our users have the extension installed

   
   The majority of our users use our Apps.
Push play, listen to music
                                            Webapp




Tuesday, October 2, 12

Where you can

  Push play and listen to music right away

we have a website: http://ex.fm

*   Search tens of millions of tracks
*   Subscribe to your friends’ loved songs
*   Share to FB, twitter, tumblr
*   Scrobble to lastfm
*   Explore the collection in a variety of ways
Push play, listen to music
                                     iOS




Tuesday, October 2, 12

also have iOS

   with a similar set of features

...and (next)
Push play, listen to music
                                             Android




Tuesday, October 2, 12

Android.

But    where does the content come from?

      It is all from Extensions and

      
     websites users are subscribed to

      
     
     (which we scrape for new audio).

So we’re not indiscriminately scraping the web for audio:

   We have an army of critics and connoisseurs

   
   getting to the most important music first,

and we have their

   listening,

   loving,

   and sharing data

   
    to help us bubble up the best music.
1. What does exfm do?
    2. How does exfm use MongoDB?
      1. Environment overview
      2. Models
      3. Server architecture
      4. Management and tools
      5. Future plans
    3. Monthly Music Hackathon NYC

Tuesday, October 2, 12

So that gives of quite a bit of data to take care of.

So now,

   we’ll shift gears

   
    and talk about how we deal with the data.
1. What does exfm do?
    2. How does exfm use MongoDB?
      1. Environment overview
      2. Models
      3. Server architecture
      4. Management and tools
      5. Future plans
    3. Monthly Music Hackathon NYC

Tuesday, October 2, 12

What are the core technologies we use?
Environment overview
                    • Amazon Web Services for all infrastructure
                    • Ubuntu
                    • Python
                    • Flask web framework
                    • Rabbit/Celery for background tasks
                    • Supervisord for process control
                    • Fabric for deployment and scripting
                    • MongoDB
Tuesday, October 2, 12

(read the slide)

and of course, MongoDB.

If you want to talk to me

    about any of the non-mongo items on this list

    
   please get in touch.
Environment overview
                    • MongoEngine
                                http://mongoengine.org/

                          "MongoEngine is a Document-Object
                         Mapper (think ORM, but for document
                         databases) for working with MongoDB
                              from Python. It uses a simple
                          declarative API, similar to the Django
                                         ORM."
Tuesday, October 2, 12

MongoEngine is a core part of how exfm uses Mongo.

Most of our application’s

  shape and logic

  
    are hung from subclasses of MongoEngine’s classes.

If you don’t know MongoEngine

    I highly encourage you to read the source code.

    
    It’s good stuff.

It makes it easy to describe your data

   and define methods for

   
   creating, getting, and modifying it.
Environment overview
                    • AWS CloudSearch
                         http://aws.amazon.com/cloudsearch/

                           "Amazon CloudSearch is a fully-
                         managed search service in the cloud”




Tuesday, October 2, 12

Amazon CloudSearch is also a core part of how we use Mongo.

It mercifully replaced Solr for us.

Allowed us to remove indexes of non-primary key fields.

   Many complex queries are done via CloudSearch.

We dump data from Mongo,

   upload to S3,

   
    CloudSearch indexes.
Queries to CloudSearch

   spit out primary keys of our Mongo collections

   
    so retrieval from Mongo is trivial.

   
    
   (from a query perspective)
1. What does exfm do?
    2. How does exfm use MongoDB?
      1. Environment overview
      2. Models
      3. Server architecture
      4. Management and tools
      5. Future plans
    3. Monthly Music Hackathon NYC

Tuesday, October 2, 12

So that’s our environment.

Now to our models.
Models
                                             Collections

                     • Songs
                     • Users
                     • Sites
                     • Many embedded documents
                     • Several collections thatUsers, Songs, and
                       relationships between
                                                express
                         Sites


Tuesday, October 2, 12

We     have three primary collections

       (that I’ll be talking about today)

       1. Songs

       2. Users

       3. Sites

Then we also have numerous embedded documents

  that are literally a part of the documents

  
    of the three primary collections.

And several collections

  that express relationships

  
    between

  
    
    songs

  
    
    users and

  
    
    sites
Models
                                     File organization



                     • Module for user.py, song.py,related
                       collections:
                                    each group of
                                                    site.py
                     • Base engine.py file MongoEngine middleware
                       building on top of
                                           with custom




Tuesday, October 2, 12

We     like to keep things simple:

       we have one file for each collection:

       
    song.py

       
    user.py

       
    site.py

Then an engine.py file

  where we extend some

  
    MongoEngine classes

  
    
   and have some custom middleware. (next)
Models
                                    Custom middleware
                     •   _ExfmDocument: convenience methods for
                         initializing, saving, reloading, and updating
                         documents and querying collections
                     •   _ExfmQuerySet: convenience methods for
                         handling query results, such as paging and updating
                         the returned documents
                     •   cached_property: decorator to cache a value in
                         the local object rather than grabbing from the DB
                     •   Logging setup



Tuesday, October 2, 12

_ExfmDocument:

   Base Class for all our document classes

   
   such as Song, User, and Site

has     convenience methods for initializing,

       saving,

       
   reloading, and

       
   
   updating

       
   
   
   documents and querying collections

_ExfmQuerySet:

   inherits mongoengine.queryset.QuerySet.

   
   Is what all our queries return.

has convenience methods for handling query results,

   such as paging and

   
   updating the returned documents

We     also have other nice little things in engine.py,

       like logging setup,

       
    document method wrappers,

       
    
   etc.
Models
                                        Primary Keys

                     •   Songs: sequential integers
                     •   Users: username string
                     •   Sites: MD5 hash of URL
                     •   Try to avoid too much variation in primary key size
                     •   Frequently use compound keys, eg:
                         jonathan_facebook, and deal with parsing the
                         string rather than using a complex query



Tuesday, October 2, 12

Now a bit about our schema design.

Choosing what your primary keys are is really important.

  Through trial and error,

  
   we’ve settled on IDs that

  
   
   don’t screw up performance

  
   
   
    and allow us to simplify queries.

We try to avoid extreme variation in ID length within a collection.

For example, if a URL is your ID,

   make a hash that has a fixed width.

http://ex.fm is not the same size as some super long URL.

Also, we use “compound keys” that have meaningful data in them.

   This allows us to skip some queries entirely:

For example: I have a UserService object’s key: “jonathan_facebook.”

   I don’t need the UserService object,

   
   I just need the User with username “jonathan”

So I just parse out the username from the UserService key

    and query the User collection with the username jonathan

    
    and skip querying the UserService collection.

There are several other ways compound keys are helpful as well.
Models
                                         Indexes


                     • Songs: sequential id, MD5 hash of URL
                     • Users: username, email, MD5 hash of
                       username
                     • Sites: MD5 hash of URL
                     • Always retrieve by MD5 hash

Tuesday, October 2, 12

Choosing which fields are indexed is also critical.

We used to have 5 to 10 indexes per collection.

   This created huge bloat in our memory usage.

So we try to get away with only accessing objects by primary key.
Models
                                     Common properties
                     •   strings, ints, booleans, dates... normal stuff
                     •   lists of strings, lists of embedded docs




Tuesday, October 2, 12

Remember when I said MongoEngine uses a

  declarative syntax

  
   for describing your data?

This is how it looks.

   You list your field names, and their data types

   
    and MongoEngine handles the

   
    
   marshalling and

   
    
   
    casting and

   
    
   
    
   dirty stuff.

You’ll see there are a variety of types of fields:

   strings, ints, dates,

   
    lists of strings,

   
    
    embedded documents,

   
    
    
    dictionaries,

   
    
    
    
    lists of embedded documents...

See that “image” field?

   EmbeddedDocumentField(SongImage)?

   
    (next)
Models
                         Example of embedded document




Tuesday, October 2, 12

That’s just some extra fields.

   From my perspective as a user, the main ramification of this pattern is that

   you can access the properties with dot notation, like:

   
    user.image.small

Also embedded docs can be repeated in lists.
Models
            Example of collection that expresses a relationship




Tuesday, October 2, 12

Here’s an example of a collection that has documents that express relationships between
docs in other collections.

The basic gist is that

   the song is added to a list of songs this user has loved.

But this isn’t done on a User object, it’s done in the _UserLoved collection,

    which has an object for each user,

    
    which is just a list of that user’s loved songs

    
    
    (plus some metadata and housekeeping stuff).
And the list of songs this user has loved,

    are embedded documents: the _UserLovedSong object

    
    which contains the data pertinent to the event of this user loving this song.

Then (not shown here)

  the mirror image of this process happens on the Song that is being loved:

  in other words,

  
    the user is added to a list of users who have loved the song.
Models
                                       Class methods
                         •   create, get_or_create, getters, setters




Tuesday, October 2, 12

Moving on,

  this these are examples of some typical methods

  
    that operate on the collection

  
    
    as opposed to operating on a document.

The first is the create method of the Song object.

   It actually instantiates a new Song instance,

   
    saves it to the remote DB,

   
    
    and returns it. Simple, but it’s a very nice shortcut:

   
    
    song.create(‘song_url’)

The seconds is Song.get_by_id.

   If this gets a list of IDs,

   
     it uses one of our custom helpers

   
     
    to get multiple songs from the DB

   
     
    
    and return them in the order we asked for them.

   If it gets a single ID,

   
     it just retrieves that song.
Models
                                  Instance methods




Tuesday, October 2, 12

And this is an example of a method

  that operates on a specific document from the song collection.

Calling .love on a Song instance

    and giving it a username,

    
    creates a new SongLovedUser

    
    
   which contains the user ID

    
    
   
    (and other data arising from the loving event)
then adds that object to a list of users

    who have loved this song
Models
                                     More advanced topics




                    •    Querying
                    •    Bucketing




Tuesday, October 2, 12

I’m not going to get into these here.

Our solution for dealing with complex queries:

   use CloudSearch.

Bucketing is our current solution

   for dealing with objects in the same collection

   
    that have very different size.

Send me an email if you want to know more.
1. What does exfm do?
    2. How does exfm use MongoDB?
      1. Environment overview
      2. Models
      3. Server architecture
      4. Management and tools
      5. Future plans
    3. Monthly Music Hackathon NYC

Tuesday, October 2, 12

So now briefly I’ll go over our server setup.

We use AWS for everything except our

   laptops, mobile phones, tablets, Raspberry Pis,

   
   and we’ve been talking about building a CNC lathe.
Server architecture

                     • One Primary: m2.4xlarge
                     • One Secondary: m2.4xlarge
                     • One Arbiter: t1.micro
                     • One shared all-in-one m1.large for staging

Tuesday, October 2, 12

We don’t do sharding clustering...

   we’re still on one gigantic machine.

Our primary is the recently released m2.4xlarge,

   which is a giant honking beast.

So is our secondary,

    which we fail over to should something happen to the primary.

    
   This has happened. Failover appears to work. :)

There is also a tiny “arbiter” machine.

Then we also have one machine for staging

  which we dump to periodically

  
   so it somewhat resembles production.
m2.4xlarge:
                “High-Memory Quadruple Extra Large Instance”

                              68.4 GB of memory
                                    64-bit
                              RAID0 EBS volume
                                Recent Ubuntu




Tuesday, October 2, 12

When these behemoth m2.4xlarges were recently released

  we immediately upgraded from m2.2xlarges.

All that extra memory has definitely made our lives easier.

    Fewer alerts in the middle of the night.

We have a somewhat elaborate Elastic Block Storage RAID0

   configuration which I didn’t set up.

Send me an email if you want to learn more about that.
1. What does exfm do?
    2. Who are you?
    3. How does exfm use MongoDB?
      1. Environment overview
      2. Models
      3. Server architecture
      4. Management and tools
      5. Future plans
    4. Monthly Music Hackathon NYC

Tuesday, October 2, 12

Here are a few of the tools we use to keep our sanity.
Management and tools
                                          Backup

                     • Use AWS EC2 tools in boto to snapshot
                         EBS volumes from secondary once per
                         hour
                     • 10gen’s backup-agent
                     • also sync to beta for staging (ok, that’s not
                         backup, but it’s a script that works similarly)


Tuesday, October 2, 12

Snapshots via AWS using Boto,

   which an amazing and comprehensive python client for all things AWS,

   
   in case you don’t know about it.
Management and tools
                                      Monitoring



                     • MMS
                     • AWS CloudWatch


Tuesday, October 2, 12

MMS is 10gen’s monitoring system for Mongo, which uses munin.

  It’s really terrific and critical.

AWS CloudWatch is Amazon’s monitoring system for all of their services.

  Is also terrific and critical for monitoring servers and network stuff.

CloudWatch has improved in the past year or so,

   and has made the great third party monitoring service,

   
   ServerDensity,

   
   
   unnecessary for us.
Management and tools
                                         Handy tools

                     • mongo shell: interactive JS shell. Get
                         collection stats, test queries, etc.
                     • mongotop: per-collection read write times
                     • iostat -x 2: Monitoring system I/O
                     • tail -f logs/mongo.out.log
Tuesday, October 2, 12

mongo shell:

  interactive JS shell. Get collection stats, test queries, etc.

mongotop:

  per-collection read write times

iostat -x 2:

    Monitoring system I/O

tail   -f logs/mongo.out.log:

      maybe the most important one.

      
    Only slow queries show up here.

      
    
   It’s a great way to find queries that are slowing you down,

      
    
   
     so you can fix them.

We use all of these (and others)

   multiple times a day.
1. What does exfm do?
    2. How does exfm use MongoDB?
      1. Environment overview
      2. Models
      3. Server architecture
      4. Management and tools
      5. Future plans
    3. Monthly Music Hackathon NYC

Tuesday, October 2, 12

Fortunately, we’re growing really fast.

   So we’re making some big changes

   
   to accommodate more users,

   
   
    more content,

   
   
    
   and more data.
Future plans
                • Split models into separate services


                         “Build fast, scale when necessary...

                           ...and it’s currently necessary.”




Tuesday, October 2, 12

We currently run one monolithic application

   with tightly coupled parts.

We’re in the process of splitting it into isolated HTTP services:

   User, Song, Site, Metadata processing, AlbumArt, LoveMachine, etc

Our biggest headache has been that

   a few thousand Songs have thousands of loves,

   
   but tens of millions have zero or one love.

The LoveMachine is a separate service

   designed to manage relationships between users and songs

   
   and will fix this problem.
Future plans
                    • Migrating from Python/Flask to NodeJS/
                         Express
                    • Mongoose is like MongoEngine for NodeJS
                                   http://mongoosejs.com/

                 “elegant mongodb object modeling for node.js”



Tuesday, October 2, 12

We’re switching from Python to Nodejs.

We have a good reason, though:

   The core competency of our staff is Javascript.

There are 9 of us at exfm

   7 are developers

   
   6 are most comfortable in JS.

   
   
    I’m the lone Python guy. :(

   
   
    
    But I’m getting a crash course, and that’s fun.

Mongoose, the Mongo ORM for Node, is great so far.

  I’m just getting started using it.
1. What does exfm do?
    2. How does exfm use MongoDB?
      1. Environment overview
      2. Models
      3. Server architecture
      4. Management and tools
      5. Future plans
    3. Monthly Music Hackathon NYC

Tuesday, October 2, 12

And now for the funner part.
Saturday, October 20th

                    10 AM hacking starts / 8 PM concert of hacks
                                      in Soho

                               @musichackathon
                            monthlymusichackathon.org
Tuesday, October 2, 12

If you are a musician

    or have an interest in music, please come.

FREE!

The idea is to hack on music,

   and for the attendees (you) to decide what that means.

It could mean

    working with music streaming company’s APIs,

    
   soldering together a new musical instrument,

    
   
   analyzing a library of music with DSP software,

    
   
   
   or rapidly writing and performing a new piece of music.

It ends with a concert of the hacks created that day.

Ensemble in residence this month:

   amazing virtuosic classical guitar/flute duo, that plays some insane music.

Sponsored in part by 10gen and exfm.
Thank you!

                                        at




                             Jonathan Marmor
                         Software Developer, exfm
                                jm@ex.fm
Tuesday, October 2, 12

Thanks so much for listening to me.

Please get in touch

   if you want to know more

   
    about exfm or the hackathon.

Weitere ähnliche Inhalte

Andere mochten auch

Data meets Creativity - Webbdagarna 2015
Data meets Creativity - Webbdagarna 2015Data meets Creativity - Webbdagarna 2015
Data meets Creativity - Webbdagarna 2015Webrepublic
 
Strongly Typed Languages and Flexible Schemas
Strongly Typed Languages and Flexible SchemasStrongly Typed Languages and Flexible Schemas
Strongly Typed Languages and Flexible SchemasNorberto Leite
 
Revving Up Revenue By Replenishing
Revving Up Revenue By ReplenishingRevving Up Revenue By Replenishing
Revving Up Revenue By ReplenishingWhatConts
 
R Statistics With MongoDB
R Statistics With MongoDBR Statistics With MongoDB
R Statistics With MongoDBMongoDB
 
Review: Leadership Frameworks
Review: Leadership FrameworksReview: Leadership Frameworks
Review: Leadership FrameworksMariam Nazarudin
 
Old & wise(에듀시니어)
Old & wise(에듀시니어)Old & wise(에듀시니어)
Old & wise(에듀시니어)Jungku Hong
 
Amadeus big data
Amadeus big dataAmadeus big data
Amadeus big data승필 고
 
VirtualSense presentation at FBK
VirtualSense presentation at FBKVirtualSense presentation at FBK
VirtualSense presentation at FBKAlessandro Bogliolo
 
O Diferencial de uma Estratégia Mobile...e Multiplataforma!
O Diferencial de uma Estratégia Mobile...e Multiplataforma!O Diferencial de uma Estratégia Mobile...e Multiplataforma!
O Diferencial de uma Estratégia Mobile...e Multiplataforma!Xpand IT
 
Grow Customer Retention with Predictive Marketing and User-Generated Content
Grow Customer Retention with Predictive Marketing and User-Generated ContentGrow Customer Retention with Predictive Marketing and User-Generated Content
Grow Customer Retention with Predictive Marketing and User-Generated ContentWhatConts
 
Migrating to git
Migrating to gitMigrating to git
Migrating to gitXpand IT
 
Microsoft xamarin-experience
Microsoft xamarin-experienceMicrosoft xamarin-experience
Microsoft xamarin-experienceXpand IT
 
Leinster college dublin - brochure web
Leinster college   dublin - brochure webLeinster college   dublin - brochure web
Leinster college dublin - brochure webThiago Pimentel
 
Av capabilities presentation
Av capabilities presentationAv capabilities presentation
Av capabilities presentationNAISales2
 

Andere mochten auch (17)

Data meets Creativity - Webbdagarna 2015
Data meets Creativity - Webbdagarna 2015Data meets Creativity - Webbdagarna 2015
Data meets Creativity - Webbdagarna 2015
 
Strongly Typed Languages and Flexible Schemas
Strongly Typed Languages and Flexible SchemasStrongly Typed Languages and Flexible Schemas
Strongly Typed Languages and Flexible Schemas
 
Revving Up Revenue By Replenishing
Revving Up Revenue By ReplenishingRevving Up Revenue By Replenishing
Revving Up Revenue By Replenishing
 
R Statistics With MongoDB
R Statistics With MongoDBR Statistics With MongoDB
R Statistics With MongoDB
 
Review: Leadership Frameworks
Review: Leadership FrameworksReview: Leadership Frameworks
Review: Leadership Frameworks
 
Old & wise(에듀시니어)
Old & wise(에듀시니어)Old & wise(에듀시니어)
Old & wise(에듀시니어)
 
Amadeus big data
Amadeus big dataAmadeus big data
Amadeus big data
 
Creative Overview
Creative OverviewCreative Overview
Creative Overview
 
VirtualSense presentation at FBK
VirtualSense presentation at FBKVirtualSense presentation at FBK
VirtualSense presentation at FBK
 
O Diferencial de uma Estratégia Mobile...e Multiplataforma!
O Diferencial de uma Estratégia Mobile...e Multiplataforma!O Diferencial de uma Estratégia Mobile...e Multiplataforma!
O Diferencial de uma Estratégia Mobile...e Multiplataforma!
 
Grow Customer Retention with Predictive Marketing and User-Generated Content
Grow Customer Retention with Predictive Marketing and User-Generated ContentGrow Customer Retention with Predictive Marketing and User-Generated Content
Grow Customer Retention with Predictive Marketing and User-Generated Content
 
Migrating to git
Migrating to gitMigrating to git
Migrating to git
 
Anti-social Databases
Anti-social DatabasesAnti-social Databases
Anti-social Databases
 
Microsoft xamarin-experience
Microsoft xamarin-experienceMicrosoft xamarin-experience
Microsoft xamarin-experience
 
Ov big data
Ov big dataOv big data
Ov big data
 
Leinster college dublin - brochure web
Leinster college   dublin - brochure webLeinster college   dublin - brochure web
Leinster college dublin - brochure web
 
Av capabilities presentation
Av capabilities presentationAv capabilities presentation
Av capabilities presentation
 

Ähnlich wie MongoDB at ex.fm

The Streams of Our Lives - Visualizing Listening Histories in Context
The Streams of Our Lives - Visualizing Listening Histories in ContextThe Streams of Our Lives - Visualizing Listening Histories in Context
The Streams of Our Lives - Visualizing Listening Histories in ContextDominikus Baur
 
Towards a musical Semantic Web
Towards a musical Semantic WebTowards a musical Semantic Web
Towards a musical Semantic WebYves Raimond
 
Anghami: From Billions Of Streams To Better Recommendations
Anghami: From Billions Of Streams To Better RecommendationsAnghami: From Billions Of Streams To Better Recommendations
Anghami: From Billions Of Streams To Better RecommendationsRamzi Karam
 
File Sharing Should Not Be Illegal
File Sharing Should Not Be IllegalFile Sharing Should Not Be Illegal
File Sharing Should Not Be IllegalSherry Bailey
 
Free Software for Free Sound
Free Software for Free SoundFree Software for Free Sound
Free Software for Free SoundXavier Amatriain
 
Year 13 proposal template
Year 13 proposal templateYear 13 proposal template
Year 13 proposal templateMatthewHazel1
 
Open Source Software and Libraries
Open Source Software and LibrariesOpen Source Software and Libraries
Open Source Software and LibrariesEllyssa Kroski
 
Building an Open Source iOS app: lessons learned
Building an Open Source iOS app: lessons learnedBuilding an Open Source iOS app: lessons learned
Building an Open Source iOS app: lessons learnedWojciech Koszek
 
Los Angeles R users group - Nov 17 2010 - Part 2
Los Angeles R users group - Nov 17 2010 - Part 2Los Angeles R users group - Nov 17 2010 - Part 2
Los Angeles R users group - Nov 17 2010 - Part 2rusersla
 
The State of the Social Desktop 2009
The State of the Social Desktop 2009The State of the Social Desktop 2009
The State of the Social Desktop 2009Frank Karlitschek
 
Web browser(pp ts)
Web browser(pp ts)Web browser(pp ts)
Web browser(pp ts)darpan1118
 
Music Hackday Boston - The Last.fm API
Music Hackday Boston - The Last.fm APIMusic Hackday Boston - The Last.fm API
Music Hackday Boston - The Last.fm APIdavidsingleton
 
Building Corpora from Social Media
Building Corpora from Social MediaBuilding Corpora from Social Media
Building Corpora from Social MediaRichard Littauer
 
The secret life_of_open_source
The secret life_of_open_sourceThe secret life_of_open_source
The secret life_of_open_sourceTed Husted
 
Leveraging External Resources
Leveraging External ResourcesLeveraging External Resources
Leveraging External ResourcesLaunch 48
 
J-P. Fauconnier, J. Roumier. Musonto - A Semantic Search Engine Dedicated to ...
J-P. Fauconnier, J. Roumier. Musonto - A Semantic Search Engine Dedicated to ...J-P. Fauconnier, J. Roumier. Musonto - A Semantic Search Engine Dedicated to ...
J-P. Fauconnier, J. Roumier. Musonto - A Semantic Search Engine Dedicated to ...MusicNet
 
Fa12 w200-w3-part2
Fa12 w200-w3-part2Fa12 w200-w3-part2
Fa12 w200-w3-part2educw200
 
Anthropological fieldwork in Ubuntu Linux
Anthropological fieldwork in Ubuntu LinuxAnthropological fieldwork in Ubuntu Linux
Anthropological fieldwork in Ubuntu LinuxAndreas Lloyd
 

Ähnlich wie MongoDB at ex.fm (20)

The Streams of Our Lives - Visualizing Listening Histories in Context
The Streams of Our Lives - Visualizing Listening Histories in ContextThe Streams of Our Lives - Visualizing Listening Histories in Context
The Streams of Our Lives - Visualizing Listening Histories in Context
 
Towards a musical Semantic Web
Towards a musical Semantic WebTowards a musical Semantic Web
Towards a musical Semantic Web
 
Anghami: From Billions Of Streams To Better Recommendations
Anghami: From Billions Of Streams To Better RecommendationsAnghami: From Billions Of Streams To Better Recommendations
Anghami: From Billions Of Streams To Better Recommendations
 
Podcasting101
Podcasting101Podcasting101
Podcasting101
 
MUSIC APPLICATION (1).pdf
MUSIC   APPLICATION (1).pdfMUSIC   APPLICATION (1).pdf
MUSIC APPLICATION (1).pdf
 
File Sharing Should Not Be Illegal
File Sharing Should Not Be IllegalFile Sharing Should Not Be Illegal
File Sharing Should Not Be Illegal
 
Free Software for Free Sound
Free Software for Free SoundFree Software for Free Sound
Free Software for Free Sound
 
Year 13 proposal template
Year 13 proposal templateYear 13 proposal template
Year 13 proposal template
 
Open Source Software and Libraries
Open Source Software and LibrariesOpen Source Software and Libraries
Open Source Software and Libraries
 
Building an Open Source iOS app: lessons learned
Building an Open Source iOS app: lessons learnedBuilding an Open Source iOS app: lessons learned
Building an Open Source iOS app: lessons learned
 
Los Angeles R users group - Nov 17 2010 - Part 2
Los Angeles R users group - Nov 17 2010 - Part 2Los Angeles R users group - Nov 17 2010 - Part 2
Los Angeles R users group - Nov 17 2010 - Part 2
 
The State of the Social Desktop 2009
The State of the Social Desktop 2009The State of the Social Desktop 2009
The State of the Social Desktop 2009
 
Web browser(pp ts)
Web browser(pp ts)Web browser(pp ts)
Web browser(pp ts)
 
Music Hackday Boston - The Last.fm API
Music Hackday Boston - The Last.fm APIMusic Hackday Boston - The Last.fm API
Music Hackday Boston - The Last.fm API
 
Building Corpora from Social Media
Building Corpora from Social MediaBuilding Corpora from Social Media
Building Corpora from Social Media
 
The secret life_of_open_source
The secret life_of_open_sourceThe secret life_of_open_source
The secret life_of_open_source
 
Leveraging External Resources
Leveraging External ResourcesLeveraging External Resources
Leveraging External Resources
 
J-P. Fauconnier, J. Roumier. Musonto - A Semantic Search Engine Dedicated to ...
J-P. Fauconnier, J. Roumier. Musonto - A Semantic Search Engine Dedicated to ...J-P. Fauconnier, J. Roumier. Musonto - A Semantic Search Engine Dedicated to ...
J-P. Fauconnier, J. Roumier. Musonto - A Semantic Search Engine Dedicated to ...
 
Fa12 w200-w3-part2
Fa12 w200-w3-part2Fa12 w200-w3-part2
Fa12 w200-w3-part2
 
Anthropological fieldwork in Ubuntu Linux
Anthropological fieldwork in Ubuntu LinuxAnthropological fieldwork in Ubuntu Linux
Anthropological fieldwork in Ubuntu Linux
 

Mehr von MongoDB

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump StartMongoDB
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB
 

Mehr von MongoDB (20)

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
 

Kürzlich hochgeladen

Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 

Kürzlich hochgeladen (20)

Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 

MongoDB at ex.fm

  • 1. at Jonathan Marmor Software Developer, exfm jm@ex.fm Tuesday, October 2, 12 Hi, I’m Jonathan Marmor, a software developer at exfm. Today I’m going to talk about * what exfm does, * how exfm uses MongoDB, * and tell you a little about the Monthly Music Hackathon I’m organizing. First I should tell you a little about me, to lower your expectations a bit. :) * musician, all of my schooling is in music * use python as tool to help compose music * not an expert in mongo * not going to talk about advanced topics * instead will talk basic practicalities of how mongo is used at exfm * if you want more details, get in touch and I’ll pass you off to our CTO, Lucas
  • 2. 1. What does exfm do? 2. How does exfm use MongoDB? 1. Environment overview 2. Models 3. Server architecture 4. Management and tools 5. Future plans 3. Monthly Music Hackathon NYC Tuesday, October 2, 12 what exfm does: going to get into this in some depth how exfm uses mongo: environment which software we use models how our data is organized, how our code is organized server architecture brief overview of our hardware management and tools monitoring, scripting, handy stuff future plans how we’re going to blow it up and put it back together again monthly music hackathon nyc: fun part
  • 3. 1. What does exfm do? 2. How does exfm use MongoDB? 1. Environment overview 2. Models 3. Server architecture 4. Management and tools 5. Future plans 3. Monthly Music Hackathon NYC Tuesday, October 2, 12
  • 4. Browser extension Turns websites into playlists Tuesday, October 2, 12 We have a browser extension It turns websites into playlists It makes it easier to listen to music which has been posted on a website For example: (next)
  • 5. Soundcloud Music player! Tuesday, October 2, 12 For example, if I visit this Soundcloud page with the extension installed it pops up on the bottom Wow, a music player! I can click play and start listening to the songs on this page
  • 6. Expanded Soundcloud music player! Tuesday, October 2, 12 If I expand it * I can see the Playlist that was discovered on this website, * Re-order the songs, * Subscribe to be notified of new music posted to this website, * Love a song, * Share a song, * etc
  • 7. Expanded Bandcamp music player! Tuesday, October 2, 12 Also works on Bandcamp,
  • 8. Expanded archive.org music player! Tuesday, October 2, 12 and archive.org, and basically any other website with audio URLs or an open API to retrieve audio (that we’ve implemented, of course)
  • 9. Music I’ve posted Full-width on my Tumblr blog music player! Tuesday, October 2, 12 And also Tumblr but this actually isn’t a browser extension, it’s a plugin you can install on any website. So visitors to the website get the exfm extension experience without having the extension installed There’s a choice between the little guy in the bottom right and this full-width player. But let’s say you press play, and hear the strange sounds I’ve blogged about and think “What the heck is a Subharmonic Ogdoad with 12 Tones?” So you go to wikipedia...
  • 10. Navigate away and keep listening! Tuesday, October 2, 12 Oops! The music stopped because I’m not on the music site anymore! But not with the exfm extension. The music keeps playing. Possibly the most can’t-live-without feature of the extension is that you can navigate away from the page where you found the music you are listening to and continue listening. So the extension is handy and fun, but... Only nerds use extensions Only a small percentage of our users have the extension installed The majority of our users use our Apps.
  • 11. Push play, listen to music Webapp Tuesday, October 2, 12 Where you can Push play and listen to music right away we have a website: http://ex.fm * Search tens of millions of tracks * Subscribe to your friends’ loved songs * Share to FB, twitter, tumblr * Scrobble to lastfm * Explore the collection in a variety of ways
  • 12. Push play, listen to music iOS Tuesday, October 2, 12 also have iOS with a similar set of features ...and (next)
  • 13. Push play, listen to music Android Tuesday, October 2, 12 Android. But where does the content come from? It is all from Extensions and websites users are subscribed to (which we scrape for new audio). So we’re not indiscriminately scraping the web for audio: We have an army of critics and connoisseurs getting to the most important music first, and we have their listening, loving, and sharing data to help us bubble up the best music.
  • 14. 1. What does exfm do? 2. How does exfm use MongoDB? 1. Environment overview 2. Models 3. Server architecture 4. Management and tools 5. Future plans 3. Monthly Music Hackathon NYC Tuesday, October 2, 12 So that gives of quite a bit of data to take care of. So now, we’ll shift gears and talk about how we deal with the data.
  • 15. 1. What does exfm do? 2. How does exfm use MongoDB? 1. Environment overview 2. Models 3. Server architecture 4. Management and tools 5. Future plans 3. Monthly Music Hackathon NYC Tuesday, October 2, 12 What are the core technologies we use?
  • 16. Environment overview • Amazon Web Services for all infrastructure • Ubuntu • Python • Flask web framework • Rabbit/Celery for background tasks • Supervisord for process control • Fabric for deployment and scripting • MongoDB Tuesday, October 2, 12 (read the slide) and of course, MongoDB. If you want to talk to me about any of the non-mongo items on this list please get in touch.
  • 17. Environment overview • MongoEngine http://mongoengine.org/ "MongoEngine is a Document-Object Mapper (think ORM, but for document databases) for working with MongoDB from Python. It uses a simple declarative API, similar to the Django ORM." Tuesday, October 2, 12 MongoEngine is a core part of how exfm uses Mongo. Most of our application’s shape and logic are hung from subclasses of MongoEngine’s classes. If you don’t know MongoEngine I highly encourage you to read the source code. It’s good stuff. It makes it easy to describe your data and define methods for creating, getting, and modifying it.
  • 18. Environment overview • AWS CloudSearch http://aws.amazon.com/cloudsearch/ "Amazon CloudSearch is a fully- managed search service in the cloud” Tuesday, October 2, 12 Amazon CloudSearch is also a core part of how we use Mongo. It mercifully replaced Solr for us. Allowed us to remove indexes of non-primary key fields. Many complex queries are done via CloudSearch. We dump data from Mongo, upload to S3, CloudSearch indexes. Queries to CloudSearch spit out primary keys of our Mongo collections so retrieval from Mongo is trivial. (from a query perspective)
  • 19. 1. What does exfm do? 2. How does exfm use MongoDB? 1. Environment overview 2. Models 3. Server architecture 4. Management and tools 5. Future plans 3. Monthly Music Hackathon NYC Tuesday, October 2, 12 So that’s our environment. Now to our models.
  • 20. Models Collections • Songs • Users • Sites • Many embedded documents • Several collections thatUsers, Songs, and relationships between express Sites Tuesday, October 2, 12 We have three primary collections (that I’ll be talking about today) 1. Songs 2. Users 3. Sites Then we also have numerous embedded documents that are literally a part of the documents of the three primary collections. And several collections that express relationships between songs users and sites
  • 21. Models File organization • Module for user.py, song.py,related collections: each group of site.py • Base engine.py file MongoEngine middleware building on top of with custom Tuesday, October 2, 12 We like to keep things simple: we have one file for each collection: song.py user.py site.py Then an engine.py file where we extend some MongoEngine classes and have some custom middleware. (next)
  • 22. Models Custom middleware • _ExfmDocument: convenience methods for initializing, saving, reloading, and updating documents and querying collections • _ExfmQuerySet: convenience methods for handling query results, such as paging and updating the returned documents • cached_property: decorator to cache a value in the local object rather than grabbing from the DB • Logging setup Tuesday, October 2, 12 _ExfmDocument: Base Class for all our document classes such as Song, User, and Site has convenience methods for initializing, saving, reloading, and updating documents and querying collections _ExfmQuerySet: inherits mongoengine.queryset.QuerySet. Is what all our queries return. has convenience methods for handling query results, such as paging and updating the returned documents We also have other nice little things in engine.py, like logging setup, document method wrappers, etc.
  • 23. Models Primary Keys • Songs: sequential integers • Users: username string • Sites: MD5 hash of URL • Try to avoid too much variation in primary key size • Frequently use compound keys, eg: jonathan_facebook, and deal with parsing the string rather than using a complex query Tuesday, October 2, 12 Now a bit about our schema design. Choosing what your primary keys are is really important. Through trial and error, we’ve settled on IDs that don’t screw up performance and allow us to simplify queries. We try to avoid extreme variation in ID length within a collection. For example, if a URL is your ID, make a hash that has a fixed width. http://ex.fm is not the same size as some super long URL. Also, we use “compound keys” that have meaningful data in them. This allows us to skip some queries entirely: For example: I have a UserService object’s key: “jonathan_facebook.” I don’t need the UserService object, I just need the User with username “jonathan” So I just parse out the username from the UserService key and query the User collection with the username jonathan and skip querying the UserService collection. There are several other ways compound keys are helpful as well.
  • 24. Models Indexes • Songs: sequential id, MD5 hash of URL • Users: username, email, MD5 hash of username • Sites: MD5 hash of URL • Always retrieve by MD5 hash Tuesday, October 2, 12 Choosing which fields are indexed is also critical. We used to have 5 to 10 indexes per collection. This created huge bloat in our memory usage. So we try to get away with only accessing objects by primary key.
  • 25. Models Common properties • strings, ints, booleans, dates... normal stuff • lists of strings, lists of embedded docs Tuesday, October 2, 12 Remember when I said MongoEngine uses a declarative syntax for describing your data? This is how it looks. You list your field names, and their data types and MongoEngine handles the marshalling and casting and dirty stuff. You’ll see there are a variety of types of fields: strings, ints, dates, lists of strings, embedded documents, dictionaries, lists of embedded documents... See that “image” field? EmbeddedDocumentField(SongImage)? (next)
  • 26. Models Example of embedded document Tuesday, October 2, 12 That’s just some extra fields. From my perspective as a user, the main ramification of this pattern is that you can access the properties with dot notation, like: user.image.small Also embedded docs can be repeated in lists.
  • 27. Models Example of collection that expresses a relationship Tuesday, October 2, 12 Here’s an example of a collection that has documents that express relationships between docs in other collections. The basic gist is that the song is added to a list of songs this user has loved. But this isn’t done on a User object, it’s done in the _UserLoved collection, which has an object for each user, which is just a list of that user’s loved songs (plus some metadata and housekeeping stuff). And the list of songs this user has loved, are embedded documents: the _UserLovedSong object which contains the data pertinent to the event of this user loving this song. Then (not shown here) the mirror image of this process happens on the Song that is being loved: in other words, the user is added to a list of users who have loved the song.
  • 28. Models Class methods • create, get_or_create, getters, setters Tuesday, October 2, 12 Moving on, this these are examples of some typical methods that operate on the collection as opposed to operating on a document. The first is the create method of the Song object. It actually instantiates a new Song instance, saves it to the remote DB, and returns it. Simple, but it’s a very nice shortcut: song.create(‘song_url’) The seconds is Song.get_by_id. If this gets a list of IDs, it uses one of our custom helpers to get multiple songs from the DB and return them in the order we asked for them. If it gets a single ID, it just retrieves that song.
  • 29. Models Instance methods Tuesday, October 2, 12 And this is an example of a method that operates on a specific document from the song collection. Calling .love on a Song instance and giving it a username, creates a new SongLovedUser which contains the user ID (and other data arising from the loving event) then adds that object to a list of users who have loved this song
  • 30. Models More advanced topics • Querying • Bucketing Tuesday, October 2, 12 I’m not going to get into these here. Our solution for dealing with complex queries: use CloudSearch. Bucketing is our current solution for dealing with objects in the same collection that have very different size. Send me an email if you want to know more.
  • 31. 1. What does exfm do? 2. How does exfm use MongoDB? 1. Environment overview 2. Models 3. Server architecture 4. Management and tools 5. Future plans 3. Monthly Music Hackathon NYC Tuesday, October 2, 12 So now briefly I’ll go over our server setup. We use AWS for everything except our laptops, mobile phones, tablets, Raspberry Pis, and we’ve been talking about building a CNC lathe.
  • 32. Server architecture • One Primary: m2.4xlarge • One Secondary: m2.4xlarge • One Arbiter: t1.micro • One shared all-in-one m1.large for staging Tuesday, October 2, 12 We don’t do sharding clustering... we’re still on one gigantic machine. Our primary is the recently released m2.4xlarge, which is a giant honking beast. So is our secondary, which we fail over to should something happen to the primary. This has happened. Failover appears to work. :) There is also a tiny “arbiter” machine. Then we also have one machine for staging which we dump to periodically so it somewhat resembles production.
  • 33. m2.4xlarge: “High-Memory Quadruple Extra Large Instance” 68.4 GB of memory 64-bit RAID0 EBS volume Recent Ubuntu Tuesday, October 2, 12 When these behemoth m2.4xlarges were recently released we immediately upgraded from m2.2xlarges. All that extra memory has definitely made our lives easier. Fewer alerts in the middle of the night. We have a somewhat elaborate Elastic Block Storage RAID0 configuration which I didn’t set up. Send me an email if you want to learn more about that.
  • 34. 1. What does exfm do? 2. Who are you? 3. How does exfm use MongoDB? 1. Environment overview 2. Models 3. Server architecture 4. Management and tools 5. Future plans 4. Monthly Music Hackathon NYC Tuesday, October 2, 12 Here are a few of the tools we use to keep our sanity.
  • 35. Management and tools Backup • Use AWS EC2 tools in boto to snapshot EBS volumes from secondary once per hour • 10gen’s backup-agent • also sync to beta for staging (ok, that’s not backup, but it’s a script that works similarly) Tuesday, October 2, 12 Snapshots via AWS using Boto, which an amazing and comprehensive python client for all things AWS, in case you don’t know about it.
  • 36. Management and tools Monitoring • MMS • AWS CloudWatch Tuesday, October 2, 12 MMS is 10gen’s monitoring system for Mongo, which uses munin. It’s really terrific and critical. AWS CloudWatch is Amazon’s monitoring system for all of their services. Is also terrific and critical for monitoring servers and network stuff. CloudWatch has improved in the past year or so, and has made the great third party monitoring service, ServerDensity, unnecessary for us.
  • 37. Management and tools Handy tools • mongo shell: interactive JS shell. Get collection stats, test queries, etc. • mongotop: per-collection read write times • iostat -x 2: Monitoring system I/O • tail -f logs/mongo.out.log Tuesday, October 2, 12 mongo shell: interactive JS shell. Get collection stats, test queries, etc. mongotop: per-collection read write times iostat -x 2: Monitoring system I/O tail -f logs/mongo.out.log: maybe the most important one. Only slow queries show up here. It’s a great way to find queries that are slowing you down, so you can fix them. We use all of these (and others) multiple times a day.
  • 38. 1. What does exfm do? 2. How does exfm use MongoDB? 1. Environment overview 2. Models 3. Server architecture 4. Management and tools 5. Future plans 3. Monthly Music Hackathon NYC Tuesday, October 2, 12 Fortunately, we’re growing really fast. So we’re making some big changes to accommodate more users, more content, and more data.
  • 39. Future plans • Split models into separate services “Build fast, scale when necessary... ...and it’s currently necessary.” Tuesday, October 2, 12 We currently run one monolithic application with tightly coupled parts. We’re in the process of splitting it into isolated HTTP services: User, Song, Site, Metadata processing, AlbumArt, LoveMachine, etc Our biggest headache has been that a few thousand Songs have thousands of loves, but tens of millions have zero or one love. The LoveMachine is a separate service designed to manage relationships between users and songs and will fix this problem.
  • 40. Future plans • Migrating from Python/Flask to NodeJS/ Express • Mongoose is like MongoEngine for NodeJS http://mongoosejs.com/ “elegant mongodb object modeling for node.js” Tuesday, October 2, 12 We’re switching from Python to Nodejs. We have a good reason, though: The core competency of our staff is Javascript. There are 9 of us at exfm 7 are developers 6 are most comfortable in JS. I’m the lone Python guy. :( But I’m getting a crash course, and that’s fun. Mongoose, the Mongo ORM for Node, is great so far. I’m just getting started using it.
  • 41. 1. What does exfm do? 2. How does exfm use MongoDB? 1. Environment overview 2. Models 3. Server architecture 4. Management and tools 5. Future plans 3. Monthly Music Hackathon NYC Tuesday, October 2, 12 And now for the funner part.
  • 42. Saturday, October 20th 10 AM hacking starts / 8 PM concert of hacks in Soho @musichackathon monthlymusichackathon.org Tuesday, October 2, 12 If you are a musician or have an interest in music, please come. FREE! The idea is to hack on music, and for the attendees (you) to decide what that means. It could mean working with music streaming company’s APIs, soldering together a new musical instrument, analyzing a library of music with DSP software, or rapidly writing and performing a new piece of music. It ends with a concert of the hacks created that day. Ensemble in residence this month: amazing virtuosic classical guitar/flute duo, that plays some insane music. Sponsored in part by 10gen and exfm.
  • 43. Thank you! at Jonathan Marmor Software Developer, exfm jm@ex.fm Tuesday, October 2, 12 Thanks so much for listening to me. Please get in touch if you want to know more about exfm or the hackathon.