pyspark读取tidb数据库

TiDB是一种开源分布式数据库,使用上和mysql基本一致,详细使用说明请参考TiDB官网,中文文档参考TiDB中文说明,TiDB已经集成了Spark框架,可以直接使用Spark直接连接TiDB通过写SQL操作数据来提高任务的执行效率。接下来正式开始...

本文档使用环境如下:

python-version : 3.7

tidb-version : 2.1.8

pyspark-version : 2.3.3

pytispark-version : 2.0

1. 安装python对应的包pyspark和pytispark

pip install pyspark===2.3.3
pip install pytispark===2.0

2. 编写python代码test.py连接tidb

from pyspark.sql import SparkSession
from pytispark.pytispark import TiContext

spark = SparkSession.builder.appName("test") \
    .master("spark://181.181.0.30:7077") \
    .config("spark.tispark.pd.addresses", "181.181.0.30:2379") \
    .getOrCreate()

ti = TiContext(spark)
ti.tidbMapDatabase("mysql")

df = spark.sql("(select * from user)")
df.show()

spark.stop()

3. 运行代码

python test.py或者pycharm中直接运行即可

在运行中可能会出现以下问题,根据相应情况进行解决

问题一:java.util.NoSuchElementException: spark.tispark.pd.addresses

解决办法:在代码中配置pd对应的地址

.config("spark.tispark.pd.addresses", "181.181.0.30:2379")

问题二:Python in worker has different version 3.6 than that in driver 3.7, PySpark cannot run with ……

解决办法:这是由于环境python版本不一致造成的,配置环境统一python版本

import os
os.environ['PYSPARK_PYTHON']='/usr/local/bin/python3.7'

问题三:Initial job has not accepted any resources; check your cluster UI to ensure that workers are registe

解决办法:这是由于集群资源不足导致,可能是spark未限制每个应用使用的最大内存和cpu核数,那进行修改spark-env.sh或spark-defaults.conf进行限制,还有一种办法是在代码中限制自身资源的使用

.config("spark.executor.memory",  "512m") \

.config("spark.executor.cores", "2")

问题四:TypeError: 'JavaPackage' object is not callable(重要)

解决办法:找到tidb安装spark的目录,将spark/jars/目录下的tispark-SNAPSHOT-jar-with-dependencies.jar包拷贝一份放入对应python安装site_package/pyspark/jars/目录下,默认在/usr/local/lib/python3.x/site_package/pyspark/jars/下

TiSpark快速入门参考资料:https://pingcap.com/docs-cn/v3.0/how-to/get-started/tispark/

问题五:java.lang.ClassCastException: cannot assign instance of org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils

解决办法:出现这种情况是在一个程序中访问远程Spark集群,但是他们版本不一样,比如一个是2.3.1另外一个是2.3.2就可能会出现这个问题, 假如是在idea中可以通过修改pom.xml中Spark版本进行统一, 或者将远程jar包版本替
换当前机器上对应的jar包

你可能感兴趣的:(Spark)