Datagen-CDP平台的模拟数据生成器

2022-12-02 21:24:50 浏览数 (1)

Datagen

Datagen 是一个项目,旨在提供一个用户友好、可定制的界面,以将数据生成到各种 Cloudera CDP平台服务中。(甚至在平台之外)。

它是什么 ?

它是一个公开的 API 以生成数据的 Web 服务。

生成的数据在所谓的模型中形成。它带有预建模型,但任何人都可以定义自己的模型并提供它以在任何服务中生成数据。

数据可以生成到 HDFS(CSV、Avro、Parquet、JSON、ORC)、HBase、Hive、Solr、Kudu、Kafka、Ozone(CSV、Avro、Parquet、JSON、ORC)和本地文件(CSV、Avro、Parquet JSON, ORC)中。

数据生成也可以安排为定期运行。

要求

  • JDK 11

Datagen 设计为在 CDP 上原生运行,因此通常需要 CDP 平台:

  • 可访问的 Cloudera Manager管理的 CDP 7.1.7 平台

但是,您始终可以将应用程序作为独立的 Web 服务器运行,但您需要自己进行所有配置。

如果您打算从源代码构建它:

  • Maven 3.6
  • Ansible 2.10
  • Jmespath

存储库

Datagen 代码可在此处公开获得:https ://github.com/frischHWC/datagen

该存储库的自述文件为您提供了有关如何创建模型、如何启动模型以及配置和内部结构的所有详细信息。

安装

Datagen 已构建为与 CDP 完全集成,因此它作为服务部署在 Cloudera Manager 中。

可以通过两种方式进行安装:

  • 在使用 CSD 和 Parcel 的带有 CM 的运行 CDP 集群上(请参阅:从 CSD 和 Parcel 安装)
  • 在带有 CM 的运行 CDP 集群上,使用部署脚本从代码构建它(请参阅:从源代码安装构建)

Datagen 也可以在本地(或其他任何地方)作为独立服务器运行,但您需要自己配置它。(请参阅:从源代码安装构建)

使用 CSD 和Parcel安装

本教程需要运行CDP 7.1.7 平台,并具有对 Cloudera Manager 的管理员访问权限。

请注意,这是为CDP-7.1.7.1000DATAGEN-0.2.5 编写的,对于未来的版本,请更改存储库以指向新版本。

设置 CSD

转到 Cloudera Manager 并对此进行 curl 或 wget:

代码语言:javascript复制
wget https://datagen-repo.s3.eu-west-3.amazonaws.com/csd/0.3.1/7.1.7.1000/DATAGEN-0.3.1.7.1.7.1000.jar

将下载的 jar 文件复制到 /opt/cloudera/csd/ 中:

代码语言:javascript复制
cp DATAGEN-*.jar /opt/cloudera/csd/

重启 Cloudera Manager Server:

代码语言:javascript复制
systemctl restart cloudera-scm-server

设置Parcel

转到 Cloudera Manager,在Parcels > Parcel Repositories & Network中:

将此公共存储库添加到 Cloudera Manager:https ://datagen-repo.s3.eu-west-3.amazonaws.com/parcels/0.3.1/7.1.7.1000

保存并验证以确保 URL 正确,您应该具有:

现在可以下载 Datagen Parcel:

然后分发它:

最后激活它:

最后,结果应该是:

添加服务向导

在 Cloudera Manager 中返回主页,然后选择要安装 Datagen 的集群。

单击操作 > 添加服务。

现在,可以将 Datagen 作为服务添加到 CDP:

单击继续启动添加向导。

选择放置 Datagen 服务器的位置(最好从一个开始,如果需要,以后再扩大):

查看更改,它们都应该自动填写,但是建议正确设置Ranger属性(稍后可以将其删除):

你最终应该得到:

在继续之前重新启动 CMS:Clusters > Cloudera Management Service,然后Actions > Restart。

初始化服务

在生成数据之前,需要几个步骤来初始化服务。

转到 Datagen 服务并在Actions中:

  • 在本地选择 Datagen 主目录
  • 选择初始化服务目录和策略

最后一步使用之前的 Ranger 设置 URL、用户/密码将 datagen 所需的策略推送到 Ranger。

此命令成功后,您可以安全地删除这些设置。

  • 最终,您可以重新启动 Cloudera Management Service,这样他们就可以开始监控 Datagen 服务了。

启动服务

在操作 > 开始。

弹出命令后,您可以浏览角色日志并单击完整日志文件:

并验证它启动良好,你应该看到:

故障排除

服务不存在

  1. 验证 csd 是否存在于/opt/cloudera/csd
  2. 重启 Cloudera Manager管理器
  3. 在其日志中验证:/var/log/cloudera-scm-server/cloudera-scm-server.logDATAGEN CSD 已正确添加并且没有弹出错误。

没有指标 - 错误查询内部

  1. 重新启动 CMS服务,尤其是 Service Monitor。
  2. 您还可以检查本地 cloudera-agent 是否运行良好并且能够从 Datagen Web 服务器捕获指标。

无数据生成状态 - 测试配置无效

Service Monitor 可能无法从 Datagen 获取某些配置值。

  • 转到Datagen > Configuration并进行以下更改:

unexpected_exits_thresholds将 Warning 设置为Any并将 Critical 设置为Never。process_swap_memory_thresholds将 Warning 设置为Any并将 Critical 设置为Never。process_swap_memory_rate_thresholds将 Warning 设置为Any并将 Critical 设置为Never。log_directory_free_space_percentage_thresholds将 Warning 设置为80并将 Critical 设置为80。

  • 重新启动 CMS服务。

警告:Test disabled because of an invalid configuration: Test of whether enough DATAGEN_SERVER roles are healthy可以使用抑制按钮安全地忽略和删除。

数据生成 - 基本

我们开始进行数据生成吧 !

HDFS

在 CM管理器中:

Datagen > Actions > 为 HDFS 产生 100 万客户

它启动一个 Cloudera Manager 命令,对 Datagen Web 服务器进行不同的 API 调用,以生成代表来自不同国家/地区的客户的数据。

输出应该是:

让我们验证

在具有登录用户的 shell 中(可选地使用 datagen ):

代码语言:javascript复制
hdfs dfs -ls /user/datagen/hdfs/customer/
Found 90 items
-rw-r--r--   3 datagen datagen     256024 2022-10-13 09:06 /user/datagen/hdfs/customer/customer-cn-0000000000.parquet
-rw-r--r--   3 datagen datagen     255393 2022-10-13 09:06 /user/datagen/hdfs/customer/customer-cn-0000000001.parquet
-rw-r--r--   3 datagen datagen     255618 2022-10-13 09:06 /user/datagen/hdfs/customer/customer-cn-0000000002.parquet

