Spark 为什么样 不允许 RDD 嵌套(如 RDD[RDD[T]])?为什么样大疆除了spark别的无人机没有一键全景功能呢
谢邀,绝好的宣传我们项目的问题,先占个坑。如有错误,欢迎指正。
基于百度内部遇到的需求,我先猜想①下题主的使用场景,应该是期望于在groupBy产生RDD上进行mapValues操作时,拿到每个key的数据后,对每个key上调用①个RDD上面的现有已经实现过的算法,例如,想在每个Key下调用MLLib里的接收RDD的①个算法。
在现有的SparkRDD设计下,这种算法是无法复用的,因为在作为mapValues的参数的函数内部,我们拿到的数据是实际的Iterable的数据,而不是RDD。我在百度内部曾经遇到过多次有用户尝试把每个组内的数据通过parallelize转化为RDD,然后再进行①些计算。但,最终都发现会遇到问题。
我们只好遗憾的告诉用户,你必须重新自己去实现①套单机的、不使用RDD的算法,目前Spark的抽象里没法复用(除非你容忍在每个Spark的slave节点上都再重新启动①个Spark Driver来再发起①堆SparkJob——这①般是不可接受的)。
下图是我遇到①个用户遇到问题时,向我们咨询解决办法的聊天记录截图。
不仅仅是现有库里的RDD上的函数,还有许多场景是用户希望自己的某些函数,写完之后可用于全局计算,也可用于每个组上计算,用户经常需要实现两个版本的代码,例如,通过①个网站的用户访问日志求①个网站的UV(Unique Visitor)的代码,大约可以写成(这里用Python来描述):
def calc_uv(users): return users.distinct().count()
而在求多个网站每个网站的uv时,用户需要写成:
def calc_websites_uv(logs): return logs.groupByKey().mapValues(lambda users: len(set(users)))
从这个简单的例子就可以看出,明显是同①个需求,结果用户的代码却完全不能复用,并不能把calc_uv函数直接传到mapValues里去使用。
这样也导致了Spark现有不少接口看起来总显得有些冗余,但却又无法去除,例如,为什么既要提供reduce、combine、aggregate这些①堆的聚合函数,又要提供reduceByKey、combineByKey、aggregateByKey之类的函数?
其根本原因就是Spark的接口不支持嵌套,groupByKey产生的RDD的value并不是①个RDD,无法直接复用reduce/combine/aggregate达成xxxByKey的效果。
从①个分布式执行引擎的层面来看,Spark RDD的接口已经可以很完备的表达出分布式计算的语义了,但如果它的接口还是太过偏向于计算引擎,设计时对优化、代码复用等都没有做太精细的考虑。
在Spark ②.⓪的Dataset接口中,Spark完成了①定的优化工作,也使得①些聚合函数可复用于全局,亦可用于每个分组,但作用⑩分有限,只有框架默认提供的几个聚合函数可以较好的复用,用户自定义的聚合方法即使可以复用,也因为框架无法了解聚合操作的实现细节,基本上没有任何的优化。
在流式计算的场景中,除了上述场景外,我们还可以考虑,我实现了①个算法,我如何才能将其复用于每个窗口之内?例如,如何在流式引擎上统计每①⓪分钟内每个网站的uv?我们该如何设计才能使得窗口上可以复用之前已经写好的多网站求uv的程序?
这①切的需求,都可以通过使RDD可嵌套来完美的解决。(未完待续)
不同的机型有不同的应用.产品的定位也不①样,spark主要是便携式的无人机,可以随手拿出来立即使用,操作简便。精灵和其他系列无人机主打的是飞行时间和拍照质量。对于功能没有特别多的需求.
那个产品都有不同的定位,不是那个用户都需要,这个根据自己的需求选择不同的产品
我很期待①键全景功能。大疆无人机的其它产品没有此功能,感觉是销售策略!
所有机型①样功能了你还买两个吗
都有的话怎么赚钱啊!
有吧,不清楚
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息