对于一个平台来说,使用者对技术本身是不敏感的,所以我们需要增加一些限制来减少集群的一些不可控情况,例如不断的写入新表/新数据却不记得删除,大量不按规范创建的表名等情况。与此同时应尽量让技术对用户透明,比如让其无感知的访问多种类型的数据库。

下文以拦截 spark.sql() 方法为例,通过为 hive表的添加生命周期,自动切换 tidb 表,表权限校验等几个小功能 来说明。

如何使用
代码
SparkSqlAspect.scala
为了便于理解以下代码会进行一些删减

import org.aspectj.lang.ProceedingJoinPoint
import org.aspectj.lang.annotation.{Around, Aspect}
import org.slf4j.LoggerFactory
import org.apache.spark.sql.{Dataset, Row, SparkSession, TiContext}

import cn.tongdun.datacompute.parser._
import cn.tongdun.datacompute.parser.spark.SparkSQLHelper

@Aspect
class SparkSqlAspect {
private val logger = LoggerFactory.getLogger(classOf[SparkSqlAspect])
private var tiContext: TiContext = null

@Around("execution(public org.apache.spark.sql.Dataset<org.apache.spark.sql.Row> org.apache.spark.sql.SparkSession.sql(java.lang.String)) && args(sqlRaw)")
def around(pjp: ProceedingJoinPoint,
sqlRaw: String): Dataset[Row] www.yongshiyule178.com= {
//sparkSQLHelper 是我们基于 antlr4 增加了一些 sparksql 语法的支持,例如建表时需要指定 lifecycle 等
val sql = SparkSQLHelper.format(sqlRaw)
val spark = pjp.getThis.asInstanceOf[SparkSession]
var dataset: Dataset[Row] = spark.emptyDataFrame
val statementData = SparkSQLHelper.getStatementData(sql)
val statement = statementData.getStatement()

//getType 方法用于获取sql的类型
statementData.getType match {
case StatementType.CREATE_TABLE =>
createMethod()

case StatementType.CREATE_TABLE_AS_SELECT =>
createAsSelectMethod()

case StatementType.SELECT =>
dataset = selectMethod(spark, inputSql, statement, pjp)

case _ =>
dataset = pjp.proceed(pjp.getArgs).asInstanceOf[Dataset[Row]]
}
dateset
}

// 建表必须带有 lifecycle 字段,并对表名进行校验,将相关信息注册到元数据系统等操作
def createMethod(): Unit = {
...
}

// 约定 create table as select 生成的表都为中间表,必须以 tdl_ 开头,lifecycle 固定为7天
def createAsSelectMethod(): Unit = {
...
}

// select 对多个数据库源进行判定以及对权限进行校验,下面以tidb为例
def selectMethod(spark: SparkSession,
inputSql: String,
statement: Statement,
pjp: ProceedingJoinPoint)www.mhylpt.com/: Dataset[Row] = {
val tableData = statement.asInstanceOf[TableData]
//获取所有需要访问的源表
tableData.getInputTables.toArray.foreach {
case t: TableSource =>
val databaseName = t.getDatabaseName
val tableName = t.getTableName
val fullTableName = databaseName + "." + tableName
//所有tidb的库都以tidb为前缀
if (t.getDatabaseName.startsWith("tidb")) {
//对tidb表权限进行校验
if(tableAuthCheck(...)){
//判断tiContext是否初始化
if (tiContext == null) {
tiContext = new TiContext(spark)
}
//对tidb表的表名进行替换,避免与现有的临时表/中间表冲突
val replacedTable = "tdl_" + databaseName + "_" + tableName
//加入tidb表数据源
tiContext.tidbMapTable(databaseName, tableName)
//注册为临时表
tiContext.getDataFrame(databaseName, tableName).createOrReplaceTempView(replacedTable)
//将sql语句中的表名进行替换
sql = StringUtils.replace(sql,www.dasheng178.com fullTableName, replacedTable)
} else {
throw new IllegalAccessError(fullTableName + "没有访问权限")
}
}
case _ =>
}
pjp.proceed(Array(sql)www.thd540.com).asInstanceOf[Dataset[Row]]

配置
pom.xml
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.1</version>
</dependency>

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.1</version>
</dependency>

<!--公司内部版本,用于支持spark2.3-->
<dependency>
<groupId>com.pingcap.tispark</groupId>
<artifactId>tispark-core</artifactId>
<version>1.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
resources/META-INF/AspectSql.aj
<?xml version="1.0" encoding=www.taohuayuan178.com/"UTF-8" ?>
<aspectj>
<aspects>
<aspect name="cn.tongdun.aspectj.SparkSqlAspect"/>
</aspects>
<weaver options="-Xset:weaveJavaxPackages=true"/>
</aspectj>
spark-defaults.conf
spark.driver.extraClassPath /path/to/spark-aspectj.jar
spark.driver.extraJavaOptions -javaagent:/home/admin/aspectjweaver-1.9.1.jar
结语
通过上述的操作,在用户调用 spark.sql(...) 时将会触发相应的方法。hdfs/rdd/sparkSession/etc. 操作同理可实现。

不同公司面临的真实场景各有不同,因此并没有过多的实现细节,仅给需要的同学提供一些思路

实例对比 Julia, R, Python,谁是狼语言?的更多相关文章

  1. 在天河二号上对比Julia,Python和R语言

    Julia是一款高级高效为技术计算(technical computing)而设计的编程语言,其语法与其他计算环境类似.其为分布式计算和并行所设计,最知名的地方在于其接近C语言的高效率. 按开发者的话 ...

  2. 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类

    30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...

  3. julia,集Python、C++、R为一体!Julia 1.0重磅发布, MIT发布史上最强科学计算编程语言?创始人独家解答11个问题

    这个编程语言的新版本之所以受到整个人工智能界的关注,最主要的原因正是其将 C 语言的速度.Ruby 的灵活.Python 的通用性前所未有地结合在一起,支持并行处理,易于学习和使用,尤其适合科学和工程 ...

  4. 7 Tools for Data Visualization in R, Python, and Julia

    7 Tools for Data Visualization in R, Python, and Julia Last week, some examples of creating visualiz ...

  5. 基于Spark环境对比Python和Scala语言利弊

    在数据挖掘中,Python和Scala语言都是极受欢迎的,本文总结两种语言在Spark环境各自特点. 本文翻译自  https://www.dezyre.com/article/Scala-vs-Py ...

  6. Python与C语言基础对比(Python快速入门)

    代码较长,建议使用电脑阅读本文. 10分钟入门Python 本文中使用的是Python3 如果你曾经学过C语言,阅读此文,相信你能迅速发现这两种语言的异同,达到快速入门的目的.下面将开始介绍它们的异同 ...

  7. python与c语言交互应用实例

    1.python向c语言写数据 1) 先将接收端编译成一个共享链接库gcc/arm-linux-gnueabihf-gcc -o bluetooth_proxy.so -shared -fPIC bl ...

