肖远昊 分布式实验室
当有人问起该如何处理大数据问题时,他们总是被指引到现存的产品中,例如Hadoop或者Storm。虽然这些产品非常棒,但也引发了一些问题。首先,就我个人的经验来看,为了获得最佳的处理结果,你必须使用这些框架首选的语言或者虚拟机编写你的代码,典型的就是JVM。当语言或者虚拟机不适用时,就意味着你必须重写你的代码来适应这些框架。
同样,像Hadoop和Storm这两种框架所做的事情非常不一样,这就给代码的重用增加了更大的困难。如果你想做流式和批量处理分析,你就需要这两种框架。当然,有些方法能够做到这一点,但我不清楚这种方法是否有更多的选择性,或者这种方法是否很难进行维持。
目前,我正在使用一个分布式系统并且它没有使用任何上述技术。这个分布式系统运行的很好,虽然它不完美,但是它的确实现了。这就引发我思考分布式框架是否是必须的。实际上,MapReduce和Streaming框架的真正区别是什么?数据通过不同的处理流程串行化,这仅仅是如何将数据链接到一起以及不同处理流程发出数据频率的问题。
因此,也许我们真正需要的是规范化如何让各种处理流程并存以及如何将它们连结在一起。我相信我们可以通过一些现有的技术来做到这一点。Mesos和Kubernetes可以在一个集群中用来执行处理流程。队列化技术例如Kafka和NSQ能够在不同的处理流程间传递消息。处理流程可以使用不同的语言实现,并且可以通过Docker或者类似产品封装在容器中来管理其依赖。
我个人发现这种方式是比较合适的,这种解决方法聚焦在不同处理流程之间的通信问题。通过制定相关的协议,我相信可以将不同的处理流程解耦合。同样,当需要时分析过程中使用到的技术也能更加容易地置换出来。举个例子来说,Python能够用来塑造一个分析原型,当性能成为更为严重的问题时,它可以使用编译型语言D或者Go进行重写。当相同的处理流程无需修改代码就可以适用于流式处理和批量处理或者MapReduce任务时,我们也能从中获得更好的重用性。
当然,这只是一个粗略的想法,也没有覆盖这些系统的所有案例和各个方面,但我相信这是一个好的开始。我更加希望看到的是有个工程能够更加深入地研究下去,并且能够为这些系统制定一份详细说明书。如果需要,这种方法可以按照详细说明书提供运行库来确保兼容性,也许更重要的是描述在一个兼容性问题的事件中该做什么。