通过Apache NiFi导入USRLE。第1步-通过HTTPS下载文件

在一个项目中,需要将数据从第三方系统的导入过程转移到微服务体系结构。选择了Apache NiFi作为工具。作为第一个实验,选择了联邦税收服务注册的导入。


USRLE数据以XML文件形式发布,并打包在ZIP存档中。存档每天在https://ftp.egrul.nalog.ru/相应日期的单独目录中的资源上进行布局要进行访问,密钥为#PKCS12。


NiFi需要解决的任务是从联邦税务局下载文件,并准备将下载的数据导入我们的服务。本文介绍如何实现文件下载。


数据源


从USRLE获得数据是作为联邦税收服务“集成和访问法律实体和USRIP统一州注册簿”数据库的一部分进行的。这里介绍了交互模型


这是联邦税收服务的资源,您想从中下载文件。
https://ftp.egrul.nalog.ru/?dir=EGRUL


后缀为FULL的目录是在相应年份开始时卸载完整寄存器的目录。其余目录是寄存器中的每日更新。我们有兴趣下载每日更新。


Apache NiFi中的流设置


流的任务是收集昨天上传的目录文件列表,获取这些文件并解压缩。


NiFi :

  1. FlowFile,
  2. HTML
  3. HTML ,


FlowFile


FlowFile GenerateFlowFile.


GenerateFlowFile






24 FlowFile fnsEgrulURL. https://ftp.egrul.nalog.ru/?dir=EGRUL/14.04.2020. NiFi Expression Language:

${literal('https://ftp.egrul.nalog.ru/?dir=EGRUL/'):append(${now():toNumber():minus(86400000):format('dd.MM.yyyy')})}

那些。当前日期被采用并转换为日期的数字表示形式。从中减去86,400,000毫秒。结果将转换为日期的字符串表示形式,格式为dd.MM.yyyy。结果日期将添加到链接的永久部分。

在输出中,我们获得以下形式FlowFile


截图FlowFile




检索目录内容


InvokeHTTP处理器用于获取目录的内容他使用昨天上传的目录链接执行GET请求。作为响应,处理器接收目录HTML代码,并将此HTML代码作为内容添加到FlowFile


调用HTTP处理器的屏幕截图




:
HTTPMethod — GET;
Remote URL — , URL . ${fnsEgrulURL} — FlowFile fnsEgrulURL;
SSL Context Service — SSLContextService , .. HTTPS. #PKCS12 .


FlowFile , , — HTML- .


SSLContextService


SSLContextService




SSLContexService #PKCS12 , , .


cacerts JDK. . https://fns.egrul.nalog.ru , #PKCS12. .



在证书链中,您必须选择俄罗斯DPC税务服务证书DER编码.CER格式导出接下来,您需要使用keytool实用程序将证书从接收到的文件导入cacerts存储库例如,像这样:

C:\Program Files\Java\jdk1.8.0_121\bin> keytool -importcert -keystore "C:\Program Files\Java\jdk1.8.0_121\jre\lib\security\cacerts" -file {   .CER}

cacerts默认密码为changeit

cacerts , NiFi . , Persistent Volume. SSLContextService. PKSC12, cacertsJKS.



GetHTMLElement, HTML- FlowFile-. ZIP-.


<div id="page-content" class="container">
    <div id="directory-list-header">
        <div class="row">
            <div class="col-md-7 col-sm-6 col-xs-10"></div>
            <div class="col-md-2 col-sm-2 col-xs-2 text-right"></div>
            <div class="col-md-3 col-sm-4 hidden-xs text-right"> </div>
        </div>
    </div>
    <ul id="directory-listing" class="nav nav-pills nav-stacked">
                            <li data-name=".." data-href="https://ftp.egrul.nalog.ru/?dir=EGRUL">
                <a href="https://ftp.egrul.nalog.ru/?dir=EGRUL" class="clearfix" data-name="..">
                    <div class="row">
                        <span class="file-name col-md-7 col-sm-6 col-xs-9">
                            <i class="fa fa-level-up fa-fw"></i>
                            ..                                </span>
                        <span class="file-size col-md-2 col-sm-2 col-xs-3 text-right">
                            -                                </span>
                        <span class="file-modified col-md-3 col-sm-4 hidden-xs text-right">
                            2020-04-05 22:00:00                                </span>
                    </div>
                </a>
            </li>
                            <li data-name="EGRUL_2020-04-05_1.zip" data-href="EGRUL/05.04.2020/EGRUL_2020-04-05_1.zip">
                <a href="EGRUL/05.04.2020/EGRUL_2020-04-05_1.zip" class="clearfix" data-name="EGRUL_2020-04-05_1.zip">
                    <div class="row">
                        <span class="file-name col-md-7 col-sm-6 col-xs-9">
                            <i class="fa fa-file-archive-o fa-fw"></i>
                            EGRUL_2020-04-05_1.zip                                </span>
                        <span class="file-size col-md-2 col-sm-2 col-xs-3 text-right">
                            528.78KB                                </span>
                        <span class="file-modified col-md-3 col-sm-4 hidden-xs text-right">
                            2020-04-05 22:00:24                                </span>
                    </div>
                </a>                     
                    <a href="javascript:void(0)" class="file-info-button">
                        <i class="fa fa-info-circle"></i>
                    </a>
            </li>
    </ul>
</div>


GetHTMLElement


:
URL — URL HTML-;
CSS Selector — . li[data-name^=EGRUL]li, data-name, EGRUL;
Output TypeAttribute — HTML-;
Destinationflowfile-attributeFlowFile- ( HTMLElement);
Attribute Name — , . abs:${literal('data-href')} — URL (abs:) + data-href , CSS-.


, CSS- FlowFile ZIP- HTMLElement.



InvokeHTTP , HTML- . URL HTMLElement, ZIP-. SSLContextService .


InvokeHTTP


ZIP- FlowFile .



UnpackContent. — ZIP.


UnpackContent处理器屏幕截图


在输出处,处理器为从ZIP存档解压缩的每个XML文件创建一个FlowFile


进一步...


此外,每个XML需要转换为JSON并按组织细分,因为 每个XML包含1到1000个寄存器语句。并且将来会通过JSON将数据加载到SQL或NoSQL存储中。


下一篇文章将XML转换为JSON和AVROSchema。


All Articles