2017 年 10 月 19 日,阿里巴巴的高级技术专家王绍翾(花名“大沙”)将为 QCon 上海的听众带来一场以大数据实时流计算与人工智能为主题的专题演讲,本专题将邀请来自腾讯、阿里、Facebook、Uber、Streamlio 的多位一线专家分析实时流计算和人工智能领域的最新的技术成果、应用和趋势。本文整理自 InfoQ 对王绍翾的采访问答,他与我们分享了关于实时流计算的看法,并对选择 Flink 的原因、Blink 对 Flink 所做的改进和优化、流数据 SQL 查询,以及阿里巴巴自研的基于 Blink 的在线机器学习平台 Porsche 等问题进行了解答。
随着大数据技术的不断发展和成熟,无论是传统企业还是互联网公司都已经不再满足于离线批处理,实时流处理的需求和重要性日益增长。
近年来业界一直在探索实时流计算引擎和 API,比如这几年火爆的 Spark Streaming、Kafka Streaming、Beam 和 Flink。阿里巴巴自 2015 年开始改进 Flink,并创建了内部分支 Blink,目前服务于阿里集团内部搜索、推荐、广告和蚂蚁等大量核心实时业务。其中 Blink SQL 和 Table API(java/Scala 版的类 SQL API)是一套基于 Blink 引擎打造的可以同时支持流处理和批处理的统一的 API。与此同时,阿里巴巴还以 Blink 和分布式存储系统 HBase 为核心,设计并实现了一个面向算法人员、支持可视化自助开发运维的在线机器学习平台 Porsche。
作为 Blink 研发团队的负责人之一,同时也是本次 QCon 上海 2017“大数据实时流计算与人工智能”专题的出品人,王绍翾与我们分享了他关于实时流计算的看法,并对选择 Flink 的原因、Blink 对 Flink 所做的改进和优化、流数据 SQL 查询,以及阿里巴巴自研的基于 Blink 的在线机器学习平台 Porsche 等问题进行了解答。

