pyspark操作集群问题汇总

最近在学习spark,在本地win10,连接虚拟机spark,用pyspark操作分布式集群进行数据分析和绘图,遇到了一下bug,这里记录一下。

1、检查本地和集群的python、java、spark版本,尽可能保证一致

2、NameError: name 'memoryview' is not defined

python版本是2.6.6的,版本太低,升级版本

 

记录一下看到的编译python时两个make的区别

注意:make install 与 make altinstall的区别: install 除了做 altinstall 外还会做 bininstall , maninstall 共三个动作,bininstall 就是在处理 Symbolic Link Chain 的相关事务, 而 maninstall 则是在产生 unversioned manual pages, 所以, 很明显的, 不使用 bininstall 可以避免 python install 时 update link 的问题。如果使用make install,你将会看到在系统中有两个不同版本的Python在/usr/bin/目录中。这将会导致很多问题,而且不好处理。

3、pyspark读取json文件

报错:org.apache.spark.sql.DataFrame = [_corrupt_record: string]

解决方法有两种:

a、去掉文件中的换行符

b、spark.read.option("multiLine", true).json() 在读取json文件时,指定读取多行为真,option("multiLine", true)

4、WARN scheduler.TaskSchedulerImpl: Initial job has not accepted any resources

任务初始化失败,到master:8080端口上去看看spark job会发现,任务core为0.

解决办法

a、spark-env.sh上配置一下

export SPARK_WORKER_MEMORY=512m
export SPARK_WORKER_CORES=2
export SPARK_WORKER_INSTANCES=1
export SPARK_EXECUTOR_MEMORY=512m

b、检查一下 .set('spark.executor.memory', '1g') 是否超过了给虚拟机分配的内存, 减小一些就好了

5、Can’t assign requested address: Service ‘sparkDriver’ failed after 16 retries

sparkDriver错误 解决方法: 添加.set("spark.driver.host", "localhost")

6、使用pandas_udf报错

本人spark和pyspark都是2.4.5 先看jdk版本是否太够,推荐是1.8,没问题的话,就是pyarrow版本太高,降到0.14.1活更低就好了

7、SparkSql报错Use the CROSS JOIN syntax to allow cartesian products between these relations.

spark2默认不支持笛卡尔积 解决方法: 加入参数 set("spark.sql.crossJoin.enabled", True)

8、pbzip2: error while loading shared libraries: libbz2.so.1.0: cannot open shared object file: No such file or directory

先看试试 yum install bzip2-libs

如果不行就使用 find / -name libbz2.so 查找文件位置

做一个软链接libbz2.so.1.0,指向已经有的libbz2.so.1.0.4

cd /usr/llib64
ln -s libbz2.so.1.0.4  libbz2.so.1.0

再运行就好了

9、ModuleNotFoundError: No module named '_bz2'

python报错:

    from _bz2 import BZ2Compressor, BZ2Decompressor
ModuleNotFoundError: No module named '_bz2'

缺少文件bz2的so文件

解决方法: 网上下载 _bz2.cpython-36m-x86_64-linux-gnu.so 文件, 放到python里面的lib-dynload下就好了(usr/python36/lib/python3.6/lib-dynload/)

                   -36m是版本,根据自己的python版本改一下就可以用

 

https://pan.baidu.com/s/1fHhxNiHOLKDqZ-9wHw3JTA

文件在这个博主文章上下载的 python解决 ModuleNotFoundError: No module named _bz2

10、pip使用出现错误

报错:

Can't connect to HTTPS URL because the SSL module is not available. - skipping
​
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

pip使用需要ssl模块,但是python默认编译是不可用的,所以要重新编译安装一下python

解决方法
a、删除python文件夹
b、安装openssl: yum -y install openssl-devel
c、加上--with-ssl: ./configure --prefix=/usr/local/python3 --with-ssl

 

Pyspark集群模式中,可以通过`foreachPartition方法来在RDD中操作Oracle数据库。`foreachPartition`允许你对每个分区中的数据进行自定义的操作,包括连接和操作Oracle数据库。 下面是一个示例代码: ```python from pyspark import SparkContext import cx_Oracle # 创建SparkContext sc = SparkContext(appName="Oracle Example") # 定义连接Oracle数据库的函数 def oracle_operation(iterator): # 建立数据库连接 conn = cx_Oracle.connect("username/password@hostname:port/service_name") cursor = conn.cursor() # 遍历分区中的数据并操作数据库 for row in iterator: # 执行SQL查询或操作 cursor.execute("INSERT INTO table_name (column1, column2) VALUES (:1, :2)", (row[0], row[1])) # 提交更改并关闭数据库连接 conn.commit() cursor.close() conn.close() # 创建RDD data = [("value1", 1), ("value2", 2), ("value3", 3)] rdd = sc.parallelize(data) # 在RDD上使用foreachPartition方法来操作Oracle数据库 rdd.foreachPartition(oracle_operation) # 关闭SparkContext sc.stop() ``` 在上述代码中,你需要替换以下信息以适应你的Oracle数据库连接: - `username`:数据库用户名 - `password`:数据库密码 - `hostname`:数据库主机名 - `port`:数据库端口号 - `service_name`:数据库服务名 - `table_name`:要插入数据的表名 这样就可以在集群模式下使用`foreachPartition`方法来在RDD中操作Oracle数据库了。请注意,你需要将`cx_Oracle`库安装在所有的工作节点上,以确保能够正常运行。 希望对你有帮助!如果有更多问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值