Kudu同步数据到mysql实施方案
- 简介
目前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),如果是启调度任务,就不用填写,手工重跑任务需要配置 |
- 部署
代码
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所需参数
配置调度任务
调度任务
- 重要说明
调度任务从部署的第三部开始即可,spark的参数可按需配置。
大致测试如下:
5.5k数据3~5min
10w 数据15min
25w 数据 1h+16min
可以看到通过spark-sql进行数据同步,效率极其低下(资源消耗也不少)
建议参看下一篇(或者类似的同步工具)
来源:CSDN
作者:tianjun2012
链接:https://blog.csdn.net/tianjun2012/article/details/100942403