概要
由于spark可以接入非常多的数据源,且能够完美连接hive库,那么离线数仓以spark作为数据采集工具,将是一个方便可行的方案。
配置文件json
参考alibaba开发的datax数据同步工具,及目前的flinkx数据同步工具,以json文件作为配置文件,主要分为reader模块,writer模块。这里列出hive->mysql的json demo
{
"cluster":"10.40.3.26",
"reader":{
"name":"hivereader",
"sql":"select * from dphj.dim_base_afc_device"
},
"writer":{
"name":"mysqlwriter",
"url":"jdbc:mysql://localhost:3306/test1?characterEncoding=utf8&serverTimezone=UTC&useSSL=false",
"username":"root",
"password":"root",
"table":"hive_test",
"writeMode":"append",
"preSql":"truncate table hive_test",
"afterSql":""
}
}
连接hive
spark连接hive主要读取三个文件, 分别读取hive下的,core-site.xml、hdfs-site.xml、hive-site.xml
sparkSession.sparkContext.hadoopConfiguration.addResource(coreSiteFileName)
sparkSession.sparkContext.hadoopConfiguration.addResource(hdfsSiteFileName)
sparkSession.sparkContext.hadoopConfiguration.addResource(hiveSiteFileName)
这样spark就连接上了hive
连接其他数据源
- jdbc数据源
通过sparkSession内置的方法,读取数据转化为dataframe
sparkSession.read.format("jdbc").options(
Map(
"url" -> url,
"dbtable" -> s"(${sqlText}) t",
"user" -> userName ,
"password"->password
)
).load
- 文件数据源
利用sparkContext.textFile 读取文件,数据类型为RDD[String],转化为RDD[Row],再将RDDrow转化为dataframe,就可以注册为临时表了 - 其他数据源
思路就是如果spark实现了的数据源,先获取得到rdd,想办法把rdd转化为dataframe,然后注册成表就ok了
数据同步
基于spark.sql 的insert 语句,就能实现数据的同步了。
缺陷
目前数据的读取默认只有一个分区,有些数据源是只支持一个分区,但是jdbc的话,可以通过直接的sql语句切分,开启多个分区,从而提升数据同步速度。