SparkToMysql分表推送

需求背景:线上千万级数据在离线批处理完成后,需要按指定字段分表推送
方案思路:利用spark读取hive表数据,对数据按字段重分区,分区数据推送至不同的mysql表
代码实现:
1、// 解析配置文件,生成相关配置类
2、spark部分


```-------------------------spark-----------------------------
val broad = sc.broadcast(conf)
 val readDf = spark.sql(s"select * from rpt.rpt_abc_d")
 val columns = readDf.columns
 //重分区
-- readDf.repartition(10,col("key")).foreachpartition(     // 该方式的repartition会有问题,并不会按照约定按照字段创建10个分区,我试的时候只有6个分区。后来我改成了rdd的partitionBy
 readDf.rdd.map(row=>(row.getAs[Long](”key“),row)).partitionBy(10).foreachpartition( //该方式测试成功
	partition=>{
		val conf = broad.value
		 // 建立数据库链接
		 val conn = DbUtils.getJdbc(conf)
		 val ps = conn.getpreparestatement("")
		 val prexSql = DbUtils.getPrexSql(conf)
		 partition.foreach{
		       var count=1
			   row=>{
			            var sql = ""
			   			//组装sql 类似 insert into table (id,name) values (1,'zhangsan'),(2,'Lisi')。这种效率远比一个个value要来的高
			   			columns.foreach(col=>{
			   			    sql  = DbUtils.getInsertSql(row.getAs(col))
			   		   })
						prexSql = prexSql +sql
						if(count%10000==0){
						      	ps.addbatch(prexSql)
						}
						count = count+1
						  
				}
		}
	}
)

总结:
1、mysql的本地load会比上述的insert快很多2-3倍至少,换种思路,可以download到本地,然后进行文件按照key值切割,然后对切割文件load,这个效率高很多,缺点是要down到本地,本地在做切割,在数据量极大的情况下容易内存溢出。原来采用的是这种方式。
2、spark的问题
1、 repartition(partitionExprs : org.apache.spark.sql.Column*) 这个分区不知道为啥不按指定的来
2、对executor参数设置的理解,因为如果有1024个表,不可能开1024个分区。所以要限制executor的数量。
num-executors 直接指定executor的数量
executor-cores 一个executor的cpu core数量
总并发:num-executors*executor-cores,第一次设置上面两参数不起效果,,因为开了下面这个参数dynamic allocation=false

       spark.cores.max 是指你的spark程序需要的总核数  网上说 executor 数量 = spark.cores.max/spark.executor.cores 试了下不对,可能打开方式不行。
       spark.default.parallelism并行度设置 设置每个stage的默认task数量

提交方式:
spark-submit
–class com.SparkTodb
–master yarn
–conf spark.dynamicAllocation.enabled=false
–conf “spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/root/log4j.properties”
–queue $queue_name
–jars /root/program/env/jars/sparktools-jar-with-dependencies.jar
/root/program/env/jars/sparktools.jar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis Plus 是一个基于 MyBatis 的增强工具,它提供了许多便捷的功能来简化开发过程。在 MyBatis Plus 中,分表是一种常见的技术,用于解决单表数据量过大的问题。 在 MyBatis Plus 中,可以使用分表插件来实现分表功能。分表插件可以自动根据配置规则将数据插入到不同的物理表中,从而达到数据分散存储的效果。具体的步骤如下: 1. 配置分表策略:在 MyBatis Plus 的配置文件中,可以配置分表策略。分表策略可以根据一定的规则来确定数据应该插入到哪个物理表中,例如按照日期、按照用户ID等。 2. 创建分表逻辑:在代码中,可以创建一个分表逻辑类,用于根据分表策略来确定数据应该插入到哪个物理表中。这个类可以实现 MyBatis Plus 提供的分表接口,重其中的方法来实现具体的分表逻辑。 3. 使用分表逻辑:在具体的数据操作中,可以使用分表逻辑来进行数据插入、查询等操作。通过调用分表逻辑提供的方法,可以自动将数据插入到正确的物理表中。 需要注意的是,使用分表功能需要对数据库进行一些额外的配置,例如创建对应的物理表和索引等。同时,分表可能会导致一些查询操作变得复杂,需要对查询条件进行一定的处理才能获取正确的结果。 总的来说,MyBatis Plus 提供了方便的分表插件来实现数据分散存储的功能,可以根据具体的需求进行配置和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值