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.1000和DATAGEN-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 服务了。
启动服务
在操作 > 开始。
弹出命令后,您可以浏览角色日志并单击完整日志文件:
并验证它启动良好,你应该看到:
故障排除
服务不存在
- 验证 csd 是否存在于/opt/cloudera/csd
- 重启 Cloudera Manager管理器
- 在其日志中验证:/var/log/cloudera-scm-server/cloudera-scm-server.logDATAGEN CSD 已正确添加并且没有弹出错误。
没有指标 - 错误查询内部
- 重新启动 CMS服务,尤其是 Service Monitor。
- 您还可以检查本地 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 个字段:
- 城市名称(仅限法国和西班牙)
- 这个城市的纬度(以纬度提供)
- 该城市的经度(可用长度)
- 该城市所在的国家/地区(可作为国家/地区获得)
{
"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
我们可以创建两个字段:
- 一个是人名(根据应该是法国的国家过滤)
- 此人所属部门
{
"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