前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Datagen-CDP平台的模拟数据生成器

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

作者头像
大数据杂货铺
发布2022-12-02 21:24:50
2.3K0
发布2022-12-02 21:24:50
举报
文章被收录于专栏:大数据杂货铺大数据杂货铺

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Datagen
  • 要求
  • 存储库
  • 安装
  • 使用 CSD 和Parcel安装
    • 设置 CSD
      • 设置Parcel
        • 添加服务向导
          • 初始化服务
            • 启动服务
            • 故障排除
              • 服务不存在
                • 没有指标 - 错误查询内部
                  • 无数据生成状态 - 测试配置无效
                  • 数据生成 - 基本
                  • HDFS
                  • Hive
                  • Ozone
                  • HBase
                  • 疑难解答
                  • 数据生成 - 第二部分
                  • 模型介绍
                  • 预定义模型
                    • HDFS 和Ozone
                      • HBASE
                        • Hive
                          • 本地文件
                            • Solr
                              • Kudu
                                • Kafka
                                • API
                                • 行、批次、线程、模型
                                • HDFS 的特定配置
                                • 运行示例
                                • 模型
                                • 模型的结构
                                • Fields
                                  • 字段类型 - 基本
                                    • 字段类型 - 高级
                                      • 城市字段
                                        • CSV字段
                                          • 条件 - 公式
                                            • 条件 - 注入
                                              • 条件 - 条件行
                                              • 表名
                                              • Primary_Keys
                                              • 选项
                                              • 如何创建模型的示例?
                                              • 测试模型
                                              • 启动数据生成
                                              • 数据生成的配置
                                              • Application.properties 文件
                                              • Ranger
                                              • Cloudera Manager 中的设置
                                              • 自动发现
                                              • API 中的设置
                                              相关产品与服务
                                              数据库
                                              云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                                              领券
                                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档