Hive

在 Cloudera Manager管理器中:

Datagen > Actions > 为 Hive 生成 1000 万个传感器数据

它启动 Cloudera Manager 命令,对 Datagen Web 服务器进行不同的 API 调用,以生成表示传感器数据的数据。

输出应该是:

让我们验证

在具有登录用户的 shell 中(可选地使用 datagen ):

代码语言:javascript复制
0: jdbc:hive2://ccycloud-2.lisbon.root.hwx.si> show databases;
...
INFO  : OK
 --------------------- 
|    database_name    |
 --------------------- 
| datagen_industry    |
| default             |
| information_schema  |
| sys                 |
 --------------------- 
0: jdbc:hive2://ccycloud-2.lisbon.root.hwx.si> use datagen_industry;
...
0: jdbc:hive2://ccycloud-2.lisbon.root.hwx.si> show tables;
...
INFO  : OK
 ------------------ 
|     tab_name     |
 ------------------ 
| plant            |
| plant_tmp        |
| sensor           |
| sensor_data      |
| sensor_data_tmp  |
| sensor_tmp       |
 ------------------ 
6 rows selected (0.059 seconds)
0: jdbc:hive2://ccycloud-2.lisbon.root.hwx.si> select * from plant limit 2;
...
INFO  : OK
 ----------------- -------------------- ------------ ------------- ---------------- 
| plant.plant_id  |     plant.city     | plant.lat  | plant.long  | plant.country  |
 ----------------- -------------------- ------------ ------------- ---------------- 
| 1               | Chotebor           | 49,7208    | 15,6702     | Czechia        |
| 2               | Tecpan de Galeana  | 17,25      | -100,6833   | Mexico         |
 ----------------- -------------------- ------------ ------------- ---------------- 
2 rows selected (0.361 seconds)
0: jdbc:hive2://ccycloud-2.lisbon.root.hwx.si> select * from sensor limit 2;
...
INFO  : OK
 ------------------- --------------------- ------------------ 
| sensor.sensor_id  | sensor.sensor_type  | sensor.plant_id  |
 ------------------- --------------------- ------------------ 
| 70001             | motion              | 186              |
| 70002             | temperature         | 535              |
 ------------------- --------------------- ------------------ 
2 rows selected (0.173 seconds)
0: jdbc:hive2://ccycloud-2.lisbon.root.hwx.si> select * from sensor_data limit 2;
...
INFO  : OK
 ------------------------ -------------------------------------- ---------------------- 
| sensor_data.sensor_id  | sensor_data.timestamp_of_production  |  sensor_data.value   |
 ------------------------ -------------------------------------- ---------------------- 
| 88411                  | 1665678228258                        | 1895793134684555135  |
| 52084                  | 1665678228259                        | -621460457255314082  |
 ------------------------ -------------------------------------- ---------------------- 
2 rows selected (0.189 seconds)

Ozone

在 Cloudera Manager管理器中:

Datagen > Actions > 为 Ozone 带来 100 万客户

它启动一个 Cloudera Manager 命令,对 Datagen Web 服务器进行不同的 API 调用,以生成代表来自不同国家/地区的客户的数据。

输出应该是:

让我们验证

在具有登录用户的 shell 中(可选地使用 datagen ):

代码语言:javascript复制
ozone sh key list datagen/customer
{
"volumeName" : "datagen",
"bucketName" : "customer",
"name" : "customer-cn-0000000000.parquet",
"dataSize" : 255631,
"creationTime" : "2022-10-13T16:10:02.286Z",
"modificationTime" : "2022-10-13T16:10:07.866Z",
"replicationType" : "RATIS",
"replicationFactor" : 3
}
{
"volumeName" : "datagen",
"bucketName" : "customer",
"name" : "customer-cn-0000000001.parquet",
"dataSize" : 255633,
"creationTime" : "2022-10-13T16:10:08.187Z",
"modificationTime" : "2022-10-13T16:10:08.314Z",
"replicationType" : "RATIS",
"replicationFactor" : 3
}

HBase

在 Cloudera Manager管理器中:

Datagen > Actions > 向 HBase 生成 100 万个事务

它启动一个 Cloudera Manager 命令,对 Datagen Web 服务器进行不同的 API 调用,以生成表示交易的数据。

输出应该是:

让我们验证

在具有登录用户的 shell 中(可选地使用 datagen ):

代码语言:javascript复制
hbase:001:0> list
TABLE
datagenfinance:transaction
1 row(s)
Took 0.9031 seconds
=> ["datagenfinance:transaction"]
hbase:002:0> count 'datagenfinance:transaction'
Current count: 1000, row: 10223641061665677647491
Current count: 2000, row: 10450220651665677774524
Current count: 3000, row: 10680209721665677628857
Current count: 4000, row: 10909219011665677828439
Current count: 5000, row: 1114021121665677841475
Current count: 6000, row: 11370585341665677806053

疑难解答

如果出现任何错误,请通过 Cloudera Manager 或直接在机器上查看日志,它们位于/var/log/datagen/

数据生成 - 第二部分

使用 Cloudera Manager 和预定义的操作,可以将数据生成到在您的平台上运行的所有类型的服务中。

数据已在 HDFS、Hive、Ozone、HBase 中生成。

在进一步将数据生成到其他服务之前,有必要仔细看看已经生成了什么样的数据。

模型介绍

Datagen 的核心是模型

每次要生成数据时,Datagen 都需要一个模型(或默认为默认模型)。

模型是一个 JSON 文件,它定义了您的数据应该是什么样子。

到目前为止,您只使用了预定义的模型,但 Datagen 的全部目标是让您提供自己的模型。

我们将继续使用预定义的模型,但在下一节关于模型的部分中,我们将引导您完成创建模型的过程以及该工具提供的所有可能性。

预定义模型

正如您可能已经猜到的那样,在以前的服务中生成的数据遵循一些预定义的模型。

您可以在已部署 Datagen parcel 的所有机器上找到这些模型,这些机器位于以下目录:/opt/cloudera/parcels/DATAGEN/models/

以下是您可以在包中或以下源代码中找到的所有模型文件的列表:src/main/resources/models/

代码语言:javascript复制
ll -R /opt/cloudera/parcels/DATAGEN/models/
/opt/cloudera/parcels/DATAGEN/models/:
total 28
drwxr-xr-x 2 root root 4096 Oct 12 02:57 customer
-rw-r--r-- 1 root root 2111 Oct 12 02:57 example-model.json
drwxr-xr-x 2 root root 4096 Oct 13 00:47 finance
-rw-r--r-- 1 root root 5926 Oct 12 02:57 full-model.json
drwxr-xr-x 2 root root 4096 Oct 13 00:47 industry
drwxr-xr-x 2 root root 4096 Oct 13 00:47 public_service


