Paper: http://www.cs.cmu.edu/~pavlo/courses/fall2013/static/papers/p734-akidau.pdf
Talk: http://www.infoq.com/presentations/millwheel
Slides: https://docs.google.com/presentation/d/11YqFU760Gk1qcKr3K3rCG4dXHP5X2zmTS45vQY2lDN4/present?slide=id.g4672b9e62_010 (slide 53 on the trigger API)
1. Use event time as the timestamp to determine window boundaries. Keep windows open for delayed / out-of-order event messages until some long time has elapsed.
a. Use "low watermark" to bound the event timestamp that future records may come with.
b. Low watermark values are injected by external systems to the very first computational stage, following stages infer LM from the up-streaming stage's LM.
2. Keys are specified and extracted on-the-fly by the consumers, so different consumers can consume the same stream by form different key-value pairs for processing, this saves the re-partition stage.
3. Persistent storage is per-key, where you can store per-key aggregates / updated states, or buffered individual key-value pairs for certain key. This storage is backed up by BigTable / Spanner.
4. Use sequencers to avoid zombie writes, and checkpointing delivery / updates before the real action to guarantee atomic state update.
5. Each stage checks for duplicate consumed messages with unique record IDs and ACK only after it has been consumed AND processed to guarantee exactly-once.
Paper: http://dl.acm.org/citation.cfm?id=2742788
Blog: https://blog.twitter.com/2015/flying-faster-with-twitter-heron
1. Heron is Storm 2.0, just like YARN as Hadoop 2.0, in the sense that 1) it separates the topology management from the processing layer, 2) use process-level isolation and remove shared threads.
2. Each machine as only one "Stream Manager" which is responsible for receiving / sending data, and all process instances of that machine communicated with that SM for data in/out. SM has its own buffer to sending / receiving and when the buffer is full it will back-pressure on up-stream to let it slow-down the traffic.
3. Each instance has two thread, one for communicating with SM (including ser-de, etc), and one for processing.
Website: https://flink.apache.org/
1. For deployment, it seems only support runnable mode, in which the Flink framework runtime needs to be started first, then deploy the Flink jobs on it either through cmdline or a web UI (http://ci.apache.org/projects/flink/flink-docs-release-0.9/quickstart/setup_quickstart.html).
2. Support some high-level operator programming interface in Java / Scala / Python (beta), like map / reduce, filter, union, fold and some windowing operations (http://ci.apache.org/projects/flink/flink-docs-release-0.9/apis/streaming_guide.html#transformations).
One important JavaDoc class is DataStream (https://ci.apache.org/projects/flink/flink-docs-release-0.9/api/java/)
3. Use some "stream connectors" to leverage third-party messaging queues like Kafka / RabbitMQ (http://ci.apache.org/projects/flink/flink-docs-release-0.9/apis/streaming_guide.html#stream-connectors) besides programmable source / sink and normal formats like socket / files.
4. For compiling, it follows the standard optimization process of high-level language presentation -> logical operator DAG for optimization -> physical plan for runtime (it is not clear what optimizations are applied for physical plan generation since it is not mentioned on the wiki).
5. Deployment supports YARN / GCloud / standalone. The Flink framework runtime contains a JobManager (JB) that works as a task scheduler to accept submitted jobs in the form of the physical plan JobGraph, and run them as parallel tasks, each managed by a TaskManager (TM). Note each task contains a complete parallel pipeline of the task instead of a single stage of the task (https://ci.apache.org/projects/flink/flink-docs-release-0.9/internals/job_scheduling.html).
Website: https://spark.apache.org/streaming/
Paper: http://people.csail.mit.edu/matei/papers/2013/sosp_spark_streaming.pdf
Paper: http://research.google.com/pubs/pub41318.html
1. Photon is a special Stream-Stream join system that transform the computation into a Stream-Table where it picks the higher-volume stream and stores it as a table, and then joins with the lower-volume stream.
2. Supports cross-DC joins by using Paxos to detect duplicates, etc.
Website: http://apex.incubator.apache.org/
Website: https://mesosphere.github.io/marathon/
Website: http://slider.incubator.apache.org/