在开发PySpark程序时通常会需要用到Java的对象,而PySpark本身也是建立在Java API之上,通过Py4j来创建JavaSparkContext。
这里有几点是需要注意的
1. Py4j只运行在driver
也就是说worker目前来说引入不了第三方的jar包。因为worker结点的PySpark是没有启动Py4j的通信进程的,相应的jar包自然也加载不了。之前没有详细看这部分文档,系统设计时企图在worker结点利用client模式直连Hbase来获取部分数据,从而避免对整个表的JOIN操作,当然对于python来说这样的操作只有通过引入jar包来实现(不考虑thrift方式)。但是测试的jar写好之后,一直不成功,最后只有修改方案,后来才去查了官方文档。
2. PythonRDD 的原型是 JavaRDD[String]
所有的经过PythonRDD传递的数据都通过BASE64编码
3. PySpark 中的方法和匿名函数是通过cloudpickle序列化
为何函数需要被序列化,因为做map或者flatMap时,此时的函数或者lambda表达式是需要传递到各个worder的,如果函数里有用到闭包,cloudpickle也能巧妙的序列化。但是,需要传递的函数里请不要是用self关键字,因为传递过去后,self的指代关系已经不明确了。
文档还提到PythonRDD的序列化是可定制的了,但是目前没这个需求,所有没测试
代码示例
java 测试代码, 编译生成 pyspark-test.jar
packageorg.valux.py4j;pu