文章目录
1 APACHE GRIFFIN技术实践
1.1 准备DEMO数据
[zhouchen@hadoop202 target]$ hive -e "create database griffin_demo"
[zhouchen@hadoop202 target]$ hive --database griffin_demo
1.2 创建DEMO表
hive> CREATE EXTERNAL TABLE `demo_src`(
> `id` bigint,
> `age` int,
> `desc` string)
> PARTITIONED BY (
> `dt` string,
> `hour` string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY '|'
> LOCATION
> 'hdfs://hadoop202:9820/griffin/data/batch/demo_src';
hive> CREATE EXTERNAL TABLE `demo_tgt`(
> `id` bigint,
> `age` int,
> `desc` string)
> PARTITIONED BY (
> `dt` string,
> `hour` string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY '|'
> LOCATION
> 'hdfs://hadoop202:9820/griffin/data/batch/demo_tgt';
hive> show tables;
OK
demo_src
demo_tgt
Time taken: 0.051 seconds, Fetched: 2 row(s)
– 如果有问题,删除后再重新创建
– drop table if exists demo_src;
– drop table if exists demo_tgt;
1.3 生产测试数据
1.获取官网测试数据。在/opt/module/griffin-master目录下创建data文件夹,并下载相关测试数据
[zhouchen@hadoop202 griffin-master]$ mkdir data
[zhouchen@hadoop202 data]$
wget http://griffin.apache.org/data/batch/gen_demo_data.sh
wget http://griffin.apache.org/data/batch/gen_delta_src.sh
wget http://griffin.apache.org/data/batch/demo_basic
wget http://griffin.apache.org/data/batch/delta_tgt
wget http://griffin.apache.org/data/batch/insert-data.hql.template
wget http://griffin.apache.org/data/batch/gen-hive-data.sh
wget http://griffin.apache.org/data/batch/create-table.hql
wget http://griffin.apache.org/data/batch/delta_src
wget http://griffin.apache.org/data/batch/delta_tgt
[zhouchen@hadoop202 data]$ chmod 777 ../data -R
#生成临时文件
[zhouchen@hadoop202 data]$ bash gen_demo_data.sh
#生产测试数据
[zhouchen@hadoop202 data]$ bash gen-hive-data.sh
2.查看生成的数据如下:
[zhouchen@hadoop202 data]$ head -3 delta_src
124|262|262
124|1752|1752
124|533|533
[zhouchen@hadoop202 data]$ head -3 demo_src
0|1|1
0|2|2
0|3|3
[zhouchen@hadoop202 data]$ head -3 demo_tgt
0|1|1
0|2|2
0|3|3
1.4 修改数据插入脚本
[zhouchen@hadoop202 data]$ insert-data.hql.template
#修改内容如下
LOAD DATA LOCAL INPATH 'demo_src' INTO TABLE griffin_demo.demo_src PARTITION (PARTITION_DATE);
LOAD DATA LOCAL INPATH 'demo_tgt' INTO TABLE griffin_demo.demo_tgt PARTITION (PARTITION_DATE);
1.5 检查生成的数据
1.查看hive的数据
hive> select * from demo_src limit 3;
OK
0 1 1 20200604 19
0 2 2 20200604 19
0 3 3 20200604 19
2.查看hdfs上的数据
[zhouchen@hadoop202 griffin-master]$ hdfs dfs -ls /griffin/data/batch
2020-06-04 20:08:01,183 INFO [main] Configuration.deprecation (Configuration.java:logDeprecation(1395)) - No unit for dfs.client.datanode-restart.timeout(30) assuming SECONDS
Found 2 items
drwxr-xr-x - zhouchen supergroup 0 2020-06-04 19:11 /griffin/data/batch/demo_src
drwxr-xr-x - zhouchen supergroup 0 2020-06-04 19:11 /griffin/data/batch/demo_tgt
3.数据资产DataAssets
1.6 UI创建MEASURE
注意根据官网描述,目前UI创建Measure只支持Accuracy的Measure,UI界面上虽然有其他选项但是无法运行job。
1.6.1 添加一个新的Measure
单击头部的“Measures”,然后选择“Create Measure”。可以使用该measure来处理数据并获得所需的结果。
1.6.2 选择准确度Accuracy
1.6.3 选择数据源的字段
1.6.4 选择目标表的字段
1.6.5 选择条件
“Map To”: 选择source和target匹配的规则。共以下6中选项:
• = : 两列的数据应完全匹配。
• != : 两列的数据应该不同。
• >: 目标列数据应大于源列数据。
• >= : 目标列数据应大于或等于源数据。
• <: 目标列数据应小于源列数据。
• <=: 目标列数据应小于或等于源列数据
1.6.6 选择时间格式和分区尺度
1.6.7 添加Measure名称和描述
1.7 UI创建JOB
1.7.1 新建一个Job
1.7.2 与Measure结合并调度任务执行
• Job Name: 设置Job的名字
• Measure Name: 要执行的measure的名称,这个是从前面创建的Measure的名字中选择。
• Cron Expression: cron 表达式。 For example: 0 0/4 * * *.
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
• Begin: 数据段开始时间与触发时间的比较
• End: 数据段结束时间与触发时间比较。
提交作业后,Apache Griffin将在后台安排作业,计算完成后,可以监视仪表板以在UI上查看结果
1.7.3 查看运行结果单击“DQ指标”
• 点击头部的Health会显示指标数据的热图。
• 点击右侧的DQ Metrics可以看到指标图标。单击图标可以放大。
1.8 手动定制规则运行JOB
1.8.1 准确度度量Accuracy Measure
1)创建json文件制定相应规则
在/opt/module/griffin-master/measure/target目录下创建文件dq.json
vim dq.json
{
"name": "batch_accu",
"process.type": "batch",
"data.sources": [
{
"name": "src",
"baseline": true,
"connectors": [
{
"type": "hive",
"version": "2.3",
"config": {
"database": "gmall",
"table.name": "dwd_order_info"
}
}
]
}, {
"name": "tgt",
"connectors": [
{
"type": "hive",
"version": "2.3",
"config": {
"database": "gmall",
"table.name": "dws_user_action"
}
}
]
}
],
"evaluate.rule": {
"rules": [
{
"dsl.type": "griffin-dsl",
"dq.type": "accuracy",
"out.dataframe.name": "accu",
"rule": "src.id = tgt.user_id ",
"details": {
"source": "src",
"target": "tgt",
"miss": "miss_count",
"total": "total_count",
"matched": "matched_count"
},
"out": [
{
"type": "metric",
"name": "accu"
},
{
"type": "record",
"name": "missRecords"
}
]
}
]
},
"sinks": ["CONSOLE", "HDFS"]
}
选项:“rule”: “src.id = tgt.id AND src.age = tgt.age AND src.desc = tgt.desc”
rule制定匹配规则如src表的id字段对应 tgt表id字段
当前规则是id age desc三者字段相同,这个规则就是接下来对应job所需监控的对应关系
2)在/opt/module/griffin-master/measure/target目录下创建文件env.json
vim env.json
{
"spark": {
"log.level": "WARN"
},
"sinks": [
{
"type": "console"
},
{
"type": "hdfs",
"config": {
"path": "hdfs://hadoop202:9820/griffin/persist"
}
},
{
"type": "elasticsearch",
"config": {
"method": "post",
"api": "http://hadoop202:9200/griffin/accuracy"
}
}
]
}
分别指定hdfs结果存储路径和elasticsearch路径
两个json文件编写完毕后 指定 /opt/module/griffin-master/measure/target 该路径下的griffin-measure.jar 运行Spark任务
(3)Spark 提交脚本命令
[zhouchen@hadoop202 target]$ spark-submit --class org.apache.griffin.measure.Application --master yarn --deploy-mode client --driver-memory 1g --executor-memory 1g --num-executors 1 griffin-measure.jar env.json dq.json
跑完任务之后,可以看到对比结果总条数250000未匹配上的数有980条,匹配上的数据有249020条,匹配分数为0.99608。
也可以去HDFS上查看结果
根据任务id号,下载missRecords文件,里面保存的所有没匹配上的数据,方便分析问题。
1.8.2 性能分析度量Profiling Measure
如果想查看最大值、总个数、空值个数、最大长度等值那就得创建profiling measure
1)创建json文件定制规则
vim dq2.json
{
"name": "batch_prof",
"process.type": "batch",
"data.sources": [
{
"name": "src",
"baseline": true,
"connectors": [
{
"type": "hive",
"version": "2.2",
"config": {
"database": "tmp",
"table.name": "demo_tgt"
}
}
]
}
],
"evaluate.rule": {
"rules": [
{
"dsl.type": "griffin-dsl",
"dq.type": "profiling",
"out.dataframe.name": "prof",
"rule": "src.id.count() AS id_count, src.age.max() AS age_max, src.desc.length().max() AS desc_length_max",
"out": [
{
"type": "metric",
"name": "prof"
}
]
}
]
},
"sinks": ["CONSOLE", "HDFS"]
}
同样rule选项编写规则,如当前规则统计id总个数、age最大值和desc最大长度。
具体rule规则可查看官网
https://github.com/apache/griffin/blob/master/griffin-doc/measure/measure-batch-sample.md
2)编辑env.json
vim env.json
{
"spark": {
"log.level": "WARN"
},
"sinks": [
{
"type": "console"
},
{
"type": "hdfs",
"config": {
"path": "hdfs://hadoop202:9820/griffin/persist"
}
},
{
"type": "elasticsearch",
"config": {
"method": "post",
"api": "http://hadoop202:9200/griffin/accuracy"
}
}
]
}
分别指定hdfs结果存储路径和elasticsearch路径
两个json文件编写完毕后 指定 /opt/module/griffin-master/measure/target 该路径下的griffin-measure.jar 运行spark任务
3)Spark 提交脚本命令
spark-submit --class org.apache.griffin.measure.Application --master yarn --deploy-mode client --driver-memory 1g --executor-memory 1g --num-executors 1 griffin-measure.jar env.json dq2.json
1.9 常用RULE规则编写
1.9.1 空值个数查询
在rule里可以写sql 比如当前rule中统计id为空的个数,注意查询时,不是查询表名而是查询name名称
1.9.2 去重个数统计
1.9.3 最大值、最小值
1.9.4 排序
1.9.5 范围查询
2 APACHE GRIFFIN常见问题分析
2.1 ELASTICSEARCH启动报错
bin/elasticsearch 启动失败
解决,修改内存大小,然后刷新reboot
[zhouchen@hadoop202 elasticsearch-6.3.1]$ sudo vim /etc/security/limits.d/20-nproc.cof
修改内容如下:
2.2 ELASTICSEARCH 添加索引返回406
Elasticsearch 添加索引返回406
{
"error" : "Content-Type header [application/x-www-form-urlencoded] is not supported",
"status" : 406
}
原因是没有指定head,修改创建griffin索引的命令如下:
curl -H "Content-Type: application/json" -X PUT http://hadoop202:9200/griffin -d '
{
"aliases": {},
"mappings": {
"accuracy": {
"properties": {
"name": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
},
"tmst": {
"type": "date"
}
}
}
},
"settings": {
"index": {
"number_of_replicas": "2",
"number_of_shards": "5"
}
}
}
2.3 SPARK 使用报错
报错信息:
Call From hadoop202/192.168.139.137 to hadoop202:9000 failed on connection exception:....
解决:
这里报错是因为spark-env.sh/ spark-defaults.conf中的hdfs端口号写成了Hadoop2.x的9000,应该写hadoop3.x的9820
**在编译griffin的时候很多hdfs端口也要写9820而不是hadoop2.x的9000
2.4 SPARK集成HIVE错误
报这个错是因为hive-site.xml中配置了tez引擎,下面报错的根因也是tez找不到
解决:
拷贝到spark中的hive-site.xml将tez引擎改成mr
<property>
<name>hive.execution.engine</name>
<value>mr</value>
</property>
2.5 SPARK运行错误
解决:
因为安装的jdk1.8,需要在yarn-site.xml中添加配置
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
2.6 LIVY启动失败
报错如下:
[zhouchen@hadoop202 livy-0.5.0]$ bin/livy-server
Could not find Livy jars directory.
解决:
下载的安装包incubator-livy-0.5.0-incubating.zip是不带jar的版本,需要下载带jar的版本livy-0.5.0-incubating-bin.zip
2.7 GRIFFIN与SPARK8080端口冲突
Griffin的Web端口是8080.spark已经占用了该端口号
解决:
查看占用
[zhouchen@hadoop202 griffin-master]$ sudo netstat -nltp | grep 8080
[sudo] zhouchen 的密码:
tcp6 0 0 :::8080
杀死进程
[zhouchen@hadoop202 griffin-master]$ sudo kill -9 6334
修改spark的端口号为其他
/opt/module/spark-2.4.5/sbin/start-master.sh
[zhouchen@hadoop202 sbin]$ vim start-master.sh
#修改内容如下:
#定位到61行
if [ “$SPARK_MASTER_WEBUI_PORT” = “” ]; then
SPARK_MASTER_WEBUI_PORT=8087
fi
#修改成其他的端口号即可
2.8 JOB执行失败
20/06/07 18:27:26 ERROR Application$: assertion failed: Connector is undefined or invalid java.lang.AssertionError: assertion failed: Connector is undefined or invalid at scala.Predef$.assert(Predef.scala:170) at org.apache.griffin.measure.configuration.dqdefinition.DataSourceParam.validate(DQConfig.scala:100)
这个问题是创建完job之后直到自动触发执行,DQ Metrics页面都是no centent,然后检查livy session发现了上面了报错,环境连接失败。
检查各组件连接状态。hdfs、es、livy、hive都是正常,ES中的griffin索引状态也是正常。
找到网上一个案例,发现是系统bug,在新的版本中会有的。链接如下:
https://github.com/apache/griffin/pull/568
解决:
重新下载老版本的Apache griffin包,重新编译
2.9 找不到HIVE.METASTORE.SASL.ENABLED
提交job运行失败,在livy的session中报错找不到hive.metastore.sasl.enabled
解决:
hive.metastore.sasl.enabled默认的是false,但是当前安装的是hive-3.x,不清楚会不会跟hive-2.x有不同。因此在/opt/module/griffin-master/service/src/main/resources/application.properties配置中显式地配置相关的三个配置项:
hive.metastore.sasl.enabled=false #默认为false,这里显式地配置
hive.metastore.kerberos.principal= #默认为空
hive.metastore.kerberos.keytab.file=hive-metastore/_HOST@EXAMPLE.COM #默认值
2.10 SPARK.SQL.AUTOBROADCASTJOINTHRESHOLD
job提交运行失败,在livy的session中报错checkpoint超时,建议setting spark.sql.autoBroadcastJoinThreshold to 1
解决:
停止griffin-service.jar与spark集群,修改spark-default.conf添加如下配置:
#添加如下配置
spark.sql.autoBroadcastJoinThreshold 1