/opt/cloudera/parcels/DATAGEN/models/customer:
total 36
-rw-r--r-- 1 root root 2144 Oct 12 02:57 customer-china-model.json
-rw-r--r-- 1 root root 2154 Oct 12 02:57 customer-france-model.json
-rw-r--r-- 1 root root 2155 Oct 12 02:57 customer-germany-model.json
-rw-r--r-- 1 root root 2150 Oct 12 02:57 customer-india-model.json
-rw-r--r-- 1 root root 2150 Oct 12 02:57 customer-italy-model.json
-rw-r--r-- 1 root root 2152 Oct 12 02:57 customer-japan-model.json
-rw-r--r-- 1 root root 2150 Oct 12 02:57 customer-spain-model.json
-rw-r--r-- 1 root root 2153 Oct 12 02:57 customer-turkey-model.json
-rw-r--r-- 1 root root 2147 Oct 12 02:57 customer-usa-model.json


/opt/cloudera/parcels/DATAGEN/models/finance:
total 4
-rw-r--r-- 1 root root 1748 Oct 12 02:57 transaction-model.json


/opt/cloudera/parcels/DATAGEN/models/industry:
total 12
-rw-r--r-- 1 root root 1712 Oct 12 02:57 plant-model.json
-rw-r--r-- 1 root root 1476 Oct 12 02:57 sensor-data-model.json
-rw-r--r-- 1 root root 1549 Oct 12 02:57 sensor-model.json


/opt/cloudera/parcels/DATAGEN/models/public_service:
total 16
-rw-r--r-- 1 root root 1899 Oct 12 02:57 incident-model.json
-rw-r--r-- 1 root root 2445 Oct 12 02:57 intervention-team-model.json
-rw-r--r-- 1 root root 3445 Oct 12 02:57 weather-model.json
-rw-r--r-- 1 root root 2289 Oct 12 02:57 weather-sensor-model.json

HDFS 和Ozone

HDFS & Ozone 按钮创建了来自不同国家的 100 万客户(使用/opt/cloudera/parcels/DATAGEN/models/customer/下的不同客户模型)并将它们推送到 Parquet 文件中。

JSON格式的数据示例:

代码语言:javascript复制
{ "name" : "Loris", "id" : "790001", "birthdate" : "1987-01-11", "city" : "Stevensville", "country" : "USA", "email" : "Loris@company.us", "phone_number" : " 1 7225688066", "membership" : "SILVER" }
{ "name" : "Marcell", "id" : "490001", "birthdate" : "1950-06-22", "city" : "Pontecorvo", "country" : "Italy", "email" : "Marcell@company.it", "phone_number" : " 39 995887416", "membership" : "BRONZE" }
{ "name" : "Ryong", "id" : "520001", "birthdate" : "1941-02-05", "city" : "Yachiyo", "country" : "Japan", "email" : "Ryong@company.jp", "phone_number" : " 81 809127101", "membership" : "PLATINUM" }

HBASE

HBase 按钮创建了 100 万笔交易(使用/opt/cloudera/parcels/DATAGEN/models/finance/transaction-model.json下的交易模型)。

JSON格式的数据示例:

代码语言:javascript复制
{ "sender_id" : "50902", "receiver_id" : "10391", "amount" : "0.8084345", "execution_date" : "1665728236778", "currency" : "EUR" }
{ "sender_id" : "21403", "receiver_id" : "68104", "amount" : "0.65117764", "execution_date" : "1665728285129", "currency" : "USD" }

Hive

Hive 按钮创建了 100 万个传感器数据(使用/opt/cloudera/parcels/DATAGEN/models/industry/下的不同模型)。

它将生成 100 个工厂数据,如下所示:

代码语言:javascript复制
{ "plant_id" : "1", "city" : "Bollene", "lat" : "44,2803", "long" : "4,7489", "country" : "France" }

它将生成 100 000 个像这样的传感器(每个都可以链接到一个工厂):

代码语言:javascript复制
{ "sensor_id" : "1", "sensor_type" : "humidity", "plant_id" : "690" }

它将生成 1 000 000 个像这样的传感器数据(每个都可以链接到一个传感器):

代码语言:javascript复制
{ "sensor_id" : "58764", "timestamp_of_production" : "1665728724586", "value" : "-3000244563995128335" }

本地文件

在 Cloudera Manager管理器中:

Datagen > Actions > 生成本地数据为 CSV、JSON、AVRO、ORC、PARQUET

它启动一个 Cloudera Manager 命令,对 Datagen Web 服务器进行不同的 API 调用,以使用几乎所有可能的模型生成多个数据。

输出应该是:

让我们验证

在具有登录用户的 shell 中(可选地使用 datagen ):

代码语言:javascript复制
cat /home/datagen/customer/customer-fr-0000000000.json
{ "name" : "Josse", "id" : "120001", "birthdate" : "2001-08-03", "city" : "Meylan", "country" : "France", "email" : "Josse@company.fr", "phone_number" : " 33 444585074", "membership" : "BRONZE" }
{ "name" : "Piet", "id" : "120002", "birthdate" : "1970-06-17", "city" : "Bures-sur-Yvette", "country" : "France", "email" : "Piet@company.fr", "phone_number" : " 33 851063627", "membership" : "BRONZE" }
{ "name" : "Armand", "id" : "120003", "birthdate" : "1990-10-04", "city" : "Notre-Dame-de-Gravenchon", "country" : "France", "email" : "Armand@company.fr", "phone_number" : " 33 575158362", "membership" : "BRONZE" }
{ "name" : "Marvin", "id" : "120004", "birthdate" : "1960-10-04", "city" : "Saint-Pryve-Saint-Mesmin", "country" : "France", "email" : "Marvin@company.fr", "phone_number" : " 33 588241506", "membership" : "BRONZE" }
{ "name" : "Vivian", "id" : "120005", "birthdate" : "1994-04-28", "city" : "La Cadiere-d'Azur", "country" : "France", "email" : "Vivian@company.fr", "phone_number" : " 33 553370858", "membership" : "BRONZE" }
{ "name" : "Jakob", "id" : "120006", "birthdate" : "1976-08-02", "city" : "Chaville", "country" : "France", "email" : "Jakob@company.fr", "phone_number" : " 33 208782811", "membership" : "BRONZE" }
{ "name" : "Bo", "id" : "120007", "birthdate" : "1966-10-14", "city" : "Brignoles", "country" : "France", "email" : "Bo@company.fr", "phone_number" : " 33 068739422", "membership" : "PLATINUM" }
{ "name" : "Emilienne", "id" : "120008", "birthdate" : "1976-02-23", "city" : "Orange", "country" : "France", "email" : "Emilienne@company.fr", "phone_number" : " 33 303877991", "membership" : "BRONZE" }
{ "name" : "Elise", "id" : "120009", "birthdate" : "1965-11-28", "city" : "Cosne sur Loire", "country" : "France", "email" : "Elise@company.fr", "phone_number" : " 33 540812701", "membership" : "SILVER" }
{ "name" : "Roelof", "id" : "120010", "birthdate" : "1982-06-01", "city" : "Magny-en-Vexin", "country" : "France", "email" : "Roelof@company.fr", "phone_number" : " 33 252194443", "membership" : "BRONZE" }


