品牌网站建设优化公司哪家好,asp.net网站开发 vs2017,电商资源网,个人简介1 为什么使用广播变量 和 累加器 变量存在的问题#xff1a;在spark程序中#xff0c;当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时#xff0c;Spark操作实际上操作的是这个函数所用变量的一个独立副本。这些变量会被复制到每台机器上#xff0c;并且…1 为什么使用广播变量 和 累加器 变量存在的问题在spark程序中当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时Spark操作实际上操作的是这个函数所用变量的一个独立副本。这些变量会被复制到每台机器上并且这些变量在远程机器上的所有更新都不会传递回驱动程序通常跨任务的读写变量是低效的。 广播变量的目的就是解决变量存在的问题变量声明为广播变量那么知识每个executor拥有一份这个executor启动的task会共享这个变量节省了通信的成本和服务器的资源。 总的来说累加器是用来对信息进行聚合广播变量是用来分发较大的只读对象。 2 如何定义 和 还原 广播变量 int a 3;
BroadcastInteger broadcast sc.broadcast(a); //定义广播变量int c broadcast.value; //还原广播变量 3 广播变量注意事项 1变量一旦被定义为一个广播变量那么这个变量只能读不能修改 2能不能将一个RDD使用广播变量广播出去 不能因为RDD是不存储数据的。可以将RDD的结果广播出去。 3 广播变量只能在Driver端定义不能在Executor端定义。 4 在Driver端可以修改广播变量的值在Executor端无法修改广播变量的值。 5如果executor端用到了Driver的变量如果不使用广播变量在Executor有多少task就有多少Driver端的变量副本。 6如果Executor端用到了Driver的变量如果使用广播变量在每个Executor中只有一份Driver端的变量副本。 4 广播变量的优化 当广播一个比较大的值时选择既快又好的序列化格式是很重要的。因为如果序列化对象的时间很长或者传送时间太久这段时间很容易出现性能瓶颈。 默认情况下spark会使用java内建的序列化库。建议选择kryo序列化工具使用方法设置spark.serializer为org.apache.spark.serializer.KryoSerializer 最好强制要求这种注册设置spark.kryo.registrationRequired为true SparkConf conf new SparkConf()conf.set(spark.serializer,org.apache.spark.serializer.KryoSerializer);conf.set(spark.kryo.registrationRequired,true);conf.registerKryoClasses(Array(classOf[myClass]),classOf(MyOtherClass)); 这样还会有其他的问题如果代码中引用的类没有序列化会报异常最简单的方式是实现序列化接口。 5 累加器和定义和还原 累加器只是一个只写变量 LongAccumulator accumulator new LongAccumulator();accumulator.add(1);long count accumulator.count(); 参考文献扎心了老铁转载于:https://www.cnblogs.com/parent-absent-son/p/9956574.html