350 karma · joined August 13, 2009
OLAP is characterized by fairly low-volume aggregation queries that touch very large volumes of data ("what fraction of tweets in English come from non-english speaking countries?"). Sure, the ingest is large, but it tends to be batch and has fairly loose real-time (in the EE sense) requirements. What makes OLAP hard is the sheer volume of data from which an aggregation must be calculated.
OLTP is characterized by very selective queries with much tighter real-time bounds ("what are the last 20 things that the 100 people I follow said?"). The overall size of the dataset might even be the same, but each individual query needs fast access to a tiny fraction of the dataset. In many applications, this is accompanied by very high QPS and in Twitter's case, extremely high write volume.
Our tests take seconds, and can run from eclipse (we use Pig's local mode).
You sank 3 days into modifying internals of PigUnit instead of just parametrizing your loader statements?
We unit test our pig scripts, it's pretty straightforward given MockStorage class we have contributed (you can find it in pig trunk). Granted, we've long been separating load statements from actual logic, which allows us to fairly easily mock up data to feed into the Pig flows. It would be harder if your loads and flows are in the same file.
Twitter (disclosure: I manage/was early engineer on the analytics infra team) used Json initially, and it quickly turned into a mess because JSON does not enforce schemas or type safety. There is no way for your consumers to find out what you are logging, other than to sample records. This makes evolving logging, deprecating fields, and doing sanity checking very complex (you basically have to build a separate metadata discovery system).
Use Thrift or Avro. Avro is extra nice because not only does it have a schema, it keeps the schema together with the data; however, the support for it is not as mature/wide. It's improving fast, though. Thrift, and, I think, Avro, have JSON protocols if you really love JSON -- you get the human-readable debugging mode, the metadata, the type safety, and compact binary representation.. happiness ensues.
I don't understand how so many people are missing the point demonstrated by http://www.focusontheuser.org/. It uses information available from Google search to inject twitter, facebook, etc results into the "your world (as long as it's google+)" module. The ranking it uses is Google's ranking of the relevant results. No special API access. No back-end deals. No money. It's stuff that's available to Google and that Google already has and has already ranked.
If they choose to dilute the worth of their search engine by injecting less-than-relevant (according to their own relevance algorithm) results in order to attempt to grow Plus (presumably hoping that'll ultimately increase the revenue to offset the losses on the search engine side of the business), they are perfectly within their rights to do so. Just don't buy their "oh we'd be happy to show more stuff but boo-hoo we don't have the data" line -- they totally have the data, and it doesn't require sweetheart deals. The only thing they can't do is grab your personal social graph and re-rank according to it. So they use something they know is sub-par (Plus's currently very partial graph) and don't bother dialing in relevance signals against their own best-in-the-world search engine.
Full context as explained in the talk: used to have stop-the-world GC for 2 minutes every hour. After implementing bytebuffer-based slab allocation, this is only several seconds, and once every three days. Service runs on 200 nodes, with redundancies. Kicking the process on one of them, in a slow roll that finishes in under 3 days, works around the unresponsiveness window (planned shutdown easier to manage than an unpredictable pause).
It's totally a workaround and not a solution. Atilla follows up this example with an anecdote of talking to Oracle folks about when are they going to have true pauseless GC, and they responded with "not that big an issue, really, everyone finds a workaround..." So, this is an example of a workaround. A pretty good one once you realize it's not "the one" machine, it's "some one" machine out of 200.
Handy tip: languages that are marketed for use in the real world tend to advertise actual uses in the real world.
What a waste, that company really looked like it might be profitable one day.