cat /home/datagen/finance/transaction/transaction-0000000000.csv


sender_id,receiver_id,amount,execution_date,currency
"11292","27627","0.7721951","1665729006111","USD"
"49294","95851","0.4893235","1665729006111","EUR"
"68670","8844","0.009439588","1665729006111","USD"
"61487","46071","0.22023022","1665729006111","EUR"
"14383","57358","0.07566887","1665729006111","YEN"
"89570","96238","0.35353237","1665729006111","USD"
"66066","69065","0.87496656","1665729006111","USD"
"43894","87454","0.11435127","1665729006111","USD"
"76777","19367","0.06878656","1665729006111","EUR"
"53649","14975","0.9570634","1665729006111","EUR"


ls -R /home/datagen/industry/
/home/datagen/industry/:
plant  sensor  sensor_data


/home/datagen/industry/plant:
plant-0000000000.avro


/home/datagen/industry/sensor:
sensor-0000000000.parquet


/home/datagen/industry/sensor_data:
sensor_data-0000000000.orc

Solr

在 Cloudera Manager管理器中:

Datagen > Actions > 生成1百万天气数据到Solr

它启动一个 Cloudera Manager 命令,对 Datagen Web 服务器进行不同的 API 调用,以使用几乎所有可能的模型生成多个数据。

输出应该是:

它将生成 100 万个这样的天气数据(使用/opt/cloudera/parcels/DATAGEN/models/public_service/weather-model.json下的天气模型)

代码语言:javascript复制
{ "city" : "Seysses", "date" : "2021-03-25", "lat" : "43,4981", "long" : "1,3125", "wind_provenance_9_am" : "NORTH", "wind_force_9_am" : "3", "wind_provenance_9_pm" : "WEST", "wind_force_9_pm" : "12", "pressure_9_am" : "1004", "pressure_9_pm" : "1008", "humidity_9_am" : "46", "humidity_9_pm" : "52", "temperature_9_am" : "22", "temperature_9_pm" : "-8", "rain" : "false" }

让我们验证

访问 SolR UI,(以具有足够权限的用户身份登录):

Kudu

在 Cloudera Manager管理器中:

Datagen > Actions > 生成1百万公共服务数据到Kudu

它启动一个 Cloudera Manager 命令,对 Datagen Web 服务器进行不同的 API 调用,以使用几乎所有可能的模型生成多个数据。

输出应该是:

它将生成 100 万个这样的公共服务数据(使用/opt/cloudera/parcels/DATAGEN/models/public_service/incident-model.json下的天气模型)

代码语言:javascript复制
{ "city" : "Le Rove", "lat" : "43,3692", "long" : "5,2503", "reporting_timestamp" : "1665732947892", "emergency" : "URGENT", "type" : "WATER" }

让我们验证

转到 Hue 或 Impala shell 并执行 INVALIDATE METADATA 命令以刷新缓存,然后您将能够在数据库中看到:datagen一个新表publicservice_incident

Kafka

Datagen > Actions > 以 JSON 格式将 100 万个天气数据生成到 Kafka 或将公共服务数据生成到 Avro 中的 Kafka

它启动一个 Cloudera Manager 命令,对 Datagen Web 服务器进行不同的 API 调用,以使用几乎所有可能的模型生成多个数据。

输出应该是:

它将生成 100 万个这样的天气数据(使用/opt/cloudera/parcels/DATAGEN/models/public_service/weather-model.json下的天气模型)

代码语言:javascript复制
{ "city" : "Seysses", "date" : "2021-03-25", "lat" : "43,4981", "long" : "1,3125", "wind_provenance_9_am" : "NORTH", "wind_force_9_am" : "3", "wind_provenance_9_pm" : "WEST", "wind_force_9_pm" : "12", "pressure_9_am" : "1004", "pressure_9_pm" : "1008", "humidity_9_am" : "46", "humidity_9_pm" : "52", "temperature_9_am" : "22", "temperature_9_pm" : "-8", "rain" : "false" }

让我们验证

您可以制作一个具有足够权限的 kafka-console-consumer 并从头开始消费主题以验证消息的生产。

但我们将改为使用具有足够权限的用户登录 Streams Messaging Manager 并查看数据:

如果您选择了 AVRO 格式的数据生成,在 Streams Messaging Manager 中:

如果您选择了 AVRO 格式的数据生成,您可以转到 Schema Registry URL(使用具有足够权限的用户登录)并查看新添加的模式:

最后,如果您的集群中安装了 SQL Stream Builder,请确保用户的 ssb 和 flink 有权访问生成的主题,登录到 Web 控制台,如有必要,上传您的 keytab 并在 kafka 主题上创建表(以 JSON 格式):

然后做一个示例查询来可视化数据:

API

不仅仅是这些预定义的按钮,Datagen 是完全可配置和可定制的。

所有之前的数据生成确实只是对 Datagen Web 服务器的一堆API 调用。

用户应该利用 Datagen 提供的 API 来运行数据生成。

现在,我们将通过一个简单的示例,但如果您想了解有关所提供 API 的更多信息,请参阅API 部分。

首先,转到 Cloudera Manager > Datagen 并单击Datagen Swagger UI

它将为 Datagen Web 服务器的 Swagger 打开一个新选项卡,此 Swagger 将要求使用您在安装期间传递的用户/密码对您进行身份验证。如果您没有提供,默认情况下admin作为用户,admin作为密码。(您可以在 Datagen 的配置中随时更改此设置)。

招摇应该是这样的:

如果您打开数据生成控制器,您应该有很多端点:每种类型的服务都有一个您想要生成数据的端点。

我们将使用/datagen/hdfs-json端点的示例。

点击它。

行、批次、线程、模型

如果您单击Try it out,您将能够填写所有可能的参数。

