对于需要实时展示的时候,我们采用的还是提前把报表刷新,然后就可以随时查看,我依然觉得spark Streaming不可能对于超过十亿的数据而且具有复杂算法程序能达到秒级返回,所以我还是对数据抽样了几十万,再用Spark Streaming做实时计算,这也很有用,至少能实现秒级看到你的报表将是什么样子,就是提供一个预览。
那么问题来了,我依然要提供较多的资源给这个能进行抽样秒级运算的Streaming,就是为了数据量小而固定的情况下无论什么运算都尽量的快,然而我其他的运算,大数据量的计算就无法使用所有的集群资源了,造成资源浪费,所以我就要研究下,Spark Streaming 动态资源分配,其实我之前研究过
另外经过测试对于几十万数据,用十核,30核,60核区别还是有的,但不是很大,稍稍复杂一点的运算都有几秒的区别了
下面回归正题,进行Spark Streaming 动态资源分配
其实和上面那帖子提到的spark 动态资源分配是一样的 只不过你要注意配置,executor 删除添加的时间跨度,也就是频率,来匹配你的场景。
1.spark应用程序端配置
spark.dynamicAllocation.enabled true #启用资源动态分配 spark.shuffle.service.enabled true #激活保护shuffle写文件使得executor可以被安全的移除 spark.executor.cores 10 #每个executor的核数 spark.dynamicAllocation.minExecutors 1 #最少要保持启动的executor数量 spark.dynamicAllocation.maxExecutors 8 #最大要启动的executor数量 spark.dynamicAllocation.initialExecutors 5 #初始化启动的executor数量 spark.dynamicAllocation.executorIdleTimeout 100s #executor空闲后移除的时间间隔 spark.dynamicAllocation.cachedExecutorIdleTimeout 200s #持有rdd数据的空闲exexutor移除时间间隔
当然你可以配置在命令行,也可以配置在程序中。
注意:一定不要配置这个spark.executor.instances,要不然不起作用
2.yarn 集群服务端配置
2.1所有节点yarn-site.xml都要配置auxService
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle,spark_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.spark_shuffle.class</name> <value>org.apache.spark.network.yarn.YarnShuffleService</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property>
2.2然后所有节点都要把spark-2.3.0-yarn-shuffle.jar从spark复制到hadoop
cp /opt/hadoop/spark-2.3.0-bin-hadoop2.7/yarn/spark-2.3.0-yarn-shuffle.jar /opt/hadoop/hadoop-2.7.7/share/hadoop/yarn
所有节点都要配置
参考:
https://blog.csdn.net/kimsungho/article/details/52593946
https://www.jianshu.com/p/826991ba9375