InfoQ:为什么说如今企业对实时流计算的需求已经从 nice to have 变成 must have?
大沙:今天新经济体的崛起主要依托于两个核心技术:大数据计算和人工智能。无论是传统的大数据统计还是新兴的人工智能,实时计算的能力都显得十分重要。如何获取数据、处理数据并从数据中挖掘有价值的信息,是各个新经济体都努力在解决的问题,所以实时计算一直都是 nice to have。可惜早期的实时计算是非常昂贵的。
随着软硬件的飞速发展,现在构建一套能够支撑大规模、低延迟的实时计算处理引擎变得相对容易很多(这点非常类似于沉睡多年的 deep learning 的崛起,没有新一代的软硬件计算的升级,deep learning 也只能停留在书本上)。
另外,越来越多的云计算平台开始支持实时计算产品,使得流计算更加触手可及,门槛大大减低,人人都可以花相对合理的价格买到流计算的能力。这样,实时计算就自然而然地变成了 must have。因为不使用高性能的实时计算就意味着在商业竞争中有被对手赶超甩开的可能。
InfoQ:您参加了今年 9 月在柏林召开的 Flink Forward 大会,能否跟我们分享一下流计算的最新进展?
大沙:我们从 2016 年开始先后参加了 3 次 Flink Forward 大会并做了分享。
9 月在柏林的这次会议一个比较明显的感受就是流计算的场景和用户增长十分快速。除了国内外的大公司,一些中小企业也开始尝试用流计算支撑和服务业务。应用场景上,除了常见的实时数据统计和实时监控分析等等之外,还涌现了大量的使用流计算做人工智能的技术和案例,让人十分振奋。
另外在这次大会上,dataArtisans 和阿里巴巴都公布将在近期更新升级各自的流计算云平台 (dataAtisans 的 DA,和阿里的 streamCompute)。有了这些实时流计算的云平台,可以预见到在未来的一年中,流计算应用和用户还会持续快速增长。
InfoQ:相比 Spark Stream、Kafka Stream、Storm 等,为什么阿里会选择 Flink 作为新一代流式计算引擎?前期经过了哪些调研和对比?
大沙:我们是 2015 年开始调研新一代流计算引擎的。我们当时的目标就是要设计一款低延迟、exactly once、流和批统一的,能够支撑足够大体量的复杂计算的引擎。Spark streaming 的本质还是一款基于 microbatch 计算的引擎。这种引擎一个天生的缺点就是每个 microbatch 的调度开销比较大,当我们要求越低的延迟时,额外的开销就越大。这就导致了 spark streaming 实际上不是特别适合于做秒级甚至亚秒级的计算。
Kafka streaming 是从一个日志系统做起来的,它的设计目标是足够轻量,足够简洁易用。这一点很难满足我们对大体量的复杂计算的需求。
Storm 是一个没有批处理能力的数据流处理器,除此之外 Storm 只提供了非常底层的 API,用户需要自己实现很多复杂的逻辑。另外,Storm 在当时不支持 exactly once。种种原因,Storm 也无法满足我们的需求。
最后,我们发现了 Flink,并且惊喜地发现它几乎完美满足了我们所有的需求:
a) 不同于 Spark,Flink 是一个真正意义上的流计算引擎,和 Storm 类似,Flink 是通过流水线数据传输实现低延迟的流处理;
b) Flink 使用了经典的 Chandy-Lamport 算法,能够在满足低延迟和低 failover 开销的基础之上,完美地解决 exactly once 的目标;
c)如果要用一套引擎来统一流处理和批处理,那就必须以流处理引擎为基础。Flink 还提供了 SQL/tableAPI 这两个 API,为批和流在 query 层的统一又铺平了道路。因此 Flink 是最合适的批和流统一的引擎;
d) 最后,Flink 在设计之初就非常在意性能相关的任务状态 state 和流控等关键技术的设计,这些都使得用 Flink 执行复杂的大规模任务时性能更胜一筹。
Info Q:Blink 和 Flink 的主要区别是什么?Blink 做了哪些优化和升级?
大沙:简单的说 Blink 就是阿里巴巴开发的基于开源 Flink 的 enterprise 版计算引擎。如前面所说,虽然 Flink 在理论模型和架构方面有很多创新,但是在工程实现上还有不少问题。这些问题大多都是我们在大规模使用中发现的。阿里的业务场景非常复杂,job 的体量都相当大,很多问题在一般的公司、一般的场景是很难接触到的。
从 2015 到 2016 年,我们 Blink 团队主要专注于解决 Blink 的 runtime 稳定性和 scalability 的问题:
a)优化了集群调度策略使得 Blink 能够更好更合理地利用集群资源;
b)优化了 checkpoint 机制,使得 Blink 能够很高效地处理拥有很大状态的 job;
c)优化了 failover 的策略,使得 job 在异常的时候能够更快恢复,从而对业务延迟造成更少的影响;
d)设计了异步算子,使得 Blink 能够在即使被读取外部数据阻塞的同时还能继续处理其他 event,从而获得整体非常高的吞吐率。
在拥有了稳定的 runtime 之后,我们开始专注于增强 Blink 的易用性。所以从 2016 年底到现在,我们大力开发 Blink 实时计算 SQL,通过 SQL 作为统一 API 服务于各种复杂业务。从规范 streaming SQL 的语义和标准,到实现 UDX、join、aggregation、window 等一系列 SQL 最重要的算子,我们几乎一手打造了完整的 streaming SQL,并且将这些工作推回了 Flink 社区。我们的工作也获得了 Flink 社区的认可。截止今天,Blink 团队先后拥有了 5 位 Flink committer。
InfoQ:流数据的 SQL 查询存在什么难点?Blink SQL/Table API 是一套基于 Blink 引擎打造的可以同时支持流处理和批处理的统一的 API,那么它是否已经可以很好地解决流式数据的 SQL 查询问题?是怎么做到的?
大沙:流计算 SQL 设计中最大的难点就是 Stream SQL 的语义和标准。这个事情在 Flink 和 Calcite 两个社区一直都在讨论研究中,直到最近我们基本达成了共识,那就是“世界上不存在 Stream SQL”。流和批的计算可以自然而然地在传统 SQL 这一层统一。
流计算所特有的 unbounded 特性其实本质只是何时观测抽样计算结果,这种属性可以作为一个 job 的 configure 来设置而无需去改变用户的 business query logic。为了能够使用传统 SQL 在流计算上执行,我们和 Flink 社区一起引入了 dynamic table 的概念。这里不详细展开,感兴趣的可以去看一下我们今年在 Flink 官方 blog 上发表的这方面的介绍(“Continuous Queries on Dynamic Tables”, by Fabian Hueske, Shaoxuan Wang, and Xiaowei Jiang)。也可以去听一下我们今年 4 月和 9 月在旧金山和柏林分别举办的 Flink forward 上的分享(在 youtube 上有视频)。
除了 dynamic table 之外,我们还提出并解决了流计算撤回(retraction)等其他重要的流计算场景拥有的概念。有了这些语义和功能,使用传统批处理 SQL 就能写出 Blink 流式计算的任务,这样就使得使用 Blink SQL 作为一个支持流处理和批处理的统一的 API 成为可能。
InfoQ:阿里内部哪些业务和产品用到了 Blink SQL?
大沙:我们基于 Blink SQL 打造了新一代阿里巴巴流计算平台 streamCompute。现在整个阿里集团包括搜索、推荐、广告等大部分核心流计算业务都是通过 streamCompute 平台来提供服务。我们近期还会通过阿里云开放我们的 streamCompute 平台,使更多的用户享受到 Blink 实时计算带来的便捷。
InfoQ:实时流式计算对机器学习平台的重要性体现在哪里?随着人工智能技术的发展,对实时流式计算的需求会发生哪些变化?
大沙:早期的机器学习都是通过离线大数据做全量计算提取特征、训练模型,然后再将这些特征和模型应用于系统之中从而影响算法结果。这种离线计算往往需要数小时甚至数天的时间,这就使得本来能够实时采集的数据最终需要经历一个很长的周期才能对算法结果产生影响。在某些极端情况下,这种离线计算产生的模型和特征都不能正确合理地体现算法效果。因此,如何通过实时计算引擎及时地同步数据的变化,从而快速地完成数据处理、特征提取、模型训练等一系列操作,就显得至关重要。
从我们多年在人工智能方面的经验来看,当一个新的人工智能技术在离线建模方面拿到比较好的结果之后,算法工程师们就会自然而然地开始思考如何把离线建模和实时计算使用结合起来,甚至是把离线建模变为实时建模。可惜早期的实时计算非常昂贵,随着软硬件飞速发展,慢慢地有一些公司拥有了一套能够支撑大规模、低延迟、高一致性保障的实时计算处理引擎之后,他们就开始利用机器学习、深度学习等人工智能技术从实时数据中高效地挖掘出有价值的信息。
随着人工智能技术的快速发展,新的人工智能算法和新的计算硬件层出不穷。因此除了要拥有实时计算的能力,计算学习平台往往还需要能够十分方便地集成各种算法和计算硬件。这些往往都是一个好的实时计算学习平台的核心竞争力。
InfoQ:您这次担任出品人的专题中也为大家带了阿里新一代实时机器学习平台 Porsche,而 Porsche 的实时计算部分主要就是基于 Blink,请介绍一下 Porsche 是如何基于 Blink 实现“在线机器学习”的?
大沙:阿里巴巴是一个非常重视以技术推动商业发展的公司。我们现在的核心电商业务的搜索和推荐后端都大量使用了人工智能技术。为了很好地支撑和接入业务,我们开发了一个面向用户的可视化算法平台,Porsche。
在这个平台上面,用户只需要简单地拖拽机器学习组件,按照需要连接他们,再做一些相应的配置,一个机器学习任务就能够完成。这样一方面使得使用 Blink 实时计算的门槛变得更低,另一方面又使得一个通用的算法组件能被更多的用户使用,大大降低了开发成本。
InfoQ:未来阿里在机器学习平台、深度学习平台和人工智能生态建设上还有哪些规划?是否会考虑向外界输出实时计算能力或推出开放的机器学习或深度学习平台?
大沙:由于人工智能算法或者模型往往和业务逻辑有着一定的联系,所以不是特别适合开放给外界。但是不排除在不远的将来,我们会将一些通用的人工智能算法通过我们的机器学习平台开放给更多的外部用户使用。

