Pluggable data sources for Metis

Metis now accepts data sources, executors, and their connecting parts (data access operators) from arbitrary locations.

`Transform`s are now `Operator`s and the special `Stream` type has been replaced by the data access operator.

You can look at this, but I still need to fix/run tests. It does work with both Python and Spark executors on some query I made up.

Note: happens to fix #336
you can always override the parent if you need something special.  either
way---was just a suggestion---feel free to discard :)

On Wed, Dec 17, 2014 at 4:29 PM, Derek Schultz <notifications@github.com>
wrote:
>
> In metis/metis/core/execute/spark/executor.py
> <https://github.com/Locu/chronology/pull/340#discussion-diff-22005794>:
>
> > -      client = KronosClient(node.host, blocking=True)
> > -      start_time = node.start_time + (i * delta)
> > -      if i == self.parallelism - 1:
> > -        end_time = node.end_time
> > -      else:
> > -        end_time = start_time + delta - 1
> > -      return list(client.get(node.stream,
> > -                             start_time,
> > -                             end_time,
> > -                             namespace=node.namespace))
> > -
> > -    # XXX(usmanm): Does this preserve ordering? I ran a few simulations and it
> > -    # seems like ordering is preserved. Need to test on a multi-node cluster as
> > -    # well.
> > -    return self.context.parallelize(range(self.parallelism)).flatMap(get_events)
> > +  def execute_data_access(self, node):
>
> It would be the only execute method actually defined on Executor, plus,
> different adapters might need different args on execute(), or there might
> be some other slight differences that would be nice to fill in here?
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/Locu/chronology/pull/340/files#r22005794>.
>