Importieren Sie USRLE mit Apache NiFi. Schritt 1 - Dateien über HTTPS herunterladen

In einem der Projekte musste der Prozess des Importierens von Daten von Systemen von Drittanbietern in eine Microservice-Architektur übertragen werden. Apache NiFi wurde als Werkzeug ausgewählt. Als erstes Experiment wurde der Import des Federal Tax Service Registers ausgewählt.


USRLE-Daten werden als XML-Dateien veröffentlicht, die in ZIP-Archiven gepackt sind. Archive werden täglich auf einer Ressource https://ftp.egrul.nalog.ru/in einem separaten Verzeichnis für das entsprechende Datum angeordnet. Für den Zugriff lautet der Schlüssel # PKCS12.


Die Aufgabe, die mit NiFi gelöst werden muss, besteht darin, Dateien vom Bundessteuerdienst herunterzuladen und die heruntergeladenen Daten für den Import in unsere Dienste vorzubereiten. Dieser Artikel beschreibt das Implementieren von Dateidownloads.


Datenquelle


Der Abruf von Daten aus der USRLE erfolgt im Rahmen der Datenbanken "Integration und Zugang zum einheitlichen staatlichen Register der juristischen Personen und USRIP" des Bundessteuerdienstes. Eine Beschreibung des Interaktionsmodells finden Sie hier .


Dies ist die Ressource des Bundessteuerdienstes, von der Sie Dateien herunterladen möchten.
https://ftp.egrul.nalog.ru/?dir=EGRUL


Verzeichnisse mit dem Suffix FULL sind das Entladen des vollständigen Registers zu Beginn des entsprechenden Jahres. Die restlichen Kataloge sind tägliche Aktualisierungen im Register. Wir sind daran interessiert, tägliche Updates herunterzuladen.


Stream-Setup in Apache NiFi


Die Aufgabe des Streams besteht darin, eine Liste der Katalogdateien mit dem gestrigen Upload zu sammeln, diese Dateien abzurufen und zu entpacken.


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')})}

Jene. Das aktuelle Datum wird genommen und in eine numerische Darstellung des Datums konvertiert. 86.400.000 Millisekunden werden davon abgezogen. Das Ergebnis wird in eine Zeichenfolgendarstellung des Datums im Format TT.MM.JJJJ konvertiert. Das resultierende Datum wird dem permanenten Teil des Links hinzugefügt.

Am Ausgang erhalten wir eine FlowFile der folgenden Form:


Screenshots FlowFile




Verzeichnisinhalt abrufen


Der InvokeHTTP- Prozessor wird verwendet, um den Inhalt des Verzeichnisses abzurufen . Er führt eine GET-Anfrage über den Link zum Verzeichnis mit dem gestrigen Upload durch. Als Antwort erhält der Prozessor den Katalog-HTML-Code und fügt diesen HTML-Code als Inhalt zur FlowFile hinzu .


Screenshots des InvokeHTTP-Prozessors




:
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. .



In der Zertifikatskette müssen Sie das russische DPC Tax Service- Zertifikat auswählen und im .CER- Format in DER-Codierung exportieren . Als Nächstes müssen Sie das Zertifikat mit dem Dienstprogramm keytool aus der empfangenen Datei in das cacerts- Repository importieren . Zum Beispiel so:

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}

Das Standardkennwort für Cacerts lautet 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.


Screenshots des UnpackContent-Prozessors


Bei der Ausgabe erstellt der Prozessor eine FlowFile für jede aus dem ZIP-Archiv entpackte XML-Datei.


Des Weiteren...


Außerdem muss jedes XML in JSON konvertiert und nach Organisation aufgeschlüsselt werden, weil Jedes XML enthält 1 bis 1000 Registeranweisungen. Und von JSON wird es in Zukunft möglich sein, Daten in SQL- oder NoSQL-Speicher zu laden.


Das Konvertieren von XML in JSON und AVROSchema finden Sie im nächsten Artikel.


All Articles