Apache Griffin技术实践与常见错误分析V2.0


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 executedBegin: 数据段开始时间与触发时间的比较 
•  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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值