spark jdbc java_spark之JDBC开发(实战)

本文详细介绍了如何使用Spark的JDBC功能在Java中实现本地模式操作,包括从本地读取数据,处理后写入远程MySQL数据库。通过创建Spark应用,设置Spark配置,读取文件,对数据进行分词、计数、排序,最后将结果存储到数据库。文章还提供了测试Spark JDBC应用的步骤和注意事项。
摘要由CSDN通过智能技术生成

一、概述

Spark Core、Spark-SQL与Spark-Streaming都是相同的,编写好之后打成jar包使用spark-submit命令提交到集群运行应用

$SPARK_HOME/bin#./spark-submit  --master spark://Master01:7077  --class MainClassFullName [--files $HIVE_HOME/conf/hive-site.xml] JarNameFullPath [slices]

说明:

--master参数用于指定提交到的Spark集群入口,这个入口通常是Spark的Master节点(即Master进程或ResourceManager进程所在的节点),如果需要为该参数指定一个高可用集群则集群节点之间使用英文逗号分割

--class参数用于指定Spark之Driver的入口Main类(必须指定该Main类的全名)

如果使用Spark操作Hive仓库则需要使用--files参数指定Hive的配置文件

如果使用Spark操作关系数据库则需要将关系数据库的驱动包放置于Spark安装目录下的library目录下(在Spark2.x中应该放置于jars目录下),如:

[hadoop@CloudDeskTop jars]$ pwd

/software/spark-2.1.1/jars

JarNameFullPath表示的是提交的Spark应用所在的JAR包全名(最好指定为绝对的全路径)

slices:表示的是读取数据的并行度(值为一个数值,根据实际的物理内存配置来指定,内存较小时指定为1或者不用指定),一般在Streaming应用中是不需要指定的

二、Spark之JDBC实战

(一)、本地模式操作

典型业务场景描述:将CloudDeskTop客户端本地的数据,通过Spark处理,然后将结果写入远端关系数据库中,供前端在线事务系统使用

1、在Eclipse4.5中建立工程RDDToJDBC,并创建一个文件夹lib用于放置第三方驱动包

[hadoop@CloudDeskTop software]$ cd /project/RDDToJDBC/

[hadoop@CloudDeskTop RDDToJDBC]$ mkdir -p lib

[hadoop@CloudDeskTop RDDToJDBC]$ ls

bin lib src

2、添加必要的环境

2.1、将MySql的jar包拷贝到工程目录RDDToJDBC下的lib目录下

[hadoop@CloudDeskTop software]$ cp -a /software/hive-1.2.2/lib/mysql-connector-java-3.0.17-ga-bin.jar /project/RDDToJDBC/lib/

2.1、将Spark的开发库Spark2.1.1-All追加到RDDToJDBC工程的classpath路径中去(可以通过添加用户库的方式来解决);Spark2.1.1-All中包含哪些包,请点击此处

3、基于RDD到DB的Java源码

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecom.mmzs.bigdata.spark.core.local;2

3 importjava.io.File;4 importjava.sql.Connection;5 importjava.sql.DriverManager;6 importjava.sql.PreparedStatement;7 importjava.sql.SQLException;8 importjava.util.Arrays;9 importjava.util.Iterator;10 importjava.util.List;11

12 importorg.apache.spark.SparkConf;13 importorg.apache.spark.api.java.JavaPairRDD;14 importorg.apache.spark.api.java.JavaRDD;15 importorg.apache.spark.api.java.JavaSparkContext;16 importorg.apache.spark.api.java.function.FlatMapFunction;17 importorg.apache.spark.api.java.function.Function2;18 importorg.apache.spark.api.java.function.PairFunction;19 importorg.apache.spark.api.java.function.VoidFunction;20

21 importscala.Tuple2;22 importscala.Tuple4;23

24 public classRDDToDB {25 /**

26 * 全局计数器27 */

28 private static intcount;29

30 /**

31 * 数据库连接32 */

33 private staticConnection conn;34

35 /**

36 * 预编译语句37 */

38 private staticPreparedStatement pstat;39

40 private static final File OUT_PATH=new File("/home/hadoop/test/output");41

42 static{43 delDir(OUT_PATH);44 try{45 String sql="insert into wordcount(word,count) values(?,?)";46 String url="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8";47 Class.forName("com.mysql.jdbc.Driver");48 conn=DriverManager.getConnection(url, "root", "123456");49 pstat=conn.prepareStatement(sql);50 } catch(ClassNotFoundException e) {51 e.printStackTrace();52 } catch(SQLException e) {53 e.printStackTrace();54 }55 }56 /**

57 * 删除任何目录或文件58 *@paramf59 */

60 private static voiddelDir(File f){61 if(!f.exists())return;62 if(f.isFile()||(f.isDirectory()&&f.listFiles().length==0)){63 f.delete();64 return;65 }66 File[] files=f.listFiles();67 for(File fp:files)delDir(fp);68 f.delete();69 }70

71 //分批存储

72 private static void batchSave(Tuple2 line,booleanisOver){73 try{74 pstat.setString(1, line._1());75 pstat.setInt(2, line._2());76

77 if(isOver){//如果结束了循环则直接写磁盘

78 pstat.addBatch();79 pstat.executeBatch();80 pstat.clearBatch();81 pstat.clearParameters();82 }else{ //如果没有结束则将sql语句添加到批处理中去

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值