#memory #hadoop #mapreduce #compare #overflow
#память #hadoop #mapreduce #Сравнить #переполнение
Вопрос:
Я пытаюсь сделать следующее в hadoop map / reduce (написанном на java, ОС ядра Linux)
-
Текстовые файлы «правила-1» и «правила-2» (общим размером 3 ГБ) содержат некоторые правила, каждое правило разделено символом конца строки, поэтому файлы могут быть прочитаны с помощью функции readLine().
-
Эти файлы ‘rules-1’ и ‘rules-2’ необходимо импортировать целиком из hdfs в каждую функцию map в моем кластере, т.е. эти файлы не могут быть разделены на разные функции map.
-
Входными данными для функции map картографа является текстовый файл под названием ‘record’ (каждая строка заканчивается символом конца строки), поэтому из файла ‘record’ мы получаем пару (ключ, значение). Файл может быть разделен и может быть предоставлен в качестве входных данных для другой функции map, используемой во всем процессе map / reduce.
-
Что нужно сделать, так это сравнить каждое значение (т. Е. строки из файла записи) с правилами внутри ‘rules-1’ и ‘rules-2’
Проблема в том, что если я извлекаю каждую строку файлов rules-1 и rules-2 в статический список массивов только один раз, чтобы каждый картограф мог использовать один и тот же arraylint и пытаться сравнить элементы в списке массивов с каждым входным значением из файла записи, я получаю ошибку переполнения памяти, поскольку в списке массивов одновременно не может быть сохранено 3 ГБ.
В качестве альтернативы, если я одновременно импортирую только несколько строк из файлов rules-1 и rules-2 и сравниваю их с каждым значением, map / reduce отнимает много времени для завершения своей работы.
Не могли бы вы, ребята, предоставить мне какие-либо другие альтернативные идеи, как это можно сделать без ошибки переполнения памяти? Поможет ли это, если я помещу эти file-1 и file-2 в базу данных, поддерживающую hdfs, или что-то в этомроде? На самом деле у меня заканчиваются идеи.Был бы очень признателен, если бы кто-нибудь из вас, ребята, мог предоставить мне свои ценные предложения.
Комментарии:
1. Не совсем ясно, что именно вам нужно сделать. Что вы подразумеваете под «сравнением каждого значения»? Каков результат этого сравнения? Вы просто пытаетесь запустить команду Linux «diff» для двух файлов в Hadoop? Имеют ли оба файла одинаковое количество строк?
2. Под «сравнением каждого значения» я подразумеваю сравнение каждой строки во входном файле ‘record’ с каждой строкой файлов ‘rules-1’ и ‘rules-2’. Нет, в файлах ‘rules-1’, ‘rules-2’ и ‘record’ разное количество строк.
Ответ №1:
Если входные файлы небольшие — вы можете загрузить их в статические переменные и использовать правила в качестве входных данных.
Если вышесказанное не соответствует действительности, я могу предложить следующие способы:
а) Присвоить правилам 1 и правилу 2 высокий коэффициент репликации, близкий к количеству имеющихся у вас узлов. Тогда вы сможете относительно эффективно считывать из HDFS rule= 1 и rule-2 для каждой записи во входных данных — потому что это будет последовательное чтение из локального datanode.
б) Если вы можете рассмотреть некоторую хэш-функцию, которая при применении к правилу и к входной строке будет предсказывать без ложных отрицаний, что они могут совпадать — тогда вы можете использовать этот хэш для правил, входной записи и разрешить все возможные совпадения в редукторе. Это будет очень похоже на то, как выполняется объединение с использованием MR
c) Я бы рассмотрел некоторые другие методы оптимизации, такие как построение деревьев поиска или сортировка, поскольку в противном случае проблема выглядит дорогостоящей с точки зрения вычислений и займет целую вечность…
Комментарии:
1. Ваши предложения действительно интересны, я обязательно попробую их, давайте посмотрим, что я могу сделать. Большое вам спасибо!.
Ответ №2:
На этой странице найдите конфигурации кластеров в реальном мире, это будет касаться конфигурации размера файла
Ответ №3:
Вы могли бы использовать параметр «mapred.child.java.opts» в conf/mapred-site.xml чтобы увеличить объем памяти для ваших картографов. Возможно, вам не удастся запустить столько слотов для карт на сервер, но с большим количеством серверов в вашем кластере вы все равно сможете распараллелить свою работу.
Комментарии:
1. Спасибо, но я уже пробовал это. Более того, у меня 32-битные машины
Ответ №4:
Прочитайте текстовый файл содержимого из функции MapReduce и прочитайте текстовый файл ключевого слова из функции mapper (для чтения ваших HDFS) и разделите, используя значение StringTokenizer.Для чтения строки из MapReduce и в вашей функции mapper напишите код текстового файла чтения HDFS, он будет считываться построчно, поэтому используйте два цикла while для сравнения. Всякий раз, когда вам нужны данные, отправляйте их в reducer.
Ответ №5:
Разделите текстовый файл объемом 3 ГБ на несколько текстовых файлов и примените все текстовые файлы как обычно MapReduce
в вашей предыдущей программе.
Для разделения текстового файла я написал Java-программу, и вы сами решаете, сколько строк вы хотите записать в каждый текстовый файл.