Stream Reader
Stream Reader 是一个从内存读取数据的插件, 他主要用来快速生成期望的数据并对写入插件进行测试
一个完整的 StreamReader 配置文件如下:
{
"reader": {
"name": "streamreader",
"parameter": {
"column": [
{
"value": "unique_id",
"type": "string"
},
{
"value": "1989-06-04 08:12:13",
"type": "date",
"dateFormat": "yyyy-MM-dd HH:mm:ss"
},
{
"value": 1984,
"type": "long"
},
{
"value": 1989.64,
"type": "double"
},
{
"value": true,
"type": "bool"
},
{
"value": "a long text",
"type": "bytes"
}
],
"sliceRecordCount": 10
}
}
}上述配置文件将会生成 10条记录(假定channel为1),每条记录的内容如下:
unique_id,'1989-06-04 08:12:13',1984,1989.64,true,'a long text'
目前 StreamReader 支持的输出数据类型全部列在上面,分别是:
string字符类型date日期类型long所有整型类型double所有浮点数bool布尔类型bytes字节类型
其中 date 类型还支持 dateFormat 配置,用来指定输入的日期的格式,默认为 yyyy-MM-dd HH:mm:ss。比如你的输入可以这样:
{
"value": "1989/06/04 12:13:14",
"type": "date",
"dateFormat": "yyyy/MM/dd HH:mm:ss"
}注意,日期类型不管输入是何种格式,内部都转为 yyyy-MM-dd HH:mm:ss 格式。
日期格式中的小时请使用 HH(24 小时制)。hh 表示 12 小时制的小时,如果格式中没有 AM/PM 标记就无法确定具体时刻,插件会在作业启动时直接报错,提示改用 HH。
StreamReader 还支持随机输入功能,比如我们要随机得到0-10之间的任意一个整数,我们可以这样配置列:
{
"random": "0,10",
"type": "long"
}获得一个 0 至 100 之间的随机浮点数,可以这样配置:
{
"random": "0,100",
"type": "double"
}如果要指定浮点数的小数位数,比如指定小数位为2位,则可以这样设定
{
"random": "0,100,2",
"type": "double"
}注意: 并不能保证每次生成的小数恰好是2位,如果小数为数为0 ,则小数位数会少于指定的位数。
这里使用 random 这个关键字来表示其值为随机值,其值的范围为左右闭区间。
其他类型的随机类型配置如下:
long: random 0, 10 0到10之间的随机数字string: random 0, 10 0到 10 长度之间的随机字符串bool: random 0, 10 false 和 true出现的比率double: random 0, 10 0到10之间的随机浮点数double: random 0, 10, 2 0到10之间的随机浮点数,小数位为2位date: random '2014-07-07 00:00:00', '2016-07-07 00:00:00' 开始时间->结束时间之间的随机时间,日期格式默认(不支持逗号)yyyy-MM-dd HH:mm:ssBYTES: random 0, 10 0到10长度之间的随机字符串获取其UTF-8编码的二进制串
StreamReader 还支持递增函数,比如我们要得到一个从1开始,每次加5的等差数列,可以这样配置:
{
"incr": "1,5",
"type": "long"
}如果需要获得一个递减的数列,则把第二个参数的步长(上例中的5)改为负数即可。步长默认值为1。
递增还支持日期类型( 4.0.1 版本引入),比如下面的配置:
{
"incr": "1989-06-04 09:01:02,2,d",
"type": "date"
}incr 由三部分组成,分别是开始日期,步长以及步长单位,中间用英文逗号(,)分隔。
- 开始日期:正确的日期字符串,默认格式为
yyyy-MM-dd HH:mm:ss,如果时间格式不同,则需要配置dateFormat来指定日期格式,这是必填项 - 步长:每次需要增加的长度,默认为1,如果希望是递减,则填写负数,这是可选项
- 步长单位:按什么时间单位进行递增/递减,默认为按天(day),这是可选项,可选的单位有
- d/day
- M/month
- y/year
- h/hour
- m/minute
- s/second
- w/week
配置项 sliceRecordCount 用来指定要生成的数据条数,如果指定的 channel,则实际生成的记录数为 sliceRecordCount * channel
内置数据规则
除了按类型生成常量、随机值和递增数列,StreamReader 还可以按业务规则直接生成贴近真实数据的数据,比如身份证号码、银行卡号、地址、公司名称等。这类列使用 rule 配置项来指定规则,无需配置 value,例如:
{
"rule": "idCard"
}一个包含全部规则的完整示例:
{
"job": {
"setting": {
"speed": {
"byte": -1,
"channel": 1
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": {
"reader": {
"name": "streamreader",
"parameter": {
"column": [
{
"value": "1,100,2",
"rule": "random",
"type": "double"
},
{
"value": "Addax",
"type": "string"
},
{
"value": "1",
"rule": "incr",
"type": "long"
},
{
"value": "1989/06/04 00:00:01,-1",
"rule": "incr",
"type": "date",
"dateFormat": "yyyy/MM/dd HH:mm:ss"
},
{
"value": "test",
"type": "bytes"
},
{
"rule": "address"
},
{
"rule": "bank"
},
{
"rule": "company"
},
{
"rule": "creditCard"
},
{
"rule": "debitCard"
},
{
"rule": "idCard"
},
{
"rule": "lat"
},
{
"rule": "lng"
},
{
"rule": "name"
},
{
"rule": "job"
},
{
"rule": "phone"
},
{
"rule": "stockCode"
},
{
"rule": "stockAccount"
}
],
"sliceRecordCount": 10
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"print": true,
"encoding": "UTF-8"
}
}
}
}
}执行该任务,输出结果类似如下:
$ bin/addax.sh job/streamreader-rules.json
___ _ _
/ _ \ | | | |
/ /_\ \ __| | __| | __ ___ __
| _ |/ _` |/ _` |/ _` \ \/ /
| | | | (_| | (_| | (_| |> <
\_| |_/\__,_|\__,_|\__,_/_/\_\
:: Addax version :: (v6.0.14-SNAPSHOT)
2026-09-13 14:17:39.640 [ main] INFO Engine -
{
"setting":{
"speed":{
"byte":-1,
"channel":1
},
"errorLimit":{
"record":0,
"percentage":0.02
}
},
"content":{
"reader":{
"name":"streamreader",
"parameter":{
"column":[
{
"value":"1,100,2",
"rule":"random",
"type":"double"
},
{
"value":"Addax",
"type":"string"
},
{
"value":"1",
"rule":"incr",
"type":"long"
},
{
"value":"1989/06/04 00:00:01,-1",
"rule":"incr",
"type":"date",
"dateFormat":"yyyy/MM/dd HH:mm:ss"
},
{
"value":"test",
"type":"bytes"
},
{
"rule":"address"
},
{
"rule":"bank"
},
{
"rule":"company"
},
{
"rule":"creditCard"
},
{
"rule":"debitCard"
},
{
"rule":"idCard"
},
{
"rule":"lat"
},
{
"rule":"lng"
},
{
"rule":"name"
},
{
"rule":"job"
},
{
"rule":"phone"
},
{
"rule":"stockCode"
},
{
"rule":"stockAccount"
}
],
"sliceRecordCount":10
}
},
"writer":{
"name":"streamwriter",
"parameter":{
"print":true,
"encoding":"UTF-8"
}
}
}
}
2026-09-13 14:17:39.650 [ main] INFO JobContainer - The jobContainer begins to process the job.
2026-09-13 14:17:39.657 [ job-0] INFO JobContainer - The Reader.Job [streamreader] perform prepare work .
2026-09-13 14:17:39.657 [ job-0] INFO JobContainer - The Writer.Job [streamwriter] perform prepare work .
2026-09-13 14:17:39.657 [ job-0] INFO JobContainer - Job set Channel-Number to 1 channel(s).
2026-09-13 14:17:39.657 [ job-0] INFO JobContainer - The Reader.Job [streamreader] is divided into [1] task(s).
2026-09-13 14:17:39.657 [ job-0] INFO JobContainer - The Writer.Job [streamwriter] is divided into [1] task(s).
2026-09-13 14:17:39.666 [ job-0] INFO JobContainer - The Scheduler launches [1] taskGroup(s).
2026-09-13 14:17:39.668 [ taskGroup-0] INFO TaskGroupContainer - The taskGroupId=[0] started [1] channels for [1] tasks.
2026-09-13 14:17:39.670 [ taskGroup-0] INFO Channel - The Channel set byte_speed_limit to -1, No bps activated.
2026-09-13 14:17:39.670 [ taskGroup-0] INFO Channel - The Channel set record_speed_limit to -1, No tps activated.
98.27 Addax 1 1989-06-04 00:00:01 0x74657374 宁夏回族自治区邯郸市龙潭区新华路249号 阳泉商行 九方房地产集团有限公司 4096678316310982 6217252221144286715 421126196801114274 -3.3966765 -151.6848752 狄红 安防主管 13538523906 008224 8680205898
81.33 Addax 2 1989-06-03 00:00:01 0x74657374 西藏自治区昆明县山亭区韶山街102号 盛京银行 联软办公有限合伙企业 6223473408795921 6213428525497728769 420117193803291935 45.4005918 126.2302139 芦萍 西点师 13420192359 836128 3569253894
28.62 Addax 3 1989-06-02 00:00:01 0x74657374 河南省兴安盟市海港区永联街265号 乌海银行 兰金电子餐饮有限公司 6227593032063763 6212939436209713059 320115200704155336 -37.3717424 83.8123369 孙林 列车/地铁车长 13077891026 883280 5750169522
7.38 Addax 4 1989-06-01 00:00:01 0x74657374 北京市淮安县六枝特区白山路5号 张家口商行 昊嘉文化有限合伙企业 6283121239374080 6235866437693714523 530802196306243564 -81.0485543 -176.9651246 勾玉 锅炉工程师/技师 15088018035 164106 2892469333
27.8 Addax 5 1989-05-31 00:00:01 0x74657374 香港特别行政区太原县平山区黄河街214号 承德银行 精芯机械中外合作有限公司 6259058913047415 6235868387408215337 320305197301266078 -30.3777802 73.0269088 巫凯 印刷排版/制版 19140432084 400570 1119544796
71.41 Addax 6 1989-05-30 00:00:01 0x74657374 河北省辛集市怀柔区碧海路50号 晋城商行 恩悌网络股份有限公司 6259075791345102 6213330694668956477 350582200507135392 54.4136463 62.497184 沙海燕 化验员 15899573264 405982 1551956384
42.79 Addax 7 1989-05-29 00:00:01 0x74657374 湖北省拉萨市梁平区白云街80号 中国建设银行 兰金电子餐饮集团 3568353959366817 6230407263361590072 520121193407021739 -36.5783856 -23.1595399 唐磊 CNC工程师 15762242326 031212 4222388439
89.21 Addax 8 1989-05-28 00:00:01 0x74657374 山东省长春县华龙区解放路239号 民生银行 MBP软件物流股份有限公司 6227539162714957 6213423889811345807 450107193805289620 59.4473891 126.722241 荆秀芳 瘦身顾问 14533489851 685121 2386678456
77.44 Addax 9 1989-05-27 00:00:01 0x74657374 广西壮族自治区合肥市普陀区光明路137号 天津银行 天开信息中外合作有限公司 6259068931268261 6200618145417973849 441600199110099977 70.7287609 143.8947897 滕雪梅 公共卫生/疾病控制 15030051423 682375 4332730599
1.67 Addax 10 1989-05-26 00:00:01 0x74657374 江西省惠州市双滦区七星路155号 中国银行 襄樊地球村信息技术有限公司 5477660282898100 6212939142939212015 130522195402117955 -12.8224904 175.018515 强杨 财务分析经理/主管 13046686503 029874 5578465632
2026-09-13 14:17:42.674 [ job-0] INFO AbstractScheduler - The scheduler has completed all tasks.
2026-09-13 14:17:42.676 [ job-0] INFO JobContainer - The Writer.Job [streamwriter] perform post work.
2026-09-13 14:17:42.677 [ job-0] INFO JobContainer - The Reader.Job [streamreader] perform post work.
2026-09-13 14:17:42.689 [ job-0] INFO StandAloneJobContainerCommunicator - Total 10 records, 1715 bytes | Speed 571B/s, 3 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.010s | Percentage 100.00%
2026-09-13 14:17:42.690 [ job-0] INFO JobContainer -
Job start at : 2026-09-13 14:17:39
Job end at : 2026-09-13 14:17:42
Job took secs : 3s
Total bytes : 1715
Average bps : 571B/s
Average rps : 3rec/s
Number of rec : 10
Failed record : 0当前内置的规则如下:
| 规则名称 | 含义 | 示例 | 数据类型 | 说明 |
|---|---|---|---|---|
address | 随机生成一条基本满足国内实际情况的地址信息 | 辽宁省兰州市徐汇区东山街176号 | string | |
bank | 随机生成一个国内银行名称 | 华夏银行 | string | |
company | 随机生成一个公司的名称 | 万迅电脑科技有限公司 | string | |
creditCard | 随机生成一个信用卡卡号 | 6227544006180760 | string | 16 位 |
debitCard | 随机生成一个储蓄卡卡号 | 6216695638260308313 | string | 19 位 |
email | 随机生成一个电子邮件地址 | [email protected] | string | |
idCard | 随机生成一个国内身份证号码 | 350600198508222018 | string | 18 位,符合校验规则,头 6 位编码满足行政区划要求 |
job | 随机生成一个国内岗位名称 | 系统工程师 | string | 数据来源于招聘网站 |
lat | 随机生成纬度数据 | 48.6648764 | double | 固定 7 位小数,也可以用 latitude 表示 |
lng | 随机生成经度数据 | 120.6018163 | double | 固定 7 位小数,也可以使用 longitude 表示 |
name | 随机生成一个国内名字 | 池浩 | string | 暂没考虑姓氏在国内的占比度 |
phone | 随机生成一个国内手机号码 | 15292600492 | string | 暂不考虑虚拟手机号 |
stockAccount | 随机生成一个 10 位的股票交易账户 | 0692522928 | string | 完全随机,不满足账户规范 |
stockCode | 随机生成一个 6 位的股票代码 | 687461 | string | 前两位满足国内股票代码编号规范 |
uuid | 随机生成一个 UUID 字符串 | bc1cf125-929b-43b7-b324-d7c4cc5a75d2 | string | |
zipCode | 随机生成一个国内邮政编号 | 411105 | long | 6 位数字,不完全满足国内邮政编号规范 |
规则名称不区分大小写,也不区分下划线和横线,因此 idCard、id_card、ID_CARD 是同一条规则。
关于规则的几点说明:
- 规则的数据类型是固定的,无法通过
type修改;如果配置的type与规则的类型不一致,作业会在启动时直接报错 - 数据由规则自己生成,配置的
value会被忽略,并给出告警
rule 配置项
rule 除了上面这些内置规则,还支持 constant、random 和 incr 三种通用规则,它们的参数写在 value 中,含义与本文档前面介绍的配置项完全一致:
{ "rule": "constant", "value": "addax", "type": "string" }
{ "rule": "random", "value": "1,10", "type": "long" }
{ "rule": "incr", "value": "1,5", "type": "long" }
{ "rule": "incr", "value": "1989-06-04 09:01:02,2,d", "type": "date" }也就是说,{"random": "1,10"} 与 {"rule": "random", "value": "1,10"} 等价,{"incr": "1,5"} 与 {"rule": "incr", "value": "1,5"} 等价。两种写法都支持,同一列同时配置 rule 与 random/incr 时以 rule 为准,被忽略的配置会有告警。
从 datareader 迁移
原 datareader 插件已合并到 StreamReader:它的内置规则(身份证、银行卡、地址等)现在由 StreamReader 提供,原先用于造数据的 datareader 插件不再单独发布。
迁移时只需要把作业配置中的插件名改掉,列的配置无需修改:
{
"reader": {
"name": "streamreader",
"parameter": {
"column": [
{ "rule": "idCard" }
],
"sliceRecordCount": 10
}
}
}如果列配置中使用了 hh 这样的 12 小时制日期格式,需要一并改成 HH。