spark-sql实现Kudu同步数据到mysql

Kudu同步数据到mysql实施方案

  1. 简介

目前kudu导出到mysql没有比较好的方案,临时借助spark-sql进行数据导出,处理逻辑是会把老的数据给删除再导入,已经完成了生产环境的上线。

需要传入的参数程序参数

参数序号

字段含义

备注

1

同步的source表(含schema),必选

eg:yjp_crm.dm_bizuser_dealorderflag

2

同步的target表(含schema),必选

eg:yjp_warehouse.dm_bizuser_lastmonthdeal

3

天/月调度,必选

day/month,二选一

4

用于条件过滤的单列名,必选

一般为时间列的列名

5

具体过滤的时间,可选

不填,默认为昨天(前一月),yyyyMMdd(yyyyMM),如果是启调度任务,就不用填写,手工重跑任务需要配置

  1. 部署

代码

import java.sql.{Connection, DriverManager}
import java.text.SimpleDateFormat
import java.util.{Calendar, Date, Properties}

import org.apache.spark.sql.{SaveMode, SparkSession}
import org.slf4j.LoggerFactory


/**
 * Created by fengwu 
 * Date: 2019-07-30
 * update by tianjun
 * 2019年09月05日10:20:59
 */

object ExportHandler {

  private val logger = LoggerFactory.getLogger(this.getClass)

  def main(args: Array[String]): Unit = {
    val prop = new Properties()
    val inputStream = ExportHandler.getClass.getClassLoader.getResourceAsStream("jdbc.properties")

    prop.load(inputStream)
    val master = prop.getProperty("kudu.master")
    val url = prop.getProperty("jdbc.url")
    val user = prop.getProperty("jdbc.user")
    val pwd = prop.getProperty("jdbc.password")

    val sdb = args(0)
    val tdb = args(1)
    val day_or_month = args(2)
    val date_key = args(3)
    var date_value = ""
    val cal: Calendar = Calendar.getInstance()
    if (args.length == 4 && day_or_month.equals("day")) {
      val dateFormat: SimpleDateFormat = new SimpleDateFormat("yyyyMMdd")
      cal.add(Calendar.DATE, -1)
      date_value = dateFormat.format(cal.getTime())
    }
    if (args.length == 4 && day_or_month.equals("month")){
      val dateFormat: SimpleDateFormat = new SimpleDateFormat("yyyyMM")
      cal.add(Calendar.MONTH, -1)
      date_value = dateFormat.format(cal.getTime())
    }
    if (args.length == 5) {
      date_value = args(4)
    }

    logger.info("--------" + sdb)
    logger.info("--------" + tdb)
    logger.info("--------" + date_key)
    logger.info("--------" + date_value)


    val spark = SparkSession.builder()
      //            .master("local[*]")
      .appName(s"crm_kudu2mysql_$sdb")
      .getOrCreate()

    val df = spark.read.options(Map("kudu.master" -> s"$master", "kudu.table" -> s"impala::$sdb"))
      .format("kudu").load


    df.createOrReplaceTempView("test")

    val selectDF = spark.sql(s"select * from test where $date_key=$date_value")
    //    val selectDF = spark.sql("desc test")
    //    val cols = selectDF.select("col_name").show()

    val conn: Connection = DriverManager.getConnection(url, user, pwd)
    //        conn.setAutoCommit(false);
    ////
    val statement = conn.createStatement
    statement.execute(s"delete from $tdb where $date_key=$date_value")
    statement.close()
    conn.close()

    selectDF.write
      .format("jdbc")
      .option("url", url)
      .option("dbtable", s"$tdb")
      .option("user", user)
      .option("password", pwd)
      .option("driver", "com.mysql.jdbc.Driver")
      .mode(SaveMode.Append)
      .save()

    logger.info("------------ export data success! ----------")
  }
}


hue上传

spark-sql实现Kudu同步数据到mysql_第1张图片

任务编辑

spark-sql实现Kudu同步数据到mysql_第2张图片

spark-sql实现Kudu同步数据到mysql_第3张图片

**红框为如上介绍的程序需要的参数,绿框框为spark所需参数

配置调度任务

spark-sql实现Kudu同步数据到mysql_第4张图片

调度任务

spark-sql实现Kudu同步数据到mysql_第5张图片

  1. 重要说明

调度任务从部署的第三部开始即可,spark的参数可按需配置。

大致测试如下:

5.5k数据3~5min

10w 数据15min

25w 数据 1h+16min

可以看到通过spark-sql进行数据同步,效率极其低下(资源消耗也不少)

建议参看下一篇(或者类似的同步工具)

https://blog.csdn.net/tianjun2012/article/details/101206169

优化的办法:

有两种方式: 
    一种使用专业的数据倒腾组件,如:https://blog.csdn.net/tianjun2012/article/details/101206169 
    另外一种方式:比如本篇可以换成直接使用kud更底层的api进行数据倒腾,效率会有量级的提升。

 

你可能感兴趣的:(spark)