不要害怕 !如果您不提供某些参数,所有参数都是可选的并且具有默认值

所有用于数据生成的 API 调用至少有 5 个共同参数:

  • rows = 每批数据生成时要生成的行数
  • batches = 要启动的批次数(您最终将生成(行 x 批次)总行数)
  • threads = 为了加快生成速度,这个可以多线程(默认是单线程的),推荐10个线程。
  • 通过指定任一模型:
    • model_file = 存在模型的机器上的文件路径(例如 /opt/cloudera/parcels/DATAGEN/models/public_service/weather-model.json)
    • model = 从你的电脑直接上传你的模型文件到 swagger

与kerberos认证相关的参数有3个:

  • kerb_auth = true 或 false 取决于是否使用 kerberos
  • kerb_user = kerberos 用户登录以生成数据
  • kerb_keytab = 此用户登录时使用的 keytab 的路径(必须是 datagen 用户可读的)

默认情况下,所有这些都设置为数据生成的用户。

还有 2 个其他参数可让您安排启动:

  • Scheduled=真或假
  • delay_between_executions_seconds = 两次执行之间的时间间隔(以秒为单位)

所有这些参数都将在 API 部分进一步讨论。

HDFS 的特定配置

接收器的每个端点都有其他参数,允许您完全覆盖此服务的实际配置,这将仅用于此数据生成。

对于这里的 HDFS,我们有:

  • core_site_path = core-site.xml 的路径
  • hdfs_site_path = hdfs-site.xml 的路径
  • hdfs_uri = hdfs://mynamservice/

运行示例

在此示例中,我们将使用 swagger 并指定一些参数以 JSON 格式将数据生成到 HDFS 中。

在 swagger UI 中,打开 hdfs-json 端点并单击 try it out,然后执行以下操作:

  • 将批次设置为 10
  • 将行数设置为 1000
  • 将线程数设置为 10
  • 将模型设置为 /opt/cloudera/parcels/DATAGEN/models/public_service/weather-model.json

您可以单击执行

Swagger 将在下面显示等效的 curl 请求:

代码语言:javascript复制
curl -X POST "https://ccycloud-1.lisbon.root.hwx.site:4242/datagen/hdfs-json" -H  "accept: */*" -H  "Content-Type: multipart/form-data" -F "batches=10" -F "model=/opt/cloudera/parcels/DATAGEN/models/public_service/weather-model.json" -F "rows=1000" -F "threads=10"

它还将直接回答您并告诉您您的模型是否有任何错误,我们的回答是:

代码语言:javascript复制
{ "commandUuid": "61b9757f-78da-4773-9c5d-a3f154f2b524" , "error": "" }

返回一个命令 UUID,应该用于检查使用另一个 API 启动的数据生成的状态,该 API 位于 command-runner-controller 中,称为/command/getCommandStatus。此 API 需要接收到的命令 UUID,并将返回状态为 JSON,如下所示:

代码语言:javascript复制
{ "commandUuid": "61b9757f-78da-4773-9c5d-a3f154f2b524" , "status": "FINISHED" , "comment": "" ,   "progress": "100.0" ,  "duration": "858ms" }

让我们验证

在具有登录用户的 shell 中(可选地使用 datagen ):

代码语言:javascript复制
hdfs dfs -ls /user/datagen/hdfs/publicservice/weather/


Found 10 items
-rw-r--r--   3 datagen datagen     756988 2022-10-14 00:44 /user/datagen/hdfs/publicservice/weather/weather-0000000000.json
-rw-r--r--   3 datagen datagen     756448 2022-10-14 00:44 /user/datagen/hdfs/publicservice/weather/weather-0000000001.json
-rw-r--r--   3 datagen datagen     756374 2022-10-14 00:44 /user/datagen/hdfs/publicservice/weather/weather-0000000002.json
-rw-r--r--   3 datagen datagen     756204 2022-10-14 00:44 /user/datagen/hdfs/publicservice/weather/weather-0000000003.json
-rw-r--r--   3 datagen datagen     756878 2022-10-14 00:44 /user/datagen/hdfs/publicservice/weather/weather-0000000004.json
-rw-r--r--   3 datagen datagen     756132 2022-10-14 00:44 /user/datagen/hdfs/publicservice/weather/weather-0000000005.json
-rw-r--r--   3 datagen datagen     756812 2022-10-14 00:44 /user/datagen/hdfs/publicservice/weather/weather-0000000006.json
-rw-r--r--   3 datagen datagen     757160 2022-10-14 00:44 /user/datagen/hdfs/publicservice/weather/weather-0000000007.json
-rw-r--r--   3 datagen datagen     756216 2022-10-14 00:44 /user/datagen/hdfs/publicservice/weather/weather-0000000008.json
-rw-r--r--   3 datagen datagen     756000 2022-10-14 00:44 /user/datagen/hdfs/publicservice/weather/weather-0000000009.json


hdfs dfs -cat /user/datagen/hdfs/publicservice/weather/weather-0000000000.json


