我正在使用Oracle数据库11g(关系数据库)配置DAS 3.1.0 + APIM 2.0.0。
当我启用 DAS 分析统计信息以与 API 管理器集成时,除了 DAS 显著提高具有数据库的计算机的 CPU 消耗水平的部分之外,几乎所有内容都运行良好。
我注意到他总是运行这个查询:
MERGE INTO API_REQ_USER_BROW_SUMMARY dest USING( SELECT :1 api, :2
version, :3 apiPublisher, :4 tenantDomain, :5 total_request_count, :6
year, :7 month, :8 day, :9 requestTime, :10 os, :11 browser FROM dual)
src ON(dest.api=src.api AND dest.version=src.version AND
dest.apiPublisher=src.apiPublisher AND dest.year=src.year AND
dest.month=src.month AND dest.day=src.day AND dest.os=src.os AND
dest.browser=src.browser AND dest.tenantDomain=src.tenantDomain)WHEN NOT
MATCHED THEN INSERT(api, version, apiPublisher, tenantDomain,
total_request_count, year, month, day, requestTime, os, browser)
VALUES(src.api, src.version, src.apiPublisher, src.tenantDomain,
src.total_request_count, src.year, src.month, src.day, src.requestTime,
src.os, src.browser) WHEN MATCHED THEN UPDATE SET
dest.total_request_count=src.total_request_count,
dest.requestTime=src.requestTime
我想知道是否有办法进行优化,以便数据分散的机器的 CPU 不会受到太大打击,从而导致性能下降。
拜托,有没有人遇到过这个困难,你能帮我吗?
在上面的查询中发生的情况是,如果数据库中没有具有相同主键值的记录,或者如果有一些记录具有相同的主键,则记录入到数据库中,然后我们更新现有记录。
表"API_REQ_USER_BROW_SUMMARY"有两列"OS"和"浏览器",它们是该表主键的一部分。观察到,当 NULL 值插入到"OS"和"浏览器"中时,分析服务器和数据库将挂起。
您可以做的是,(在执行步骤之前,您可能需要关闭分析服务器并重新启动数据库服务器)
- 转到{Analytics_server}/repository/deployment/server/carbonapps,然后以zip文件打开org_wso2_carbon_analytics_apim-1.0.0.car。
- 转到文件夹 APIM_USER_AGENT_STATS_1.0.0
- 打开APIM_USER_AGENT_STATS.xml
- 在脚本的末尾(标记之前),您将看到如下所示的 sparkSql 查询。
INSERT INTO TABLE APIUserBrowserData SELECT api,version,apiPublisher,tenantDomain,total_request_count,year,month,day,requestTime,os,browser FROM API_REQUEST_USER_BROWSER_SUMMARY_FINAL;
- 将该行替换为以下内容。
INSERT INTO TABLE APIUserBrowserData SELECT api,version,apiPublisher,tenantDomain,total_request_count,year,month,day,requestTime, if(os is null, "UNKNOWN",os), if(browser is null, "UNKNOWN", browser) FROM API_REQUEST_USER_BROWSER_SUMMARY_FINAL;
这将防止 Spark 将 NULL 值插入到表"API_REQ_USER_BROW_SUMMARY"中的"OS"和"浏览器"列。 执行上述更改后,请检查CPU消耗是否很高。
编辑:@artCampos,我无法发表评论,所以我正在编辑我的原始答案以回复您的评论。不会有任何副作用。但是,请注意,我们将 NULL 值替换为字符串值"UNKOWN"。我认为在这种情况下这不是问题。您无需丢弃任何现有数据。另请注意,无论如何,如果将 NULL 值插入到 数据库主键,它将在大多数RDBMS中失败。