Strata Hadoop 2016 总结
直观感觉总趋势和关键词:
-
言必称“深度学习”
深度学习、人工智能、神经网络,整个会议大的方向都在谈这些词,如何综合各种信息包括图像语音等维度进行分析和预测,很少谈及基础的机器学习分类聚类等方法。不管是Intel,Google,微软,小米,海尔,宜人贷,各种各样的业务场景,在金融、反欺诈、推荐、预测、识别等真正的人工智能决策的领域都有广泛应用,对机器学习的要求更智能、动态和宽泛。
-
领域细分化、框架特殊化
除了Spark作为最通用性的框架确定其霸主地位之外,更多的是一些专门为机器学习尤其是深度学习所开发的相关框架,比如tensorflow/coffe/CosMos等,大公司比如Google,Intel,MS都有相关框架,各大公司都在忙着“重复”制造轮子,主要原因还是Spark不适合机器学习算法的迭代,中间每个Worker与Parameter server通信的成本很高,通信模型有BSP/ASP/SSP,收敛方式非All reduce。
在流式计算中,也开始不局限于原来的Storm/Spark Streaming,Flink正式成为主流,Storm进化为Heron,基本上提到分布式计算的地方都会提到Flink,跟Spark并行,另外也有一些不那么靠谱的在孵化的流式计算框架比如GearPump。
总的来说在业务想对固定的场景,为了追求极限的性能和速度,在每种不同的应用推荐不同的工具,如果要最通用的大而全的平台,只能牺牲性能。
-
去H化
虽然是Hadoop大会,但是Hadoop基本上已经退化成大数据概念的代名词了,实际应用中已经开始慢慢退出历史舞台,计算全面迁移到Spark框架,原来的Hadoop生态系统包括MapReduce,HDFS,HBASE,包括Hive等工具都是广受诟病,HDFS/HBASE的应用场景也越来越被其他的内存数据库或者缓存工具所屏蔽、覆盖,HDFS->Alluxio, HBASE->(Parquet+Spark/Presto)等等。所有的幻灯片基本提到内部的架构都是DAG的,已经完全看不到MR的影子,只有YARN作为资源管理框架更多是由于Hadoop遗留系统的惯性依然活跃,Zookeeper等边缘工具依旧应用广泛但也存在大量更优秀的替代品比如Etcd。Spark如日中天,其内部的DAG/PIPELINE等处理流程成为各种其他开源工具的标准。
-
Online Analytical Processing (OLAP)
实时分析具有很广泛的需求,这次会议讲了很多种开源工具都是围绕实时秒级查询这个功能需求的,kylin/presto/druid,作为比较主流的三种形态,分别面向不同的查询需求。其中Kylin通过预处理生成索引将分布式的遍历处理转换为Key-Value的查询,但是支持的函数较少,适合简单查询和统计,presto更多的是通过pipeline形式的分布式DAG处理,类似于SparkSql的处理形式,druid适合实时插入更新场景,并且有一些近似统计和地理查询等支持,可以根据查询动态的调整内存中的数据存在状态和索引。
-
工具API高度抽象以及更直观的交互
类似于KMDE,很多公司也开始考虑简化大数据工程师的技能要求,更简单的API,更直观的SQL标准接口以及页面交互,进入全民大数据分析阶段。比如从Spark API的使用趋势上,Python和R语言的比例也开始加大,Spark2.0也统一了批量和流式计算的API,除了通过标准SQL来进行数据分析,还有一些开源产品通过Online notebook的形式来交互的调度执行统计逻辑,并可以对接各种数据可视化的工具,比如zeeplin。展厅有多家类似的带交互界面的大数据产品出现,比如SyncSort,不过集中在ETL领域,机器学习更多的还是通过高度抽象的代码形式。
-
硬件优化以及GPU
除了框架上的进展,更多开始集中在对底层代码或者硬件基础的优化,比如Spark2.0的tungsten,intel的IntelMKL,FPGA,TPU等,前者通过生成对当前架构CPU跟有效率的代码来加速计算,后者通过专门的硬件架构来运行计算密集型的任务。在深度学习领域,GPU成为主流,CPU变为配角。
-
语言角度
Scala更加主流,从工程师角度基本成为大数据领域开源工具开发和调用的首选语言,基本上所有的主流大数据产品都有很大一部分通过scala语言开发,比如著名的kafka, spark,另外即使是java语言开发的工具也会提供scala的api,因为其使用效率更高,更简洁表达能力更好。但是从另外的角度看,另外的一个明显的变化就是层次划分更明显,jvm语言也开始逐渐退化,更多的是应用在整个分布式框架的宏观层面,任务的分发、调度、资源的分配等,一旦到核心的计算层面依然是通过调用native的代码来进行有针对性的优化,比如spark底层的数学计算相关的包netlib的一种实现,虽然有java的实现,但是要想达到更快的速度,依然是通过jni调用系统级别的代码速度更快一些,java没有办法实现cpu指令级别的优化,基本上从spark的优化趋势也能看到,scala虽然是主流,但是也只是在很高级的靠近使用者的层次,方便写大的框架和漂亮的api,而密集计算和内存的管理都开始倾向于往jvm外部迁移,也就是off-heap方向的存储和计算,然后数据在copy回jvm进行汇总、广播、任务分配等,能够减少GC对整个计算过程的影响。所以从现在的软件角度的生态系统看,分层的概念以及用最适合的语言来完成最合适层次并用一种中间的交互手段将其粘合在一起的形式越来越多,因此我们在写上层程序的时候也需要考虑到在一下不同的生态层面上都发生了什么才能达到整体的最优。
总的来说这个会议有几个对我们有用的点,包括Spark机器学习相关代码的优化(从通信模型角度,稀疏矩阵角度和底层CPU指令角度),深度学习框架的应用,还有OLAP工具的介绍。各种细节可以根据需要或者大家兴趣给大家讲一下。