作者介绍
王绍翾,淘宝花名“大沙”,加州大学圣迭戈分校计算机工程的博士,2015 年加入阿里巴巴集团,目前就职于阿里巴巴计算平台事业部。加入阿里之前,曾在 Facebook 开发分布式图关系数据库 TAO。
加入阿里之后,王绍翾一直从事阿里新一代实时计算平台 Blink 的研发工作。早期负责搜索事业部的离线大数据处理,利用半年的时间带领团队将阿里淘宝天猫的搜索离线数据处理的计算全部迁移到了 Blink 计算平台之上。之后负责 Blink 计算平台的查询和优化。用了半年多的时间,打造了一套功能完备高性能的实时计算 Blink SQL&Table API,并成功的将阿里的实时计算机器学习平台整体的迁移到这套 API 之上。王绍翾是 Apache Flink 的 committer,除了自己,他在团队内部还培养出另外 2 位 Apache Flink committer。

来自大数据杂谈

宣扬Hadoop将死的观点一直以来已经很久了,那这种观点究竟是对还是错,hadoop和spark是什么关系,Spark何德何能将一统大数据的江山,Spark在企业中应用的如何,我们有必要花大量的时间去掌握他么?答案是,1)hadoop不会死,spark也干不死hadoop,2)spark有必要去掌握,如果现在还没掌握,尽快掌握。

