ml.net 能做什么事情
我经常重复的一个模因是:“总是有不止一种解决方案。” 我还经常写关于企业应如何评估可用解决方案以及如何最好地满足其需求的文章。 我不常提到的是,在现实世界中,有很多很好的(而不是那么好)的原因,为什么最好的解决方案就不会发生,或者没有在必要的时间范围内发生(我大声疾呼)太频繁)。 当我发现自己处于最佳路线受阻的地方时,我会尝试找到一种有趣,有教育意义且权宜之计的方法,而且通常情况相反。
解决方案者必须做的事情解决方案者必须做的事情
我最近处理了一个特定情况,即首选选项不在桌面上,这种情况我已经多次看到,这促使我分享了解决方案。 用例是当Informatica Cloud的日常操作生成的文件开始占满磁盘空间并引起问题时。 最佳解决方案是拥有一个服务器归档过程,该过程可在整个企业中重复使用,最好设计为通用服务。 最糟糕的解决方案(除了只忽略问题然后反复处理中断),就是简单地增加磁盘空间。 这种方法类似于发出Whack-a-Mole的方法,因为它会推出空间问题,然后弹出文件索引延迟问题-直到空间问题最终回来。
当然,文件管理脚本并不难编写。 我已经写了一些出于各种目的的工具,并选择Python作为语言,因为它可以在可以安装安全代理的任何地方(例如Windows,Unix和Linux)使用。 在这个特定的企业中,测试,安装和管理脚本的挑战仅比部署企业归档服务的挑战要少,因此这并不是解决这种情况的途径。 不用担心,企业确实拥有Informatica Cloud的高级版本,这意味着它除了拥有Data Integration许可证外,还拥有Application Integration(又名ICRT,前身为Informatica Cloud Run Time)许可证。 因此,我没有使用托管服务组来管理脚本,而是使用Application Integration平台来完成这项工作。 这是如何做。
腾出空间
第一次迭代与快速恢复空间有关,而保留策略仍然未知。 一个较小的障碍是数据集成几乎全天候运行24/7(这就是我们遇到空间问题的原因)。 因此,该解决方案从创建一个子文件夹开始,在该文件夹中堆积文件并将它们移动到新文件夹。 使用中的文件不会移动,因此我不必担心处理正在进行的工作中涉及的文件。 我仅根据上次修改日期使用查找来完全消除该担忧。 文件移动后,使用压缩文件的命令很简单。 虽然我希望使用tar
命令来实现此目的,但我想增加一个存档,而不是创建每日存档,并且我不想每次都爆炸并重新压缩,因为它可能会将磁盘空间推入红色。 我命名了年和月的临时文件夹,并在两个月大后删除了这些文件夹。
如果您还没有使用ICRT,那么它会针对使用Web服务进行优化,并使用XQuery和XPath函数来管理数据,将所有内容都视为XML。 因此,此第一步包括定义变量( current_dated_folder
, old_dated_folder
, last_month_year
, days_to_zip
和months_to_keep
),然后将它们放到XQuery函数生成的命令中:
let $startDate := if(fn:day-from-date(fn:current-date()) >= ($temp.days_to_zip + 1)) then fn:concat(fn:year-from-date(fn:current-date()),’-‘, fn:substring($temp.current_dated_folder, 5),’-01’) else fn:concat($temp.last_month_year, ‘-01’) let $durationDays := fn:concat(“P”, $temp.days_to_zip,”D”) let $endDate := fn:substring( fn:string(fn:current-date() - xs:dayTimeDuration($durationDays)) ,1, 10) let $archive := fn:replace(fn:substring($startDate, 1, 7), ‘-‘, ‘’) return fn:concat(‘find . -not -name “*.gz” -not -name “*.7z” -mtime +’,fn:string(31*$input.months_to_keep),’ -delete;’, ‘mkdir -p ‘, $temp.current_dated_folder, ‘;rm -rf ‘,$temp.old_dated_folder, ‘;find . -newermt “‘, $startDate, ‘“ ! -newermt “‘,$endDate,’” -print0 | xargs -IF -0 mv F ‘,$archive, ‘/;cd ‘,$archive, ‘;if [ “$(ls —ignore="*.gz" —ignore="*.zip" | wc -l)” -ge “1” ]; then zip —q ‘,$archive, ‘.zip -r *.* -8 -x *.gz* -x *.zip* -x *.7z*;find . -not -name “*.zip” -not -name “*.gz” -delete; fi’)
小心台阶
第一次将其部署到另一个组织时,我看到了这个难看的错误:
{”error”:{”code”:500,”detail”:{”reason”:”Access denied.”,”code”:”AeException”},”message”:”Access denied.”}}
我将为您保存我发现问题所经历的痛苦步骤的详细信息,但将分享我在哪里找到的问题,因为这不是我第一次遇到此问题。 答案是在我向他人解释如何解决该问题的帖子中,该帖子将转到管理控制台并启用Shell服务。
一切都是钉子
像所有快速修复一样,我从眼前的问题开始,这很简单。 看一下该解决方案,该解决方案管理的日志路径由于在每小时的数据集成中处理文件I / O连接而被填满,因此我开始寻找新锤子可以处理的其他问题。 下一个明显的用途是,如果目标系统的利益相关者提出了问题,则用于协调文件归档。 在大多数情况下,这是一项简单的增强功能,增加了使用的字段变量的数量并为变量添加了输入字段,因此可以将该过程称为服务(我最喜欢的Informatica Cloud Application Integration功能之一)。
良好的开发意味着良好的测试,因此一旦将日志文件用作默认路径,将归档文件夹作为可选参数,并且可以配置的保留月份数有所变化,我就从测试环境中获取了许多文件,并开始增加数量和种类。 并发现了我的第一个设计缺陷,那就是该解决方案仅在保留期内处理文件,而较旧的文件则徘徊不前。 虽然这是对环境不断恶化之前堆积它们的当前状况的一种改进,但它不如可以完成的范围内所能管理的那么好,因此,它返回到流程面板,以找出如何解决在不使初级维护团队成员难以管理的情况下处理旧文件。
当我开始检查是否有较旧的文件要处理时,我很快意识到这是多余的检查,因为我将所有超过保留期限的文件以及最远期限和当前月份之间的文件都视为相同。 我使用以下方法删除了较旧的文件:
fn:concat(‘find . -maxdepth 1 -not -name “*.gz” -not -name “*.7z” -mtime +’,(fn:days-from-duration(fn:current-date() - (fn:current-date() - xs:yearMonthDuration(fn:concat(‘P’, $input.months_to_keep, ‘M’))))) - 1,’ -delete;’)
处理完要删除的文件后,我便在保留期的一个月内处理了这些文件。
let $startDate := xs:date(fn:concat(fn:substring($temp.current_dated_folder, 1, 4), ‘-‘, fn:substring($temp.current_dated_folder, 5),’-01’)) let $endDate := $startDate + xs:yearMonthDuration(“P1M”) let $archive := fn:replace(fn:substring(fn:string($startDate), 1, 7), ‘-‘, ‘’) return fn:concat(‘mkdir -p ‘, $temp.current_dated_folder, ‘;find . -newermt “‘, $startDate,’” ! -newermt “‘,$endDate, ‘“ -print0 | xargs -IF -0 mv F ‘,$archive,’/;cd ‘,$archive, ‘;if [ “$(ls —ignore="*.gz" —ignore="*.zip" | wc -l)” -ge “1” ]; then zip —q ‘,$archive, ‘.zip -r *.* -8 -x *.gz* -x *.zip* -x *.7z*;find . -not -name “*.zip” -not -name “*.gz” -delete; fi’)
一旦确定了每月的命令,我便做出了必要的决定,以进行必要的迭代,一切都很好。
但是等等,还有更多……不,那只是汽油
当然,一旦有了适当的旧文件管理流程,我意识到我也可以对其进行修改以适应当前文件。 但是,想到了“如果不能解决问题”的格言。 如果我将流程构建为课堂示例,那么我肯定会花时间重构。 但是鉴于这是一个真实的文字工作情况,并且所产生的实现很容易按照原样进行,所以我将它留给了一点多余的步骤。 我还保留了仅测试步骤,以加快开发速度,因为它没有任何开销,并且使以后的增强变得更容易。
如果您想学习或重复使用最终过程的副本,请在Twitter @ssnsolutionist上通过电子邮件与我联系,并提供本文的链接。
翻译自: https://www.infoworld.com/article/3310236/just-because-something-can-be-done.html
ml.net 能做什么事情