{ "city" : "Beauchamp", "date" : "2017-03-23", "lat" : "49,0139", "long" : "2,19", "wind_provenance_9_am" : "EAST", "wind_force_9_am" : "98", "wind_provenance_9_pm" : "WEST", "wind_force_9_pm" : "5", "pressure_9_am" : "1003", "pressure_9_pm" : "1009", "humidity_9_am" : "25", "humidity_9_pm" : "35", "temperature_9_am" : "30", "temperature_9_pm" : "9", "rain" : "false" }
{ "city" : "La Garnache", "date" : "2016-02-19", "lat" : "46,8906", "long" : "-1,8311", "wind_provenance_9_am" : "WEST", "wind_force_9_am" : "49", "wind_provenance_9_pm" : "NORTH", "wind_force_9_pm" : "75", "pressure_9_am" : "1014", "pressure_9_pm" : "1002", "humidity_9_am" : "30", "humidity_9_pm" : "8", "temperature_9_am" : "5", "temperature_9_pm" : "33", "rain" : "false" }
{ "city" : "Escoublac", "date" : "2018-04-10", "lat" : "47,2858", "long" : "-2,3922", "wind_provenance_9_am" : "NORTH", "wind_force_9_am" : "62", "wind_provenance_9_pm" : "NORTH", "wind_force_9_pm" : "111", "pressure_9_am" : "1019", "pressure_9_pm" : "1013", "humidity_9_am" : "77", "humidity_9_pm" : "56", "temperature_9_am" : "-1", "temperature_9_pm" : "16", "rain" : "true" }
{ "city" : "Anse", "date" : "2019-06-13", "lat" : "45,9356", "long" : "4,7194", "wind_provenance_9_am" : "WEST", "wind_force_9_am" : "96", "wind_provenance_9_pm" : "EAST", "wind_force_9_pm" : "114", "pressure_9_am" : "1005", "pressure_9_pm" : "1009", "humidity_9_am" : "44", "humidity_9_pm" : "46", "temperature_9_am" : "3", "temperature_9_pm" : "21", "rain" : "false" }
{ "city" : "Dammarie-le-Lys", "date" : "2015-07-24", "lat" : "48,5177", "long" : "2,6402", "wind_provenance_9_am" : "EAST", "wind_force_9_am" : "120", "wind_provenance_9_pm" : "WEST", "wind_force_9_pm" : "87", "pressure_9_am" : "1006", "pressure_9_pm" : "1012", "humidity_9_am" : "68", "humidity_9_pm" : "21", "temperature_9_am" : "-9", "temperature_9_pm" : "-1", "rain" : "false" }
{ "city" : "Saint-Remy-les-Chevreuse", "date" : "2021-10-05", "lat" : "48,7058", "long" : "2,0719", "wind_provenance_9_am" : "SOUTH", "wind_force_9_am" : "62", "wind_provenance_9_pm" : "WEST", "wind_force_9_pm" : "71", "pressure_9_am" : "1017", "pressure_9_pm" : "1007", "humidity_9_am" : "70", "humidity_9_pm" : "95", "temperature_9_am" : "33", "temperature_9_pm" : "-7", "rain" : "true" }
{ "city" : "Vouneuil-sous-Biard", "date" : "2020-07-06", "lat" : "46,5731", "long" : "0,2714", "wind_provenance_9_am" : "EAST", "wind_force_9_am" : "11", "wind_provenance_9_pm" : "EAST", "wind_force_9_pm" : "21", "pressure_9_am" : "1019", "pressure_9_pm" : "1017", "humidity_9_am" : "55", "humidity_9_pm" : "20", "temperature_9_am" : "5", "temperature_9_pm" : "23", "rain" : "false" }
{ "city" : "Tourves", "date" : "2016-05-07", "lat" : "43,4081", "long" : "5,9239", "wind_provenance_9_am" : "NORTH", "wind_force_9_am" : "10", "wind_provenance_9_pm" : "WEST", "wind_force_9_pm" : "39", "pressure_9_am" : "1019", "pressure_9_pm" : "1000", "humidity_9_am" : "60", "humidity_9_pm" : "93", "temperature_9_am" : "0", "temperature_9_pm" : "29", "rain" : "false" }

基本数据生成已经结束,现在您可以继续创建自己的自定义模型,或者如果您愿意,您可以开始使用 API

模型

模型是一个简单的 JSON 文件,描述应该生成什么类型的数据,在哪里并允许指定一些特定的选项。

模型的结构

一个模型文件由 4 个部分组成(每个部分都是一个数组):

代码语言:javascript复制
{
"Fields": [


],
"Table_Names": [


],
"Primary_Keys": [


],
"Options": [


]
}
  • Fields列出了您想要生成的所有字段(列)及其类型等......
  • Table_Names是一组键/值,用于定义应在何处生成数据
  • Primary_Keys是一个键/值数组,用于定义将用于 kafka、kudu、hbase 的主键
  • Options是一组键/值,用于定义一些特定的属性(例如复制因子、缓冲区等)

让我们深入了解下面的每个部分。

Fields

Fields 是 Field 对象的列表。

字段是由至少两个必需参数组成的对象:

  • name:字段的名称
  • type : 字段的类型

然后,可能取决于其类型的多个可选参数:

  • 最小值
  • 最大值
  • 长度
  • 可能值
  • 可能值加权
  • 过滤器
  • 条件

让我们探索不同类型的字段及其可能的参数。

字段类型 - 基本

字段可以有许多不同的类型,这里是基本的,不言自明的:

  • STRING 一个 alphaNumeric 字符串(长度表示字符串的长度,如果未设置,默认为 20)
  • STRINGAZ 一个字母非数字的字符串(长度表示字符串的长度,如果未设置,默认为 20)
  • INTEGER
  • INCREMENT_INTEGER 每行的整数增量
  • INCREMENT_LONG 每行递增一个 long
  • BOOLEAN
  • FLOAT
  • LONG
  • TIMESTAMP
  • BYTES length 表示字节数组的长度,默认为 20
  • HASHMD5 随机字符串的 哈希(长度表示字节数组的大小,默认为 32)
  • BLOB 默认1MB的字节数组(length表示字节数组的长度)(慎用)

一些例子:

代码语言:javascript复制
{
"name": "size",
"type": "INTEGER"
}
{
"name": "bool",
"type": "BOOLEAN"
}
{
"name": "startDate",
"type": "TIMESTAMP"
}

最小、最大、长度的一些示例:

18 到 99 之间的整数:

代码语言:javascript复制
{
"name": "age",
"type": "INTEGER",
"min": 18,
"max": 99
}

一个 10 字节的字节数组:

代码语言:javascript复制
{
"name": "bytesLittleArray",
"type": "BYTES",
"length" : 10
}

具有可能值的示例:

在 possible_values 中定义的值之间选择的字符串:

代码语言:javascript复制
{
"name": "department",
"type": "STRING",
"possible_values": ["hr", "consulting", "marketing", "finance"]
}

