Сопоставление IP-адреса с местоположением с помощью аналитики озера данных Azure

У меня есть много файлов avro с IP-адресами (веб-блоги), хранящимися в больших двоичных объектах Azure. Я хотел бы сопоставить IP с местоположением. Как это сделать с помощью Azure Data Lake Analytics (ADLA)?

Прямо сейчас у меня есть искровое задание, которое использует базу данных Maxmind IP с java-библиотекой, которая считывает большой файл .mmdb размером 113 МБ со всеми данными об IP-местоположении для выполнения этого поиска. Сейчас я изучаю, возможно ли передать эту работу в ADLA.

Maxmind также предоставляет библиотеку C#, так что с этой частью проблем не возникнет. Однако для меня не очевидно, как обращаться с этим большим файлом mmdb, который нужно прочитать, а затем использовать для поиска. Очевидно, было бы не так быстро читать файл для каждого поиска IP. Как это (и подобные случаи) может быть обработано с помощью ADLA, или ADLA не подходит для таких операций?

Если бы у меня была запущена обычная программа, я бы сделал поиск следующим образом:

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

База данных maxmind доступна здесь: https://dev.maxmind.com/geoip/geoip2/downloadable/ (обратите внимание, что я купил базу данных, которую сейчас использую) и библиотеку c#, чтобы прочитать ее здесь: https://github.com/maxmind/MaxMind-DB-Reader-dotnet


person viblo    schedule 10.07.2017    source источник
comment
Честно говоря, это звучит как простая операция с базой данных — соединение, также известное как поиск, но я ничего не знаю о данных Maxmind. Можете ли вы рассказать нам больше? например, вы заплатили и загрузили файл?   -  person wBob    schedule 10.07.2017
comment
Немного расширил ответ тем, как база данных будет использоваться в обычной программе командной строки.   -  person viblo    schedule 10.07.2017
comment
Рассматривали ли вы возможность использования таблицы ADLA для хранения большого файла, а затем использовать ее как таблицу поиска? Вы можете присоединить свой входной файл непосредственно к таблице ADLA на основе IP-адреса (при условии, что они имеют одинаковый формат), аналогично поиску естественного ключа.   -  person jatal    schedule 12.02.2018
comment
Не совсем. Я думаю, что тогда мне нужно будет заново реализовать программу чтения db из MaxMind, а также получить очень плохую производительность по сравнению с оптимизированным поиском, который обеспечивает формат файла mmdb. (Тем не менее, я уже перешел к обычному веб-заданию, читающему/записывающему события в концентраторы событий, чтобы выполнить сопоставление, поэтому я не исследовал дополнительные варианты ADLA для этого случая)   -  person viblo    schedule 13.02.2018


Ответы (1)


Для этой цели можно использовать оператор U-SQL DEPLOY RESOURCE и UDO.

Во-первых, файл необходимо загрузить в хранилище datalake. Затем используйте DEPLOY RESOURCE, чтобы указать системе U-SQL скопировать этот файл в каждую вершину, где выполняется скрипт. Затем ваш скрипт использует код C# для чтения файла.

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();

А вот UDO процессора U-SQL.

using Microsoft.Analytics.Interfaces;
using Microsoft.Analytics.Types.Sql;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace Demo
{
    [SqlUserDefinedProcessor]
    public class HelloWorldProcessor : IProcessor
    {
        private string hw;

        public HelloWorldProcessor()
        {
            this.hw = System.IO.File.ReadAllText("helloworld.txt");
        }

        public override IRow Process(IRow input, IUpdatableRow output)
        {
            output.Set<int>("DepID", input.Get<int>("DepID"));
            output.Set<string>("DepName", input.Get<string>("DepName"));
            output.Set<string>("HelloWorld", hw);
            return output.AsReadOnly();
        }
    }
}
person saveenr    schedule 10.07.2017
comment
Но с этим кодом не будет ли средняя часть читать helloworld.txt для каждого из отделов? Если helloworld весит 100 МБ+ и его парсинг тяжелый, это будет очень дорого? (Я обновил свой вопрос, добавив дополнительную информацию об этой базе данных гео-ip) - person viblo; 10.07.2017
comment
Кроме того, есть ли ограничения на размер развернутых ресурсов? В Azure Stream Analytics ссылочные данные могут иметь максимальный размер 100 МБ, что недостаточно для моего варианта использования. - person viblo; 10.07.2017
comment
@viblo - я изменил пример, чтобы сделать его более понятным с UDO. Теперь должно быть очевидно, что он считывает не один раз для каждой строки охвата, а один раз для каждой вершины. - person saveenr; 10.07.2017