2017-07-10 2 views
1

Ich habe eine Menge Avro-Dateien mit IPs (Weblogs) in Azure Blobs gespeichert. Ich möchte die IP zu Standort zuordnen. Wie macht man das mit Azure Data Lake Analytics (ADLA)?Map IP zu Location mit Azure Data Lake Analytics

Im Moment habe ich einen Spark-Job, der die Maxmind IP-Datenbank mit einer Java-Bibliothek verwendet, die eine 113MB große .mmdb-Datei mit allen IP-Standortdaten liest, um diese Suche durchzuführen. Ich untersuche jetzt, ob es möglich ist, diesen Job zu ADLA zu verschieben

Maxmind stellt auch eine C# -Bibliothek zur Verfügung, so dass dieser Teil kein Problem darstellt. Allerdings ist es für mich nicht offensichtlich, wie man mit dieser großen mmdb-Datei umgeht, die gelesen und dann für die Suche verwendet werden muss. Offensichtlich wäre es nicht schnell, die Datei für jede IP-Suche zu lesen. Wie kann dies (und ähnliche Fälle) mit ADLA gehandhabt werden, oder ist ADLA für diese Art von Operationen ungeeignet?

Wenn ich ein normales Programm ausgeführt hätte, würde ich die Nachschlag wie folgt tun:

using (var reader = new Reader("GeoIP2-City.mmdb")) 
{ 
    foreach(var ip in ips) 
    { 
     var data = reader.Find<Dictionary<string, object>>(ip); 
     ... 
    } 
} 

Die MaxMind db finden Sie hier: https://dev.maxmind.com/geoip/geoip2/downloadable/ (beachten Sie, dass ich die Datenbank Im derzeit gekauft haben, verwenden) und C# Bibliothek es hier zu lesen: https://github.com/maxmind/MaxMind-DB-Reader-dotnet

+0

Ehrlich gesagt klingt das wie eine einfache Datenbankoperation - Join, aka Lookup, aber ich weiß nichts über die Maxmind-Daten. Kannst du uns mehr erzählen? Haben Sie beispielsweise die Datei bezahlt und heruntergeladen? – wBob

+0

Die Antwort wurde ein wenig erweitert mit der Verwendung der Datenbank in einem "normalen" Befehlszeilenprogramm. – viblo

+0

Haben Sie erwogen, die ADLA-Tabelle zum Speichern der großen Datei zu verwenden und dann wie eine Nachschlagetabelle zu verwenden? Sie können Ihre Eingabedatei direkt mit der ADLA-Tabelle verknüpfen, basierend auf der IP (vorausgesetzt, sie haben das gleiche Format), ähnlich wie bei der Suche mit natürlichen Schlüsseln. – jatal

Antwort

2

(Azure Daten See Team hier)

Sie können DEPLOY RESOURCE Anweisung U-SQLs verwenden und ein UDO für diesen Zweck.

Zuerst muss die Datei in Ihren Datalake-Store hochgeladen werden. Verwenden Sie dann DEPLOY RESOURCE, um das U-SQL-System anzuweisen, diese Datei in jeden Knoten zu kopieren, in dem das Skript ausgeführt wird. Dann verwendet Ihr Skript C# -Code, um die Datei zu lesen.

DEPLOY RESOURCE "/helloworld.txt"; 

@departments = 
    SELECT * 
    FROM (VALUES 
     (31, "Sales"), 
     (33, "Engineering"), 
     (34, "Clerical"), 
     (35, "Marketing") 
    ) AS D(DepID, DepName); 


@departments = 
    PROCESS @departments 
    PRODUCE DepID int, 
      DepName string, 
      HelloWorld string 
    USING new Demo.HelloWorldProcessor(); 

OUTPUT @departments 
    TO "/departments.tsv" 
    USING Outputters.Tsv(); 

Und hier ist der U-SQL-Prozessor UDO.

+0

Aber mit diesem Code wird nicht der mittlere Teil helloworld.txt für jeden gelesen die Abteilungen? Wenn helloworld 100mb + ist und das Parsing schwer ist, wird es sehr teuer sein? (Ich aktualisierte meine Frage mit mehr Informationen über diese Geo-IP-Datenbank) – viblo

+0

Gibt es auch eine Grenze für die Größe der bereitgestellten Ressourcen? In Azure Stream Analytics können die referenzierten Daten maximal 100 MB betragen, was für meinen Anwendungsfall nicht ausreicht. – viblo

+0

@viblo - Ich habe das Beispiel geändert, um mit einem UDO klarer zu sein. Es sollte nun offensichtlich sein, dass es nicht einmal pro Erreichungszeile liest und stattdessen einmal pro Vertex liest. – saveenr

Verwandte Themen