1. 在spark中,你编写的代码会被spark转义为graph分发给work处理,因此要特别注意你写的代码被翻译之后会变成啥样。并且在翻译为graph时,因为要把任务分发出去,因此其中所有变量都必须是可以序列化的,因此就不能嵌套使用rdd等spark数据结构(如rdd的map方法中引用了外部rdd变量则会导致无法生成graph,程序在启动时就会马上报错),正确的使用方式应该是调用api如:union,join,group等。
2. 所有计算都只会在action那行执行,而且日志中会明确告诉你什么时候执行了代码中哪一行的action,并且日志还会告诉你很多附加信息,因此多仔细看日志有助于编写更合理的spark代码。
3. 一定要记住,执行action的那步就是你要输出结果的那步,因此在编码时要非常确认地分开编写算法和输出结果两部分,不要在编写算法那部分执行action操作。
4. 输出结果时要注意,如果是输出到driver中的变量里,那么需要collect之后再输出,如果是输出到外部系统则可以不collect,由各个work自己去输出更好。
5. 测试中的eventually是会去等待执行结果正确后才往下走,但是其是周期性地去检查,所以要注意它可能读到多个结果中某个正确的结果而导致断言过了,而最终结果却是不正确的。