1.Spark和Hadoop关系

分布式计算平台=分布式文件系统+分布式计算模型,我们通常讲的hadoop一般是指分布式计算平台的统称,
分布式计算平台(hadoop)=分布式文件系统(HDFS)+分布式计算模型(MapReduce)
Spark=分布式计算模型+图计算模型+机器学习库+流等计算...
Spark包含了很多,但是唯独没有包含分布式计算模型,因为HDFS做的已经足够好了
hadoop包好了分布式文件系统,分布式计算模型,但是没有图计算、机器学习、流式计算。
所以要么是你有的,我没有,我有的,你没有。
hadoop和spark的关系就是:你依赖我,我加强你,互相补充,扬长避短。

2.Hdoop和Spark的区别

2个都是开源框架,但是解决的问题侧重点不一样
第一,hadoop是分布式文件系统实现的经典方式,轻轻松松做到平台近乎傻瓜式的横向扩容,并且为分布式计算提供了基础,创造了可能(文件切分,分布式存储),而且依赖的硬件也是普通的PC服务器。这些特点如果没有经历IOE架构是没法深刻理解的,传统的企业以前几乎都是IOE的架构(IBM的服务器,做逻辑运算等功能,Oracle的数据库,做数据库服务,EMC的存储,存储都是SAN、阵列之类的专门服务器来做),硬件价格贵的要命,小型机一台都上百万,而且运维还要专门的团队,小型机一个团队,oracle一个团队,存储一个团队,这兼职就是噩梦。Spark,则是那么一个专门用来对那些分布式存储的大数据进行处理的工具,它并不会进行分布式数据的存储。
第二,还有一点也值得注意——这两者的灾难恢复方式迥异。因为Hadoop将每次处理后的数据都写入到磁盘上,所以其天生就能很有弹性的对系统错误进行处理。
Spark的数据对象存储在分布于数据集群中的叫做弹性分布式数据集(RDD: Resilient Distributed Dataset)中。这些数据对象既可以放在内存,也可以放在磁盘,所以RDD同样也可以提供完成的灾难恢复功能。
第三,使用场景不一样,hadoop适合离线,spark适合计算复杂,能迭代的计算场景,大部分hadoop的计算场景,spark都能做,个别场景只能haodop做,spark做不了。
第四,在我的使用经验里面,稳定性来说,hadoop更好一点,因为人家是磁盘里面做交互么,spark相对来说更差一点,这个和spark代码测试不足有关,因为Spark追求计算的灵活性,所以就复杂, 复杂就不好控制,不好控制就容易挂掉。

3.为什么Hadoop不被看好

很多人在谈到Spark代替Hadoop的时候,其实很大程度上指的是代替MapReduce。
MapReduce的缺陷很多,最大的缺陷之一是Map + Reduce的模型。这个模型并不适合描述复杂的数据处理过程。很多公司把各种奇怪的Machine Learning计算用MR模型描述,不断挖掘MR潜力,对系统工程师和Ops也是极大挑战了。很多计算,本质上并不是一个Map,Shuffle再Reduce的结构,比如我编译一个SubQuery的SQL,每个Query都做一次Group By,我可能需要Map,Reduce+Reduce,中间不希望有无用的Map;又或者我需要Join,这对MapReduce来说简直是噩梦,什么给左右表加标签,小表用Distributed Cache分发,各种不同Join的Hack,都是因为MapReduce本身是不直接支持Join的,其实我需要的是,两组不同的计算节点扫描了数据之后按照Key分发数据到下一个阶段再计算,就这么简单的规则而已;再或者我要表示一组复杂的数据Pipeline,数据在一个无数节点组成的图上流动,而因为MapReduce的呆板模型,我必须一次一次在一个Map/Reduce步骤完成之后不必要地把数据写到磁盘上再读出,才能继续下一个节点,因为Map Reduce2个阶段完成之后,就算是一个独立计算步骤完成,必定会写到磁盘上等待下一个Map Reduce计算。
上面这些问题,算是每个号称下一代平台都尝试解决的。现在号称次世代平台现在做的相对有前景的是Hortonworks的Tez和Databricks的Spark。他们都尝试解决了上面说的那些问题。Tez和Spark都可以很自由地描述一个Job里执行流。他们相对现在的MapReduce模型来说,极大的提升了对各种复杂处理的直接支持,不需要再绞尽脑汁“挖掘”MR模型的潜力。综上,Spark数据处理速度秒杀MapReduce因为其处理数据的方式不一样,会比MapReduce快上很多。

