Spark结合MariaDB数据读取问题:基于Hadoop2.7.3与Spark2.3.0集群
解决Spark 2.3.0(YARN调度)读取MariaDB 10数据的完整方案
嘿,结合你搭建的Hadoop 2.7.3 + Spark 2.3.0(YARN调度)环境,我帮你把从MariaDB 10读取数据的配置和代码补全、梳理清楚:
第一步:处理JDBC驱动包
你已经下载了mysql-connector-java-5.1.46.tar.gz,接下来做这两步:
- 解压压缩包:
tar -zxvf mysql-connector-java-5.1.46.tar.gz,得到里面的mysql-connector-java-5.1.46-bin.jar文件 - 配置驱动:
- 方式一(全局生效):把这个jar包复制到所有Spark节点的
$SPARK_HOME/jars/目录下,这样YARN集群运行任务时能自动加载驱动 - 方式二(任务级生效):提交Spark任务时通过
--jars参数指定驱动路径,比如:spark-submit --master yarn --deploy-mode cluster --jars /path/to/mysql-connector-java-5.1.46-bin.jar your_python_script.py
- 方式一(全局生效):把这个jar包复制到所有Spark节点的
第二步:完整的Python读取代码
补全你没写完的代码,适配你的环境:
#!/usr/bin/python from pyspark import SparkContext from pyspark.sql import SQLContext # 初始化Spark上下文和SQL上下文 sc = SparkContext(appName="MariaDB-Data-Reader") sqlContext = SQLContext(sc) # 配置JDBC连接参数,替换成你的实际信息 df_mysql = sqlContext.read.format("jdbc").options( # MariaDB的JDBC连接URL,注意替换IP、端口、数据库名 url="jdbc:mysql://192.168.x.x:3306/your_database?useSSL=false&serverTimezone=UTC", # 对应你用的5.1.46驱动的类名 driver="com.mysql.jdbc.Driver", # 要读取的表名,也可以写自定义SQL,比如"(SELECT id, name FROM user WHERE age > 18) AS filtered_user" dbtable="your_table", # MariaDB的用户名和密码 user="your_username", password="your_password" ).load() # 验证数据是否读取成功,打印前20行 df_mysql.show() # 后续可以在这里添加你的Spark数据处理逻辑 # 比如 df_mysql.write.parquet("hdfs://your_hdfs_path/xxx.parquet")
额外提示:用SparkSession简化代码(Spark 2.x推荐)
Spark 2.x开始推荐用SparkSession替代SparkContext+SQLContext,代码更简洁:
#!/usr/bin/python from pyspark.sql import SparkSession # 初始化SparkSession spark = SparkSession.builder.appName("MariaDB-Data-Reader").getOrCreate() # 读取MariaDB数据 df_mysql = spark.read.format("jdbc").options( url="jdbc:mysql://192.168.x.x:3306/your_database?useSSL=false&serverTimezone=UTC", driver="com.mysql.jdbc.Driver", dbtable="your_table", user="your_username", password="your_password" ).load() df_mysql.show()
关键注意事项
- 驱动类匹配:因为你用的是
mysql-connector-java-5.1.46,所以驱动类必须是com.mysql.jdbc.Driver,如果是8.x版本的驱动才用com.mysql.cj.jdbc.Driver,别搞混了 - URL参数:添加
serverTimezone=UTC是为了避免时区不匹配的报错,useSSL=false适用于没有配置SSL的测试环境,如果生产环境有SSL,去掉这个参数或者配置对应的SSL选项 - YARN集群模式:如果用
--deploy-mode cluster提交任务,确保驱动包路径在所有YARN节点都能访问到,或者把驱动包上传到HDFS,然后用hdfs:///path/to/jar作为--jars的参数
内容的提问来源于stack exchange,提问作者Essex
相关产品推荐
相关产品推荐

