PySpark调用自定义jar包
在开发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
PySpark调用自定义jar包的更多相关文章
- Jmeter调用自定义jar包
一. 场景 在测试过程中, 可能需要调用第三方jar包来生成测试数据或者使用java工具类来实现业务场景, 普遍的做法是手动调用jar包, 再把这些值赋给jmeter中的某个参数, 以满足业务测试需求 ...
- Kettle自定义jar包供javascript使用
我们都知道 Kettle 是用 Java 语言开发,并且可以在 JavaScript 里面直接调用 java 类方法.所以有些时候,我们可以自定义一些方法,来供 JavaScript 使用. 本篇文章 ...
- spring boot项目使用swagger-codegen生成服务间调用的jar包
swagger-codegen的github:https://github.com/swagger-api/swagger-codegen 需要的环境:jdk > 1.7 maven > ...
- 【Maven】如何使用pom.xml引入自定义jar包
这里我以这个jar包为例,aliyun-java-sdk-core-3.2.3.jar ,这是我在做手机短信服务用到的jar包 ①进入C盘下的maven仓库C:\Users\用户\.m2\reposi ...
- java自定义jar包让jemeter使用
背景:可能在做定义化的要求上,jmeter原有的jar包,已经不能满足我们,就需要自己写一个方法,以下就是写入的一个模拟post的请求,在jmeter中使用的案例 一:写代码 1.代码中的有两个包,原 ...
- 服务器程序动态加载自定义jar包的过程
需求: 用过hive的都知道,可以自定义hive的一个udf jar,然后将这个jar add到hive服务端,就会加载这个jar实现用户自定义逻辑.现在的需求就是实现这么一个服务端所做的事情! 场景 ...
- maven增加自定义jar包
1.博客来源: http://www.cnblogs.com/leiOOlei/p/3356834.html 导入平台SDK的方法 mvn install:install-file -DgroupId ...
- 关于自定义jar包(tomcat)的添加
1 鼠标右击工程 选择 properties 或者 Ait + Enter 2 选择Libraries 3 点击Add Library... 4 选择User Library 点击 Next 5 如 ...
- Maven引入自定义jar包
1.将项目打成jar包 或者下载某个jar包 放在某个目录下(随便吧,桌面也行),这里是放在F:/ jar包为 alipay.jar 2.给jar包取个名字 用原名也行(maven打包默认会 ...
随机推荐
- YTU 2620: B 链表操作
2620: B 链表操作 时间限制: 1 Sec 内存限制: 128 MB 提交: 418 解决: 261 题目描述 (1)编写一个函数createlink,用来建立一个动态链表(链表中的节点个数 ...
- Linux日常使用指令大全
Linux日常使用指令大全 Java代码 www.ahlinux.com 001.日常维护常用查询命令 #top 显示系统进程 #clear 清理屏幕信息 #cat /etc/redhat-r ...
- C#将list转换为datatable
DataTable dt = new DataTable(); if (_list != null) { //通过反射获取list中的字段 System.Reflection.PropertyInfo ...
- php安装了扩展提示undefined
安装curl扩展后仍然提示如下错误: Call to undefined function curl_init() 使用一下语句 输出NO echo function_exists('curl_ini ...
- poj1860Currency Exchange(bell_fordmoban)
http://poj.org/problem?id=1860 模板提 #include <iostream> #include<cstdio> #include<cstr ...
- ADB安装应用报错 Segmentation fault pm install /data...
路径一定不能有中文…… 路径一定不能有中文…… 路径一定不能有中文…… 路径一定不能有中文…… 路径一定不能有中文……
- jQuery_效果(淡入淡出)
1.jQuery fadeIn() 方法( 用于淡入已隐藏的元素.) 语法: $(selector).fadeIn(speed,callback); 可选的 speed 参数规定效果的时长.它可以取以 ...
- WinCE的开发流程
总的来说,WinCE的开发是分为: 一.硬件开发:硬件设计,Boot Loader开发,OAL开发,BSP开发二.操作系统开发:定制驱动,创建最小内核,定制操作系统组件,测试集成三.应用程序开发:开发 ...
- BZOJ 1821 部落划分
kruskal.第k-1大的边. 其实prim会更快. #include<iostream> #include<cstdio> #include<cstring> ...
- vim 常用命令总结
https://www.ibm.com/developerworks/cn/linux/l-cn-tip-vim/ 1 文档开头末尾 [[ 开头 ]]末尾 2 删除全部 :%d 3 剪切.复制.粘贴 ...