确保你的QQ邮箱设置已经打开“IMAP/SMTP服务”
2.生成授权码
3.进入spark客户端选择“添加账户”---“其他”---输入邮箱账户名及密码(注意此时密码应该填写刚才生成的授权码!!)---“显示高级设置”
4.严格进行以下设置
首先设置imap 如图:
<迹酣管叫攮既归习害卢p>再设置STMP 端口改为“465”安全改为“SSL” 如图:
5.登陆!
终于到了最后一步执行了:
最关键的两个函数便是 doPrepare和 doExecute了。
还是以上一章的sql语句为例,其最终生成的sparkplan为:
看一下SortExec的doPrepare 和 doExecute方法:
下面看child也就是ShuffleExchangeExec:
先看没有exchangeCoordinator的情况,
首先执行:
上面的方法会返回一个ShuffleDependency,ShuffleDependency中最重要的是rddWithPartitionIds,它决定了每一条InternalRow shuffle后的partition id:
接下来:
返回结果是ShuffledRowRDD:
CoalescedPartitioner的逻辑:
再看有exchangeCoordinator的情况:
同样返回的是ShuffledRowRDD:
再看doEstimationIfNecessary:
estimatePartitionStartIndices 函数得到了 partitionStartIndices:
有exchangeCoordinator的情况就生成了partitionStartIndices,从而对分区进行了调整。
最后来一个例子:
未开启exchangeCoordinator的plan:
开启exchangeCoordinator的plan:
不同之处是 两个Exchange都带了coordinator,且都是同一个coordinator。
执行withExchangeCoordinator前:
执行withExchangeCoordinator后:
生成了coordinator,且执行了 doPrepare后,可以看到两个exchange都向其注册了。
doExecute后:
原先的numPartitions是200,经过执行后,生成的partitionStartIndices为[1],也就是只有1个partition,显然在测试数据量很小的情况下,1个partition是更为合理的。这就是ExchangeCoordinator的功劳。
execute 最终的输出是rdd,剩下的结果便是spark对rdd的运算了。其实 spark sql 最终的目标便也是生成rdd,交给spark core来运算。
spark sql的介绍到这里就结束了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)