Вот как мы используем maxmind geoIP;
Мы помещаем файл GeoIPCity.dat
в облако и используем местоположение облака в качестве аргумента при запуске процесса.Код, в котором мы получаем файл GeoIPCity.data
и создаем новый LookupService
:
if (DistributedCache.getLocalCacheFiles(context.getConfiguration()) != null) {
List<Path> localFiles = Utility.arrayToList(DistributedCache.getLocalCacheFiles(context.getConfiguration()));
for (Path localFile : localFiles) {
if ((localFile.getName() != null) && (localFile.getName().equalsIgnoreCase("GeoIPCity.dat"))) {
m_geoipLookupService = new LookupService(new File(localFile.toUri().getPath()));
}
}
}
Вот сокращенная версия команды, которую мы используем для запуска нашего процесса
$HADOOP_HOME/bin/hadoop jar /usr/lib/COMPANY/analytics/libjars/MyJar.jar -files hdfs://PDHadoop1.corp.COMPANY.com:54310/data/geoip/GeoIPCity.dat -libjars /usr/lib/COMPANY/analytics/libjars/geoiplookup.jar
Важными компонентами этого для запуска компонента MindMax являются -files
и -libjars
.Это общие параметры в GenericOptionsParser .
-files <comma separated list of files> specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars> specify comma separated jar files to include in the classpath.
Я предполагаю, что Hadoop использует GenericOptionsParser
, потому что я могу найтинет ссылки на это нигде в моем проекте.:)
Если вы поместите GeoIPCity.dat
в контейнер и укажете его с помощью аргумента -files
, он будет помещен в локальный кеш, который затем может получить преобразователь в функции setup
.Это не обязательно должно быть в setup
, но должно быть сделано только один раз для каждого картографа, так что это отличное место для его размещения.Затем используйте аргумент -libjars
, чтобы указать geoiplookup.jar (или как вы его назвали), и он сможет его использовать.Мы не помещаем geoiplookup.jar в облако.Я катаюсь с предположением, что hadoop будет распределять банку так, как нужно.
Я надеюсь, что все имеет смысл.Я довольно хорошо знаком с hadoop / mapreduce, но я не писал фрагменты, использующие компонент maxmind geoip в проекте, поэтому мне пришлось немного покопаться, чтобы понять его достаточно хорошо, чтобы выполнить объяснение, которое я здесь привожу.
EDIT: дополнительное описание для файлов -files
и -libjars
. Аргумент files используется для распространения файлов через распределенный кэш Hadoop.В приведенном выше примере мы распространяем файл данных Max Mind Geo-IP через распределенный кэш Hadoop.Нам нужен доступ к файлу гео-IP-адресов Max Mind, чтобы сопоставить IP-адрес пользователя с соответствующей страной, регионом, городом, часовым поясом.API требует, чтобы файл данных присутствовал локально, что невозможно в распределенной среде обработки (нам не будет гарантировано, какие узлы в кластере будут обрабатывать данные).Для распространения соответствующих данных на узел обработки мы используем инфраструктуру распределенного кэша Hadoop.GenericOptionsParser и ToolRunner автоматически облегчают это, используя аргумент –file.Обратите внимание, что файл, который мы распространяем, должен быть доступен в облаке (HDFS).-libjars –libjars используется для распространения любых дополнительных зависимостей, необходимых для заданий map-Reduce.Как и файл данных, нам также необходимо скопировать зависимые библиотеки в узлы кластера, где будет выполняться задание.GenericOptionsParser и ToolRunner автоматически облегчают это, используя аргумент –libjars.