在开发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

package org.valux.py4j;
public class Calculate {
public int sqAdd(int x){
return x * x + 1;
}
}

Python 测试代码,放在文件 driver.py

from pyspark import SparkContext
from py4j.java_gateway import java_import sc = SparkContext(appName="Py4jTesting")
java_import(sc._jvm, "org.valux.py4j.Calculate")
func = sc._jvm.Calculate()
print func.sqAdd(5)
"""
[OUTPUT] > 26
"""
"""
!!![错误用法]
这里是想在每个work上调用自定义的方法,
前面已经提到过PySpark目前是不支持的
"""
rdd = sc.parallelize([1, 2, 3])
result = rdd.map(func.sqAdd).collect() """
!!![错误用法]
之前还有个错误的思路是想在work单独 import 相应的 jar
"""
def foo(x):
java_import(sc._jvm, "org.valux.py4j.Calculate")
func = sc._jvm.Calculate()
func.sqAdd(x)
rdd = sc.parallelize([1, 2, 3])
rdd.map(foo).collect()
测试时,提交程序需要记得带上jar包
> bin/spar-submit --driver-class-path pyspark-test.jar driver.py

这里又有一个坑,之前提交为了方便,一直都用的是 --jars 参数

--driver-class-path 附加的 jar 只会在 driver引入 --jars 附加的jar会在所有worker引入

帮助文档里面还提到

--jars Comma-separated list of local jars to include on the driver and executor classpaths.

所有就偷个懒用了 --jars ,结果一直报如下错误:

py4j.protocol.Py4JError: Trying to call a package.

测试了好久终于解决了

参考文档

https://cwiki.apache.org/confluence/display/SPARK/PySpark+Internals

最新文章

  1. 小明的密码-初级DP解法
  2. Delphi:与VCL同步(Synchronize()、用消息来同步)
  3. CF #375 (Div. 2) D. bfs
  4. HTML 中按钮作为form表单元素提交特性两则 --- 参HTML考标准分析
  5. JMS相关概念
  6. 黄聪:WordPress 函数:add_filter()(添加过滤器)
  7. 【LeetCode 221】Maximal Square
  8. lstm-思想2
  9. MVC中登录页图片验证码总结
  10. 跟版网 > 织梦教程 > 织梦安装使用 > 织梦DedeCMS附件上传大
  11. Vue(基础六)_vue-router
  12. python--类中的对象方法、类方法、静态方法的区别
  13. RobotFrameWork环境搭建(基于HTTP协议的接口自动化)
  14. CEF 跨域访问iframe
  15. iOS----线程之间的通信
  16. Docker - CentOS安装Docker
  17. ubuntu 12.04 rails server 时候报错 execjs
  18. 换个思路理解Javascript中的this
  19. 粒子群优化算法PSO及matlab实现
  20. Android 从上层到底层-----kernel层

热门文章

  1. [分享] VIM 常用命令及游戏练级
  2. sysfs - 用于导出内核对象(kobject)的文件系统
  3. leetcode:House Robber(动态规划dp1)
  4. java socket编程基础
  5. HeadFirst jsp 02 (体系结构)
  6. Machine Learning for hackers读书笔记(五)回归模型:预测网页访问量
  7. java读取Properties文件
  8. php字符串与正则表达式试题 Zend权威认证试题讲解
  9. 物联网操作系统HelloX V1.79发布公告
  10. 【UVa-679】小球下落——二叉树的编号