本文档所描述的内容属于神策分析的高级使用功能,涉及较多技术细节,适用于对相关功能有经验的用户参考。如果对文档内容有疑惑,请咨询神策值班同学获取一对一的协助。

概述

在神策分析的单机和集群版中,我们提供了更加高效、稳定的 SQL 查询方式,即直接使用 JDBC 或者 impala-shell 进行数据查询。关于具体如何使用 JDBC 连接 Impala 可以直接参考官方文档

使用方法

使用步骤

获取 JDBC 地址

  • 登录任意的神策服务器
  • 切换至 sa_cluster 账户
su - sa_cluster
CODE
  • 使用以下命令获取地址
spadmin config get client -m impala -p sp
CODE
aradmin config get client -p sp -m impala
CODE


      例如输出是:

{
	"hive_url_list": [
		"jdbc:hive2://192.168.1.2:21050/rawdata;auth=noSasl",
		"jdbc:hive2://192.168.1.3:21050/rawdata;auth=noSasl",
	],
	"hive_user": "sa_cluster"
}
CODE

其中,hive_url_list 中的任意一个地址都可用于连接。

JDBC 链接访问

如果使用代码访问,我们建议使用 1.1.0 版本的 Hive JDBC Driver 来进行访问,Maven 的依赖定义如下:

<dependency>
	<groupId>org.apache.hive</groupId>
	<artifactId>hive-jdbc</artifactId>
	<version>1.1.0</version>
</dependency>
XML

注意:实际代码运行中, Hive JDBC Driver 会依赖其他 jar 包,主要有 hadoop-common 、hive-service、hive-common 和 libthrift。正常这些 jar 包会自动获取,如果没有自动获取,需要再添加相应的 jar 包,或检查是否在pom中排除了对应的包,可检查代码中是否存在类似的配置:

<exclusions>
	<exclusion>
		<groupId>org.apache.hadoop</groupId>
    	<artifactId>hadoop-common</artifactId>
	</exclusion>
    <exclusion>
		<groupId>org.apache.hive</groupId>
    	<artifactId>hive-service</artifactId>
	</exclusion>
</exclusions>
XML

如果包已导入,但是有其他的报错出现,则可能是存在包冲突所导致的,需要进行排包操作。


另外,Impala 也支持使用官方的 Impala JDBC Driver 进行访问,不过为了兼容神策分析系统,请使用的时候务必开启 Native SQL 的选项,例如:

jdbc:impala://192.168.1.1:21050/rawdata;UseNativeQuery=1
CODE

注意:使用不同 Driver 访问时使用的 JDBC URI 也会有所不同。

查询数据

目前,神策分析的所有数据都映射到事件表(events) 和用户表(users) 这两张数据表,但连接 JDBC 进行数据访问时,会显示 `event_ros_p*`、`event_view_p*` 等底层表,查询数据不需要关注这些底层表,使用事件表(events) 和用户表(users)即可查询所有的事件数据和用户数据,但需要在 SQL 中加上注解来执行,例如查询默认项目的 events 数据:

SELECT user_id,distinct_id,event,time,$lib as lib  FROM events WHERE `date` = CURRENT_DATE() LIMIT 10 /*SA*/;
SQL

其中的 `/*SA*/` 表示当前 SQL 是一个发给神策系统的查询。类似的,如果想看 events 表有哪些字段,可以使用:

DESC events /*SA*/;
SQL

如果不是查询默认项目,则需要指定项目名称,例如:

SELECT id,first_id,second_id  FROM users LIMIT 10 /*SA(test_project)*/;
SQL

最后,我们还可以让一个 SQL 的一部分使用神策的查询,其它部分使用正常的 Impala 查询,例如:

CREATE TABLE test_data AS 
/*SA_BEGIN(test_project)*/ SELECT id, first_id, $city AS city FROM users LIMIT 10 /*SA_END*/;
SQL

使用这种方式,也可以很容易的实现把神策的数据和其它外部数据表进行 JOIN。

特别注意,如果您的项目开启了多对一用户关联,如果不加 /*+remapping_on*/ 注释,默认导出的是未经过多对一修复后的数据。如果需要导出多对一修复后的数据,先要保证您的 impala 版本大于等于 3.2.0.069(可咨询神策值班同学确认),然后在查询导出语句添加 /*+remapping_on*/ 注释,例如

SELECT * from events limit 1 /*SA(default)*/ /*+remapping_on*/;
SQL

注意事项

  • 使用 JDBC 进行数据访问是不需要账号及密码的。
  • 执行的 SQL 需加上注解来查 events 和 users 表数据。

常见问题

使用 impala-shell 进行查询

除了直接使用 JDBC 接口之外,也可以直接使用 impala-shell 工具进行查询。通常有两种使用方式:

  1. 直接登录任意的神策服务器,运行 impala-shell 命令即可。

    impala-shell
    CODE
  2. 使用任意 2.6.0 以上的 impala-shell 客户端,连接到上面 hive_url_list 中的地址(无需指定端口)。
  3. 神策使用的库名是 rawdata, 注意切换过去后再做查询或导出数据。

    use rawdata;
    CODE

数据导出

如果想把神策的数据导出成文本格式,用于备份或者其它用途,那可以使用以下方案:

impala-shell  -q 'CREATE TABLE export_data STORED AS parquet LOCATION "/tmp/impala/export_data" AS /*SA_BEGIN(default)*/ SELECT id, first_id  FROM users LIMIT 10 /*SA_END*/;'
SQL

创建语句解读:

  • CREATE TABLE 表名 :创建一个名为 export_data (表名可自定义)的文本格式的数据表
  • STORED AS parquet: 指定文件的存储格式,这里指定为 parquet 格式,也可以默认为文本格式等
  • LOCATION "指定路径" :需要指定目录到 hdfs 的 /tmp/impala 或者其他有权限的目录。建议目录格式为 /tmp/impala/表名,方便区分不同数据表。
  • AS 加注释的 SQL 语句 :AS 后为需要导出的数据,注意需要在 SQL 中加上注解来执行,注释结构为 /*SA_BEGIN(project)*/  SQL 语句 /*SA_END*/。其中 project 填写实际项目英文名。无法确定项目英文名时,可参考如下方法:

执行成功之后,成功创建 default.export_data 数据表。

注意:1.如果提示没有创建表权限,请联系神策运维进行处理

2.普通 Impala/Hive 表不支持带 $ 的字段,因此如果导出这类字段需要使用 AS 重命名。

执行 impala-shell ,查询该表并获取该数据表的 HDFS 路径

SHOW TABLE STATS default.export_data;
SQL

其中输出的 Location 列即是导出文件所在的 HDFS 目录,例如:

hdfs://data01:8020/tmp/impala/export_data
CODE


可以使用 hadoop 命令将 HDFS 文件取到本地,默认是在 /home/sa_cluster/ 目录下。比如,在 /home/sa_cluster/export_data/ 路径下找到本地文件

hadoop fs -get hdfs://data01:8020/tmp/impala/export_data
CODE
  • 上述目录里的文件是以 Hive 默认分隔符(即 \001)进行列分隔的文本文件。
  • 按需拷贝走上面路径下的文件即可。
  • 删除神策 HDFS 文件,避免占用神策服务器的存储空间。