在 possible_values_weighted 中定义的值之间选择的字符串,每个值都有不同的权重(所有的总和为 100):(在这种情况下,将有 70% 的BRONZE, 20% 的SILVER, 8% 的GOLD, 2% 的PLATINUM

代码语言:javascript复制
{
"name": "membership",
"type": "STRING",
"possible_values_weighted": {
"BRONZE": 70,
"SILVER": 20,
"GOLD": 8,
"PLATINUM": 2
}
}

字段类型 - 高级

这些是更“高级”的类型:

  • BIRTHDATE 日期介于 1910 年和 2020 年之间(但您可以设置自己的限制)
  • NAME 从超过 20,000 个名字的字典中提取的名字(可以按国家/地区过滤)
  • COUNTRY 取自字典的国家名称
  • 电话号码A 10 位数字,前面有国际指示符(可按国家/地区过滤)_
  • EMAIL _string 的形式为 (.|)@(gaagle.com|yahaa.com|uutlook.com|email.fr)_
  • IP 以 Ipv4 形式表示 IP 的字符串:0-255.0-255.0-255.0-255
  • UUID 一个唯一的通用标识符:xxxx-xxxx-xxxx-xxxx
  • CITY 表示现有城市(名称、纬度、经度、国家)的对象,由超过 10,000 多个城市的字典组成,此字段仅采用名称(可以按国家/地区过滤)
  • CSV 取自给定 CSV 文件的对象
  • LINK 一个字符串,其值来自另一个字段,当前来自 CITY 或 CSV 字段

一些基本的例子:

代码语言:javascript复制
{
"name": "name",
"type": "NAME",
"filters": ["USA"]
}
{
"name": "birthdate",
"type": "BIRTHDATE",
"min": "1/1/1955",
"max": "1/1/1999"
}

城市字段

City 是一个特殊的字段,它加载了全球 40K 城市的字典,以及相关的纬度、经度和国家。

它可以按一个或多个国家/地区过滤。

下面的示例创建 4 个字段:

  • 城市名称(仅限法国和西班牙)
  • 这个城市的纬度(以纬度提供)
  • 该城市的经度(可用长度)
  • 该城市所在的国家/地区(可作为国家/地区获得)
代码语言:javascript复制
{
"name": "city",
"type": "CITY",
"filters": ["France", "Spain"]
},
{
"name": "city_lat",
"type": "LINK",
"conditionals": {
"link": "$city.lat"
}
},
{
"name": "city_long",
"type": "LINK",
"conditionals": {
"link": "$city.long"
}
},
{
"name": "city_country",
"type": "LINK",
"conditionals": {
"link": "$city.country"
}
}

CSV字段

它是一个特殊的字段,它将读取其路径提供的 CSV,将其加载到内存中,并对其进行解析。

它能够对此应用过滤器,并且您可以创建从该字段派生的其他字段。

例如,我们在/opt/cloudera/parcels/DATAGEN/dictionaries/person_test.csv中有这个 CSV :

代码语言:javascript复制
name;department;country
francois;PS;France
kamel;SE;France
thomas;RH;Germany
sebastian;PS;Spain

我们可以创建两个字段:

  • 一个是人名(根据应该是法国的国家过滤)
  • 此人所属部门
代码语言:javascript复制
{
"name": "person",
"type": "CSV",
"filters": ["country=France"],
"file": "/opt/cloudera/parcels/DATAGEN/dictionaries/person_test.csv",
"field": "name"
},
{
"name": "person_department",
"type": "LINK",
"conditionals": {
"link": "$person.department"
}
}

条件 - 公式

条件是一个允许您定义依赖于其他字段的对象。

公式,是用于评估${field_name}替换为其值的位置的公式,例如:

代码语言:javascript复制
{
"name": "starting_hour",
"type": "INTEGER",
"min": 0,
"max": 16
},
{
"name": "finished_hour",
"type": "INTEGER",
"conditionals": {
"formula": "$starting_hour   8"
}
}

条件 - 注入

条件是一个允许您定义依赖于其他字段的对象。

注入,是一个字符串,其中${field_name}被替换为它们的值,例如:

代码语言:javascript复制
{
"name": "email",
"type": "STRING",
"conditionals": {
"injection": "${name}@company.it"
}
}

条件 - 条件行

条件是一个允许您定义依赖于其他字段的对象。

条件行是一串接一个计算的行,如果一个为真,则值设置为正确的表达式。

每个条件行由字段名称(由 $ 报告)形式的条件组成,该字段名称被其值替换,运算符 ( <, >, =, !=) 将检查定义的值或字段(也被替换)。条件行可以由使用&(AND) 或|(OR) 运算符的多个检查组成。

一个例子:

代码语言:javascript复制
{
"name": "rain",
"type": "STRING",
"conditionals": {
"$humidity_9_am>70 & $temperature_9_am<20 & $wind_force_9_am<80" : "true",
"$humidity_9_pm>70 & $temperature_9_pm<20 & $wind_force_9_am<80" : "true",
"$wind_provenance_9_am=NORTH & $wind_force_9_am>80" : "true",
"$wind_provenance_9_pm=NORTH & $wind_force_9_pm>80" : "true",
"$humidity_9_pm>70 & $temperature_9_pm<25 & $pressure_9_pm<1010": "true",
"$humidity_9_am>70 & $temperature_9_am<25 & $pressure_9_am<1010": "true",
"default" : "false"
}
}

表名

这些都是可用于配置应在何处生成数据的可用键:

  • HDFS_FILE_PATH
  • HDFS_FILE_NAME
  • HBASE_TABLE_NAME
  • HBASE_NAMESPACE
  • KAFKA_TOPIC
  • OZONE_VOLUME
  • OZONE_BUCKET
  • OZONE_KEY_NAME
  • OZONE_LOCAL_FILE_PATH
  • SOLR_COLLECTION
  • HIVE_DATABASE
  • HIVE_HDFS_FILE_PATH
  • HIVE_TABLE_NAME
  • HIVE_TEMPORARY_TABLE_NAME
  • KUDU_TABLE_NAME
  • LOCAL_FILE_PATH
  • LOCAL_FILE_NAME
  • AVRO_NAME

Primary_Keys

这些是为某些服务配置的所有可用键:

  • KAFKA_MSG_KEY
  • HBASE_PRIMARY_KEY
  • KUDU_PRIMARY_KEYS
  • KUDU_HASH_KEYS
  • KUDU_RANGE_KEYS

选项

这是为某些服务配置基本设置的所有可用键:**

  • HBASE_COLUMN_FAMILIES_MAPPING 此映射必须采用以下形式:“CF:col1,col2;CF2:col5”
  • SOLR_SHARDS
  • SOLR_REPLICAS
  • KUDU_REPLICAS
  • ONE_FILE_PER_ITERATION
  • KAFKA_MESSAGE_TYPE
  • KAFKA_JAAS_FILE_PATH
  • SOLR_JAAS_FILE_PATH
  • HIVE_THREAD_NUMBER
  • HIVE_ON_HDFS
  • HIVE_TEZ_QUEUE_NAME
  • CSV_HEADER
  • DELETE_PREVIOUS
  • PARQUET_PAGE_SIZE
  • PARQUET_ROW_GROUP_SIZE
  • PARQUET_DICTIONARY_PAGE_SIZE
  • PARQUET_DICTIONARY_ENCODING
  • KAFKA_ACKS_CONFIG
  • KAFKA_RETRIES_CONFIG
  • KUDU_BUCKETS
  • KUDU_BUFFER
  • KUDU_FLUSH
  • OZONE_REPLICATION_FACTOR
  • HDFS_REPLICATION_FACTOR

如何创建模型的示例?

让我们创建一个简单的模型来将一些数据生成到 Hive 文件中:

我想生成一些代表员工的东西:

  • 姓名
  • 他们所在的城市
  • 他们的生日
  • 他们的电话号码
  • 多年公司工作经验
  • 他们的员工 ID(6 位数字)
  • 他们的部门(包括人力资源、咨询、财务、销售、工程、行政、营销)

顺便说一下,公司总部设在德国,作为所有员工。

所以这是最终的 JSON I 结果:

代码语言:javascript复制
{
"Fields": [
{
"name": "name",
"type": "NAME",
"filters": ["Germany"]
},
{
"name": "city",
"type": "CITY",
"filters": ["Germany"]
},
{
"name": "phone_number",
"type": "PHONE",
"filters": ["Germany"]
},
{
"name": "years_of_experience",
"type": "INTEGER",
"min": 0,
"max": 10
},
{
"name": "employee_id",
"type": "INCREMENT_INTEGER",
"min": 123456
},
{
"name": "department",
"type": "STRING",
"possible_values": ["HR", "CONSULTING", "FINANCE", "SALES", "ENGINEERING", "ADMINISTRATION", "MARKETING"]
}
],
"Table_Names": [
{"HIVE_HDFS_FILE_PATH": "/user/datagen/hive/employee_model/"},
{"HIVE_DATABASE": "datagen_test"},
{"HIVE_TABLE_NAME":  "employee_model"},
{"HIVE_TEMPORARY_TABLE_NAME":  "employee_model_tmp"},
{"AVRO_NAME":  "datagenemployee"}
],
"Primary_Keys": [
],
"Options": [
]
}

测试模型

要在启动数据生成之前测试模型,可以使用 API 对其进行测试。

在 model-tester-controller 下,API /model/test将模型路径作为输入或直接上传模型并返回使用此模型生成的一行。

输出是:

代码语言:javascript复制
{ "name" : "Gerhilt", "city" : "Beelen", "phone_number" : " 49 299776078", "years_of_experience" : "2", "employee_id" : "123457", "department" : "FINANCE" }

启动数据生成

现在,我们准备好了,使用招摇或直接调用 API(使用 curl、postman 或其他任何东西),我们启动数据生成,如下所示:

curl的命令:

代码语言:javascript复制
curl -X POST "https://ccycloud-1.lisbon.root.hwx.site:4242/datagen/hive" -H  "accept: */*" -H  "Content-Type: multipart/form-data" -F "batches=10" -F "model_file=@model-test.json;type=application/json" -F "rows=10000" -F "threads=10"

返回以下 UUID:

代码语言:javascript复制
{ "commandUuid": "1567dfba-a8f9-4da9-b389-9bc30f4ec1d5" , "error": "" }

在 Datagen Webserver 日志中,我们可以在末尾看到:

让我们验证

如果您以足够的权限登录到 hue(或beeline),我们将拥有一个新数据库:datagen_test,其中包含一个表employee_model和一些数据:

数据生成的配置

要让 Datagen 知道如何连接到将生成数据的各种服务,它需要一些输入配置。

Application.properties 文件

配置的基本文件是application.properties,在本地运行时使用,实际上是在CDP上运行时注入的。

该文件部署在 CDP 中时具有以下权限:400 datagen:datagen并且位于运行目录:/var/run/cloudera-scm-agent/process/DATAGEN-XXXXXXX/service.properties/

每种类型的服务都有一个部分用于加载数据,它们可以为空而没有风险。

Ranger

在 CDP 上运行时,它不是必需的,但您可以使用 ADMIN 角色指定Ranger用户及其密码。

这仅由Initialize service dirs and policies命令用于在 Ranger 中创建所需的默认策略。

如果未设置,您将必须自己创建所需的策略。

注意:如果您向其他路径/数据库/主题生成数据而不是 datagen 的默认路径/数据库/主题,则需要为用户 datagen 授予权限,除非您指定了另一个用户

Cloudera Manager 中的设置

Cloudera Manager 为我们做了一堆自动配置,例如 kerberos 或 auto-TLS。

在 Cloudera Manager 中,在Datagen > Configuration下,您可以看到所有属性,您可以看到一些是自动设置的,而另一些则不是。

最重要的是自动发现(如下所述)。

所有属性都被注入到应用程序文件中,并在启动之前传递给 Web 服务器。

自动发现

启动时,Datagen 将application.properties加载到内存中并继续进行所谓的自动发现。

在 CDP 中设置时,Datagen(如果cm.autodiscovery为 true)将使用 CM API自动发现所有服务。(用户无需指定任何内容)。

它也可能依赖于描述为AUTO-DISCOVERY的字段,默认情况下会填写这些字段。

这些字段,引用的属性文件,如hdfs-site.xml、hive-site.xml等……有了这个,Datagen 解析这些文件并自动配置所有可能的其他字段。

一旦启动,您可以在 Datagen Web Server 中看到这样的日志:

如果使用 CM 自动发现:

代码语言:javascript复制
9:35:04.701 AM INFO PropertiesLoader [main] Going to auto-discover hbase.zookeeper.quorum with CM API
9:35:04.701 AM   INFO PropertiesLoader [main] Going to auto-discover hbase.zookeeper.port with CM API

如果不使用 CM 自动发现但配置文件自动发现:

代码语言:javascript复制
2022-10-13 13:33:49,220 INFO  [main] com.cloudera.frisch.randomdatagen.config.PropertiesLoader: Going to auto-discover hbase.zookeeper.quorum
2022-10-13 13:33:49,222 DEBUG [main] com.cloudera.frisch.randomdatagen.Utils: Return value: server_zk1,server_zk_2,server_zk_3 from file: dev-support/test_files/hbase-site.xml for property: hbase.zookeeper.quorum
2022-10-13 13:33:49,222 INFO  [main] com.cloudera.frisch.randomdatagen.config.PropertiesLoader: Going to auto-discover hbase.zookeeper.port
2022-10-13 13:33:49,223 DEBUG [main] com.cloudera.frisch.randomdatagen.Utils: Return value: 2181 from file: dev-support/test_files/hbase-site.xml for property: hbase.zookeeper.property.clientPort

API 中的设置

每次创建命令以生成数据时,它所做的第一件事就是获取配置的内存映射并进行复制。

然后,用户可以在其 API 调用中提供任何配置,它将仅针对该作业覆盖现有配置,并且对其他人没有影响。此外,用户可以不定义任何内容,它将默认为从启动时的实际默认配置。

这也意味着,理论上您可以将数据推送到任何尊重 Datagen 使用的 API 的外部服务(例如外部 kafka 的kafka-client-2.5 )。

您还可以使用 API 来提供不同的用户(通过 keytab 和 principal),这些用户将被 datagen 用来生成数据,避免为用户 datagen 创建特定的策略。

原文链接:https://frischhwc.github.io/datagen

0 人点赞