Grabit 是马哈鱼数据血缘分析器的一款支持工具,作用是从各种数据源收集 SQL 数据,然后将它们上传到马哈鱼,以便马哈鱼对这些数据进行分析获取血缘关系。目前 Grabit 支持获取数据的方式有:

  • 获取本地文件
  • 连接指定数据库获取 metadata。
  • 获取本地目录
  • 从指定 git 仓库获取数据

其中,连接指定数据库获取 metadata 的这种方式目前支持下面这几种数据库:

Azure,Greeplum,Hive,MySQL,Netezza,Oracle,Postgresql,Redshift,Snowflake,SQLServer,Teradata

以上所有的数据库都是通过账号密码进行连接认证,只有 Snowflake除了可以使用账号密码认证外,还支持使用密钥对进行身份认证。并且,连接到 Snowflake后不光支持获取表,视图,存储过程的 DDL,还支持获取历史执行的查询 SQL,收集这些数据后提交给马哈鱼分析这些数据的血缘关系。

本文主要就介绍 Grabit 如何使用 Snowflake的密钥对进行认证,并获取表,视图,存储过程的 DDL 以及指定时间内历史执行的查询 SQL,收集这些 metadata 后上传到马哈鱼获取血缘关系。

生成密钥对

使用密钥对认证方式需要自己在本地生成密钥对,生成的密钥对是一对相匹配的公私钥文件,生成之后再在 Snowflake 服务器上为账号分配公钥,之后此用户就可以使用私钥进行认证了,具体生成和分配操作如下:

  • 生成公私钥:
  • 1,首先生成私钥,官方提供了加密和不加密的两种方式,建议生成加密的私钥
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8
  • 2,选择私钥文件生成对应的公钥
openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
  • 为用户分配生成的公钥
alter user jsmith set rsa_public_key='MIIBIjANBgkqh...';

但是这里需要注意,执行 ALTER USER语句需要拥有 USERADMIN角色的权限,一般需要执行以下操作:

USE ROLE useradmin

官方详情文档:[Key Pair Authentication & Key Pair Rotation]

分配获取历史 SQL 的权限角色

想要从 Snowflake中获取历史执行 SQL,必须定义一个可以访问 SNOWFLAKE 数据库的角色,并为这个角色分配 WAREHOUSE 仓库权限。

例如创建 custom_role 角色,并为其分配 test_warehouse 仓库的权限:

use role accountadmin;
grant imported privileges on database snowflake to role custom_role;
use role custom_role;

use role sysadmin
GRANT ALL PRIVILEGES ON WAREHOUSE test_warehouse TO role custom_role;

官方详情文档:[QUERY_HISTORY]

Grabit 使用密钥对认证并获取历史查询 SQL 的配置

进行了上面两步操作之后,就可以使用 Grabit 进行认证并获取 metadata 数据提交马哈鱼。Grabit 提供了命令行的方式操作,通过加载 Grabit 所支持的结构的配置文件,连接指定数据源获取数据后推送到马哈鱼进行血缘关系分析。

Grabit 提供了配置文档模板的格式,下面主要介绍使用 Snowflake 密钥对进行认证获取 metadata 然后推送到马哈鱼的配置说明。

配置文件示例:

{
    "databaseServer":{
        "hostname":"127.0.0.1",
        "port":"433",
        "username":"USERNAME",
        "privateKeyFile":"/data/rsa_key.p8",
      "privateKeyFilePwd":"123456",
        "database":"DATABASE",
      "enableQueryHistory":true,
      "queryHistoryBlockOfTimeInMinutes":30,
      "queryHistorySqlType":"SELECT,UPDATE",
      "snowflakeDefaultRole":"custom_role"
    },
    "SQLFlowServer":{
        "server":"http:127.0.0.1",
        "serverPort":"8081",
        "userId":"gudu|0123456789",
        "userSecret":""
    },
    "SQLScriptSource":"database",
    "databaseType":"snowflake"
}