4.hadoop是不是要被淘汰

目前备受追捧的Spark还有很多缺陷,比如:
1、稳定性方面,由于代码质量问题,Spark长时间运行会经常出错,在架构方面,由于大量数据被缓存在RAM中,Java回收垃圾缓慢的情况严重,导致Spark性能不稳定,在复杂场景中SQL的性能甚至不如现有的Map/Reduce。
2、不能处理大数据,单独机器处理数据过大,或者由于数据出现问题导致中间结果超过RAM的大小时,常常出现RAM空间不足或无法得出结果。然而,Map/Reduce运算框架可以处理大数据,在这方面,Spark不如Map/Reduce运算框架有效。
3、不能支持复杂的SQL统计;目前Spark支持的SQL语法完整程度还不能应用在复杂数据分析中。在可管理性方面,SparkYARN的结合不完善,这就为使用过程中埋下隐忧,容易出现各种难题。在比较Hadoop和Spark方面要记住的最重要一点就是,它们并不是非此即彼的关系,因为它们不是相互排斥,也不是说一方是另一方的简易替代者。两者彼此兼容,这使得这对组合成为一种功能极其强大的解决方案,适合诸多大数据应用场合。

5.梅峰谷补充以下几点:

1)Spark能被业界接受,除了内存计算这点外还有很多原因,如DAG、生态丰富等等,从架构设计、生态设计、后续演进这几点考虑,Spark是有独到之处的。HDFS可以说是分布式的基础设施,在HDFS发展阶段,各种开源计算模型百花齐放,但是Spark终于做到一统江山了,成为一个事实上的标准,对开发人员、运维人员来说,这是福音。
2)对于大数据的学习,知识点多,有点开发基础的人,或者计算机先关专业毕业的人,找准点并不难切入; 知识点多不可怕,但没有计划的学习,比较可怕。碰到问题不怕,但是闭门造车可怕。
3)有些人常常问,要不要报培训班,报哪个。对于学习时间短要速成的人来时,是可以报个班督促下自己,但是现在的资料已经很丰富了,能消化一个完整的视频教程,基本上入门上手是没问题的,前面已经发了很多连贯完整的视频教程。
4)见到一些学生,2年前在问我大数据怎么学习,2年后还在问我同样的问题,大数据能自学好的人,我觉得已经具备了一些很好的学习素质了,无论后面技术怎么变化,学习的方法论都是同样的。记得之前读研的时候,导师(北大)并不教你什么技巧、资料,只告诉你一个方向,当时并不是很理解,工作多年后,才发现,就是让我们训练和培养出属于自己的学习方法论,这个是终生受益的,无论是新工作、新岗位、新技术、新课题,都不会害怕,技术变换无穷,问题无穷无穷,但是探索方法和流程大体是一致的。

内容转自微信公众号:大数据梅峰谷
更多文章请扫描二维码
请输入图片描述

File--->open --->选择项目

IntelliJ IDEA 添加项目后编译显示包不存在的解决方案

导入项目后编译,显示如图的信息,之前都是用 maven 来管理 jar 包,本次项目的 jar 包都是在 lib 目录下存放,碰到这种情况的处理方式:

File–>Project Structure–>左侧 Libraries,中间新建一个 lib 的project Library,选择 Java,然后在选择项目中的 jar 所在的文件夹,我的是 WebContent–>WEB-INF–>lib,最后点击 OK,重新编译即可。

IDEA经常遇到的jar包引入错误问题

出现lib中jar包没有导入,但是jar都在项目中:
右键lib----->ADD As Library---->新建一个lib 即可;

在IntelliJ IDEA中打开要添加jar包的Project

方法一: 
先是进入:File –> Project Structure
再找到Modules->Dependencies 
点击最右侧的绿色+号 

第二种方式
也就是在你需要导入的Jar包上,点击右键,选择Add as Library…

如果还是报缺少jar包那么就需要新建一个pom文件,通过maven来导入,本人亲测有效

总是报The import org.apache cannot be resolved
org.apache,不是标准的java中的库。所以eclipse中,无法自动识别。
org.apache下包括了一堆相关的库,此处用到的的是org.apache.http,所以:
需要找到对应的org.apache.http相关的jar包,然后加到当前的项目中。

  <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

http://blog.csdn.net/qq_26525215/article/details/53239123