MapReduce is indeed inherently a batch processing model, where each job's outcome is deterministically determined by the input and the operators (map, reduce, combiner) as long as the input stays immutable and the operator is deterministic and side-effect free. Such a model allows the framework to recover from failures without having to understand the semantics of the operators (unlike SQL). This is important because failures are bound to happen (frequently) for a large cluster assembled from commodity hardware.

A typical technique to bridge a batch system and a real-time system is to pair with the batch system with an incremental processing component that computes delta on top of some aggregated result. The incremental processing part would also serve real-time queries, so the data are typically stored in memory. Some times you have to choose some approximation algorithms for the incremental part, and periodically reset the internal state with the more precise batch processing results (e.g. top-k queries).

Hope this helps, Hong

On Oct 9, 2009, at 11:02 PM, Ricky Ho wrote:

I'd like to get some Hadoop experts to verify my understanding ...

To my understanding, within a Map/Reduce cycle, the input data set is "freeze" (no change is allowed) while the output data set is "created from scratch" (doesn't exist before). Therefore, the map/ reduce model is inherently "batch-oriented". Am I right ?

I am thinking whether Hadoop is usable in processing many data streams in parallel. For example, thinking about a e-commerce site which capture user's product search in many log files, and they want to run some analytics on the log files at real time.

One naïve way is to chunkify the log and perform Map/Reduce in small batches. Since the input data file must be freezed, therefore we need to switch subsequent write to a new logfile. However, the chunking approach is not good because the cutoff point is quite arbitrary. Imagine if I want to calculate the popularity of a product based on the frequency of searches within last 2 hours (a sliding time window). I don't think Hadoop can do this computation.

Of course, if we don't mind a distorted picture, we can use a jumping window (1-3 PM, 3-5 PM ...) instead of a sliding window, then maybe OK. But this is still not good, because we have to wait for two hours before getting the new batch of result. (e.g. At 4:59 PM, we only have the result in the 1-3 PM batch)

It doesn't seem like Hadoop is good at handling this kind of processing: "Parallel processing of multiple real time data stream processing". Anyone disagree ? The term "Hadoop streaming" is confusing because it means completely different thing to me (ie: use stdout and stdin as input and output data)

I'm wondering if a "mapper-only" model would work better. In this case, there is no reducer (ie: no grouping). Each map task keep a history (ie: sliding window) of data that it has seen and then write the result to the output file.

I heard about the "append" mode of HDFS, but don't quite get it. Does it simply mean a writer can write to the end of an existing HDFS file ? Or does it mean a reader can read while a writer is appending on the same HDFS file ? Is this "append-mode" feature helpful in my situation ?

Rgds,
Ricky

Reply via email to