摘要:
本文由以数据之名分享,正所谓“问君能有几多愁,恰似一江春水向东流”。
人不知;鬼不觉中,“以数据之名”Kettle解忧消愁系列专题已更新了五篇知识库文章“三十而立、四十不惑、五十而耳知天命、六十而耳顺、七十古稀”,叙述了应用Kettle作为ETL开发的常见组件应用阐明、业务场景实现逻辑、异样剖析及组件性能优化相干内容。
明天,咱们跟着小编的节奏,持续探讨第六篇Kettle知识库问答系列之八零年代,做到理念和实际的活泼对立。
一.异样剖析篇
第073问:
Host '127.0.0.1' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connectionclosed by foreign host?
第073答:
由异样提醒能够看出起因:同一个ip在短时间内产生太多(超过mysql数据库max_connect_errors的最大值)中断的数据库连贯而导致的阻塞。
首先,咱们先查询数据库服务端的参数max_connect_errors配置
show variables like 'max_connect_errors';+--------------------+-------+| Variable_name | Value |+--------------------+-------+| max_connect_errors | 10 |+--------------------+-------+
max_connect_errors是一个MySQL中与平安无关的计数器值,它负责阻止过多尝试失败的客户端以避免暴力破解明码的状况。
- max_connect_errors的值与性能并无太大关系,默认是10。意味着如果某一客户端尝试连贯此MySQL服务器,然而失败(如明码谬误等等)10次 ,则MySQL会无条件强制阻止此客户端连贯。
- 如果心愿重置此计数器的值,则必须重启MySQL服务器或者执行mysql> flush hosts; 命令。当这一客户端胜利连贯一次MySQL服务器后,针对此客户端的max_connect_errors会清零。如果max_connect_errors设置过小,则网页可能提醒无奈连贯数据库服务器。
解决办法1:批改max_connect_errors的值
(1)进入Mysql数据库查看max_connect_errors:
show variables like '%max_connect_errors%';
(2)批改<span style="color:red;">max_connect_errors</span>的值:
set global max_connect_errors = 80;
(3)查看是否批改胜利
show variables like '%max_connect_errors%';
解决办法2:应用mysqladmin flush-hosts 命令清理一下hosts文件
。
(1)在查找到的目录下应用命令批改:> mysqladmin -u xxx -p flush-hosts
或者
> flush hosts;
解决办法3:重启mysqld。
也能够在重启之前,在配置文件中将该参数调大。> vi /etc/my.cnfmax_connect_errors = 80
第074问:
Kettle发送邮件附件中文乱码,如何解决呢?
第074答:
批改spoon启动脚本配置,在set OPT=%OPT% %PENTAHO_DI_JAVA_OPTIONS% 这一行开端,增加如下配置:
"-Dmail.mime.encodefilename=true" "-Dmail.mime.charset=utf-8" "-Dfile.encoding=utf-8"
第075问:
Kettle ES Bulk Insert批量数据写入,Kibana查问有提早?
第075答:
- 首先,很可能短时间写入数据量和并发量过大,es的master解决不过去了,segment合并是一个很是耗时的操作。
其次也可能有以下几点起因:
- 1、分片数过多,倡议单节点的分片数不要超过1000个;shard越少,写入开销越小;
- 2、通过写入数据主动建设索引最容易呈现这种情况;
- 3、大批量写入数据refresh工夫距离过短;
- 4、索引的字段数量太多(几十上百个)
二.性能剖析篇
第076问:
你了解count(*)、count(1)、count(column)的区别嘛?
第076答:
咱们能够从以下两个角度来别离对待:
执行成果上 :
- 1、count(*)包含了所有的列,相当于行数,在统计后果的时候, 不会疏忽列值为NULL
- 2、count(1)包含了疏忽所有列,用1代表代码行,在统计后果的时候, 不会疏忽列值为NULL
- 3、count(column)只包含列名那一列,在统计后果的时候,会疏忽列值为空(这里的空不是只空字符串或者0,而是示意null)的计数, 即某个字段值为NULL时,不统计。
执行效率上:
- 1、列名为主键,count(column)会比count(1)快
- 2、列名不为主键,count(1)会比count(column)快
- 3、如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
- 4、如果有主键,则 select count(主键)的执行效率是最优的
- 5、如果表只有一个字段,则 select count(*)最优。
第077问:
怎么我的Kettle转换或者作业运行耗时那么长?
第077答:
无论应用什么组件,首先要看工作运行表象:
- 1、工作执行慢?(思考为什么慢,怎么找出那个环节慢)
2、找出哪个环节接慢?
- 2.1、看各环节执行耗时,做初步察看;
- 2.2、启动探测,察看metrics步骤度量信息。
3、找出了那个环节耗时最长,思考什么起因可能导致慢逻辑?
- 3.1、表输出慢,思考是否存在查问badsql,如索引未失效;
Kettle知识库问答系列之六十而耳顺 - 3.2、数据库查问或数据库连贯,反查操作慢,是否存在索引未失效的状况,如上一步骤数据流,数据类型和查问条件数据类型不匹配,导致badsql
- 3.3、表输入慢或插入更新慢,参考我的文章:
Kettle知识库问答系列之三十而立
Kettle知识库问答系列之四十不惑
Kettle知识库问答系列之六十而耳顺
- 3.1、表输出慢,思考是否存在查问badsql,如索引未失效;
4、也可能跟源数据库服务器、etl服务器、指标数据库服务器等系统资源或数据库存在性能瓶颈。
- 4.1、须要做服务器底层参数优化(如文件句柄数等)
- 4.2、数据库层面(如server实例启动分配内存等)
- 4.3、找DBA配合做性能剖析
- 5、抑或是组件应用问题,再或者是组件自身存在性能瓶颈
三.实战开发篇
第078问:
如何一次性把握json解析真谛?
第078答:
对于Json字段的解析有两种规范的解决形式:
1.应用自带的JsonInput输出组件解析
1.1 解析单层数据
解析思路:JsonInput的应用标准是,解析单层数据,能够一次性搞定;
这里咱们间接解析第4层,itemCode的门路配置,JsonArray用key[*]获取,JsonObject用key间接获取:- $..extendList[*]..itemCode(此处有省略门路信息)
- 或 <span style="color:orangered">$..extendList[*].itemCode</span>(此处有省略门路信息)
- 或 $.result.paySuiteDataList[*].extendList[*].itemCode
解析后果,具体如下:
1.2 解析多层数据,须要分档次解析。还有一点,须要保障每层解析的元数据字段必须统一,否则JsonInput组件就会跑异样啦。
- 这里咱们须要解析第3层和第4层数据,实现数据流字段组合,先解析第3层,extendList的门路为$.result.paySuiteDataList[*].extendList,其余同层key获取门路前缀统一
解析后果,具体如下:- 再在第三层extendList的门路根底上,解析第4层JsonArray数据。itemCode的门路配置为$..itemCode
解析后果,具体如下:
2.应用Java脚本组件解析(引入FastJson或Jackson等Json序列化和反序列化包),此处以FastJson为例
- 1、import 导入FastJson包;
- 2、Json反序列化成JsonArray或JsonObject,根据Json体层次结构的对象属性来具体调用JSONObject.parseObject或JSONArray.parseArray等API办法
- 3、获取当档次key字段数据getString或getObject等API办法
第079问:
怎么玩转xml解析?
第079答:
针对于XML文件或字段串解析,有以下几个关键步骤:
以如下xml构造为示例,做具体步骤解析剖析,供参考。
<Session_header Code="xmltest"> <InfoSession> <InfoSessionData User="Username1"> <Data>Data1</Data> </InfoSessionData> </InfoSession> <InfoSession> <InfoSessionData User="Username2"> <Data>Data2</Data> </InfoSessionData> </InfoSession> <InfoSession> <InfoSessionData User="Username3"> <Data>Data3</Data> </InfoSessionData> </InfoSession> <Session> <SessionData> <Parameter> <User>Username1</User> <Password>password123</Password> </Parameter> <OutputData> <Step> <Error_Message>Please have transaction ID and related information ready. Timestamp : 20070731 01:50:06 Session : 0201</Error_Message> </Step> </OutputData> </SessionData> <SessionData> <Parameter> <User>Username2</User> <Password>password345</Password> </Parameter> <OutputData> <Step> <Error_Message>error occurred Timestamp : 20070731 01:53:25</Error_Message> </Step> </OutputData> </SessionData> <SessionData> <Parameter> <User>Username3</User> <Password>password567</Password> </Parameter> <OutputData> <Step> <Error_Message>Transaction Id :361163328</Error_Message> <Status>Processed according to contract/plan provisions</Status> </Step> </OutputData> </SessionData> </Session></Session_header>
- 1、指定xml数据流起源,是文件?还是数据流字段?还是接口返回报文?
- 2、查看xml数据标签构造,确定循环目录Session_header/Session/SessionData;
3、明确待解析字段信息,是标签属性值?还是标签值?
- Code:为Session_header的标签属性值,而循环读取门路为Session_header/Session/SessionData,所以须要往上找两层../../,加上此处获取的是标签属性值,故配置为@Code。所以整体Code字段的XML门路为“../../@Code”
- User:此处xml构造第5层的<User>的标签值,而循环读取门路为Session_header/Session/SessionData,所以须要往下找两层,此处采纳具体门路Parameter/User。Password、Status、Error_Message标签值的XML门路配置同上逻辑
- Data:此处xml构造第4层的<Data>的标签值,而循环读取门路为Session_header/Session/SessionData,所以须要先往上找两层../../,再往下找两层InfoSession/InfoSessionData。而这里的Data标签值要依据下层InfoSessionData的标签属性User对应值,与Session_header/Session/SessionData/Parameter/User的标签值一一匹配上。这里的InfoSessionData门路要调整为InfoSessionData[@User=@_User-],最初再取第4层的<Data>的标签值,最初Data对应的标签值的XML门路配置为../../InfoSession/InfoSessionData[@User=@_User-]/Data
- Code:为Session_header的标签属性值,而循环读取门路为Session_header/Session/SessionData,所以须要往上找两层../../,加上此处获取的是标签属性值,故配置为@Code。所以整体Code字段的XML门路为“../../@Code”
- 4、最初咱们来具体看下,示例运行输入后果,来查看配置逻辑是否正确。
第080问:
我有200+表,须要做全量数据同步,Kettle 有没有通用的解决方案?
第080答:
如果你的ETL逻辑没有特地个性化,实践上是能够搞一套通用配置,要什么字段取什么字段,指标不配置映射关系。就能够让数据流和指标数据库依照程序主动匹配。
- 1个入口程序Job A,负责调用查问通用配置表查问转换 Trans A,和循环调用执行Job B;
- 1个执行Job B ,负责调用初始化通用参数转换Trans B,和调用外围执行转换Trans C;
- 1个转换Trans A负责读取配置表信息,复制到后果集;
- 1个转换Trans B负责从后果集读取配置行信息,赋值给设置变量;
1个转换Trans C负责执行外围ETL操作,表输出(依据配置源数据库表参数信息,获取动静SQL
${S_SQL}
或动静拼接SQL
select ${s_column} from ${s_tb} where ${s_where})
+个性化解决(非必须)+表输入(动静指标表【${t_tb}】)。
四.KETTLE专题回顾篇
Kettle插件开发之Splunk篇
Kettle插件开发之Elasticsearch篇
Kettle插件开发之KafkaConsumerAssignPartition篇
Kettle插件开发之KafkaProducer篇
Kettle插件开发之KafkaConsumer篇
Kettle插件开发之KafkaConsumerAssignPartition篇
Kettle插件开发之MQToSQL篇
Kettle插件开发之Redis篇
Kettle疾速构建根底数据仓库平台
Kettle知识库问答系列之三十而立
Kettle知识库问答系列之四十不惑
Kettle知识库问答系列之五十而知天命
Kettle知识库问答系列之六十而耳顺
Kettle知识库问答系列之七十古稀
Kettle实战系列之Carte集群利用
Kettle实战系列之动静邮件
Kettle实战系列之基于Carte构建微服务
虽小编一己之力强劲,但读者众星之光璀璨。小编敞开心扉之门,还望倾囊赐教原创之文,期待之心满于襟怀,感谢之情溢于言表。一句话,欢送分割小编投稿您的原创文章!