ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
1. 序列化 (1)Java序列化,Spark默认方式。 (2)Kryo序列化,比Java序列化快约10倍,但不支持所有可序列化类型。 ```scala val conf:SparkConf = new SparkConf() .setMaster("local[4]") .setAppName(this.getClass.getName) // 注册需要Kryo序列化的类 conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2])) ``` 如果没有注册需要序列化的class,Kyro依然可以照常工作,但会存储每个对象的全类名(full class name),这样往往比默认的 Java serialization 更浪费空间。 2. 使用对象数组(Array)、原始类型代替Java、Scala集合类(如HashMap)。 3. 避免嵌套结构,如尽量避免List(List(List(Map)))类似的嵌套。 4. 尽量使用数字作为Key,而非字符串。。 5. 以较大的RDD使用持久化级别为MEMORY_ONLY_SER。 6. 加载CSV、JSON时,仅加载所需字段。 7. 仅在需要时持久化中间结果(RDD/DS/DF)。 8. 避免不必要的中间结果(RDD/DS/DF)的生成,避免必要的shuffle产生。 9. DF的执行速度比DS快约3倍。 10. 自定义RDD分区与`spark.default.parallelism`,该参数用于设置每个stage的默认task数量。 11. 将大变量广播出去,而不是直接使用。 12. 尝试处理本地数据并最小化跨工作节点的数据传输。 13. 表连接(join操作)。 (1)包含所有表的谓词(predicate) 。 ```sql select * from t1 join t2 on t1.name = t2.full_name where t1.name = 'mike' and t2.full_name = 'mike' ``` (2)最大的表放在第一位。 (3)广播最小的表。 (4)最小化表join的数量。