其中的属性说明:

  • SQLScriptSource
    此属性是 Grabit 收集数据源的来源类型,目前支持四种来源,必填。分别对应具体的 SQLScriptSource 值如下:
  • 上传本地文件 (singleFile
  • 连接指定数据库获取 metadata(database
  • 上传本地目录(directory
  • 从指定 git 仓库获取 SQL 脚本(gitserver
  • databaseType
    数据源的数据库类型,必填。
  • databaseServer
    SQLScriptSource=database时,此对象中的值必填,代表着从指定数据库中获取 metadata。
  • hostname
    数据库连接 ip,必填。
  • port
    数据库连接端口,必填。
  • username
    连接的用户名,必填。
  • privateKeyFile
    使用密钥对认证所需要的私钥文件地址,默认是生成的rsa_key.p8文件,使用密钥对认证时必填。
  • privateKeyFilePwd
    生成私钥的时候设置的密码,如果选择不加密方式生成则不用填。
  • database
    要连接的数据库名称,可选。
  • enableQueryHistory
    表示是否开启收集历史查询 SQL,默认为 false 不开启,为 true 则开启。
  • queryHistoryBlockOfTimeInMinutes
    enableQueryHistory=true时起作用,表示从查询历史中提取 SQL 查询的时间间隔,默认为30分钟。
  • queryHistorySqlType
    enableQueryHistory=true时起作用,表示从查询历史中指定提取 DML 类型的 SQL。如果为空时提取所有类型,如果指定多种类型时,则用逗号分隔,如SELECT,UPDATE,MERGE。目前支持的类型有 SHOW、SELECT、INSERT、UPDATE、DELETE、MERGE、CREATE TABLE、CREATE VIEW、CREATE PROCEDURE、CREATE FUNCTION。
    例如:queryHistorySqlType: "SELECT,DELETE"
  • snowflakeDefaultRole
    所连接的 Snowflake 数据库的角色,可选。
  • SQLFlowServer
    因为推送要分析的数据到马哈鱼,所有也需要设置其连接信息。
  • server
    马哈鱼服务器的地址,如果使用官方云版本The SQLFlow Cloud Server,则填写 https://api.gudusoft.com,如果使用内部部署的The SQLFlow on-premise version版本,则填写 127.0.0.1或者 http://127.0.0.1,或者其他服务器地址。
  • port
    端口,如果使用的是云版本则不填写,如果是马哈鱼的内部部署版本,则填写默认的端口 8081,当然此端口可以自定义,如果你在 nginx 配置文件中设置了 nginx 反向代理设置了特定的端口则需要设置为对应的端口。
  • userId 和 userSecret
    马哈鱼平台的用户 ID 和密匙,如果你使用内部部署版本,需要将此值设置为 gudu|0123456789 并保持 userSecret 为空。如果你想连接到云平台The SQLFlow Cloud Server,你可以申请一个 30 天的高级帐户获取必要的用户 ID 和密码
    例如本地版本:
"SQLFlowServer":{
"server":"127.0.0.1",
"serverPort":"8081",
"userId":"gudu|0123456789",
"userSecret":"" 
}

云版本:

"SQLFlowServer":{
"server":"https://api.gudusoft.com",
"serverPort":"",
"userId":"your own user id here",
"userSecret":"your own secret key here" 
}

Grabit 命令行运行方式

Grabit 支持 UI 界面和命令行两种方式操作,目前 Snowflake使用密钥对认证只支持命令行方式,命令行支持 linux,mac 和 windows 环境。

注意:命令行方式需要 java8 或以上版本

Grabit 可在此处下载:Download Grabit Tool

目录结构

下载之后是一个 grabit-x.x.x.zip 的文件,解压后文件层级为:

/grabit-x.x.x/
└── conf-template
    ├── snowflake-config-template.json    #snowflake配置文件模板
    ├── ...    #其他配置文件模板
└── grabit-x.x.x.jar    #执行的jar程序
└── readme.md    #Grabit说明文档
└── start.bat    #winodws环境启动脚本
└── start.sh    #linux和mac环境启动脚本
└── lib
    ├── ...    #依赖的jar
启动命令(linux 或者 mac 环境)

./start.sh /f <path_to_config_file>

<path_to_config_file>:配置文件地址

例如:

./start.sh /f config.json

以上就是对 Grabit 使用 Snowflake 密钥对进行认证并获取 metadata 提交马哈鱼的介绍,Grabit 提交数据到马哈鱼之后,马哈鱼数据血缘分析器会对数据进行分析,然后在马哈鱼平台上查看分析结果。Grabit 还有很多其他的功能,会继续介绍其他功能。

参考

马哈鱼数据血缘关系分析工具中文网站: https://www.sqlflow.cn

马哈鱼数据血缘关系分析工具在线使用: https://sqlflow.gudusoft.com