  8. julia与python中的列表解析.jl

    julia与python中的列表解析.jl #=julia与python中的列表解析.jl 2016年3月16日 07:30:47 codegay julia是一门很年轻的科学计算语言 julia文档 ...

  9. NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用)

    有很多改进版的word2vec,但是目前还是word2vec最流行,但是Glove也有很多在提及,笔者在自己实验的时候,发现Glove也还是有很多优点以及可以深入研究对比的地方的,所以对其进行了一定的 ...

随机推荐

  1. php 单例模式笔记

    <?php /** * 单例模式1. 它们必须拥有一个构造函数,并且必须被标记为private2. 它们拥有一个保存类的实例的静态成员变量3. 它们拥有一个访问这个实例的公共的静态方法单例类不能 ...

  2. C++unsigned char和char区别

    char和unsigned charchar与unsigned char都是一个字节8bit,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char( ...

  3. Java8函数之旅 (三) --几道关于流的练习题

    为什么要有练习题?    所谓学而不思则罔,思而不学则殆,在系列第一篇就表明我认为写博客,既是分享,也是自己的巩固,我深信"纸上得来终觉浅,绝知此事要躬行"的道理,因此之后的几篇博 ...

  4. PHP中可变变量到底有什么用?

    转自:http://blog.csdn.net/engine_1124/article/details/8660291 什么是可变变量? PHP提供了一种其他类型的变量——可变变量.可变变量允许我们动 ...

  5. java基础面试题:说说&和&&的区别

    &与&&都是逻辑与 不同的是&左右两边的判断都要进行,而&&是短路与,当&&左边条件为假则不用再判断右边条件,所以效率更高 例如,对于i ...

  6. vue学习之路 - 1.初步感知

    一.安装 这里使用node的npm包管理工具进行操作.操作前请先下载node. 在工程文件夹中使用以下命令安装vue: npm install vue 如下图所示:我在 helloworld 文件夹中 ...

  7. Linux系统kernel参数优化

    目录 iptables相关 单进程最大打开文件数限制 内核TCP参数方面 内核其他TCP参数说明 众所周知在默认参数情况下Linux对高并发支持并不好,主要受限于单进程最大打开文件数限制.内核TCP参 ...

  8. Mysql关闭和修改密码

    数据库的关闭方法: 1.优雅的关闭数据库的方法:mysqladmin -uroot -p123456 shutdown 2.脚本关闭:/etc/init.d/mysqld stop 3.使用kill信 ...

  9. PAT Basic 1083

    1083 是否存在相等的差 给定 N 张卡片,正面分别写上 1.2.…….N,然后全部翻面,洗牌,在背面分别写上 1.2.…….N.将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否 ...

  10. 按位与&、或|、异或^等运算方法

    (转载) 按位与运算符(&) 参加运算的两个数据,按二进制位进行“与”运算. 运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1; ...