Многие начинающие Hadoop, вероятно, одинаковы. Поскольку не хватает ресурсов машины, я могу только создать псевдо -распределение Hadoop, установленного на виртуальной машине. Затем я использую идею Eclipse или Intellij в Win7 для написания кодовых тестов. Таким образом, вопрос в том, как удаленно отправить задачи карты/уменьшить отладку отдаленной Hadoop и Breakpoint в Win7?
1. Подготовка
1.1 В Win7 найдите каталог и распаковывает Hadoop-2.6.0. В этой статье D: /yangjm/code/study/hadoop/hadoop-2.6.0 (следующее представлено $ hadoop_home)
1.2 Добавить несколько переменных среды в Win7
Hadoop_home = d: /yangjm/code/study/hadoop/hadoop-2.6.0
Hadoop_bin_path =%hadoop_home%/bin
Hadoop_prefix = d: /yangjm/code/study/hadoop/hadoop-2.6.0
Кроме того, переменная пути добавляется в конце; %Hadoop_home%/bin
2. Eclipse удаленная отладка
1.1 Скачать плагин Hadoop-Eclipse-Plugin
Hadoop-Eclipse-Plugin-это плагин Hadoop, специально используемый для Eclipse, который может просматривать каталог и содержание файлов HDFS непосредственно в среде IDE. Его исходный код размещен на GitHub, а официальный адрес веб-сайта-https://github.com/winghc/hadoop2x-clipse-plugin
Если вы заинтересованы, вы можете скачать исходный код и скомпилировать его самостоятельно. Baidu возьмет много статей, но если вы просто используете https://github.com/winghc/hadoop2x-eclipse-plugin/tree/master/release%20, здесь представлены различные скомпилированные версии. Просто используйте его напрямую. Скопируйте загруженную Hadoop-Eclipse-Plugin-2.6.0.jar в каталог Eclipse/Plugins, а затем перезапустите Eclipse. Все сделано.
1.2 Загрузите плагированный пакет Hadoop2.6 для платформы Windows64-Bit (hadoop.dll, winutils.exe)
При Hadoop-Common-Project/Hadoop-Common/SRC/Main/Winutils в исходном коде Hadoop2.6.0, существует проект VS.NET. Скомпилирование этого проекта может получить эту кучу файлов и выходных файлов.
Hadoop.dll и winutils.exe являются наиболее полезными. Скопируйте winutils.exe в каталог $ hadoop_home/bin и копируйте Hadoop.dll в каталог %Windir %/System32 (в основном, чтобы не допустить сообщать о различных необъяснимых ошибках, таких как ссылки на пустые объекты).
ПРИМЕЧАНИЕ. Если вы не хотите компилировать, вы можете напрямую загружать скомпилированный файл Hadoop2.6 (x64) v0.2.rar
1.3 Настройка плагина Hadoop-Eclipse-Plugin
Start Eclipse, Windows-> Show View-> Другое
Window-> Preferences-> Hadoop Map/Crement Укажите корневой каталог Hadoop на Win7 (т.е. $ hadoop_home)
Затем на панели «Карта/уменьшение местоположения» нажмите на значок ребенка слона
Добавьте место
Этот интерфейс очень важен. Я объясню несколько параметров:
Имя местоположения - это просто имя, просто назовите его
MAP/REMUT (V2) Master Host Здесь - IP -адрес, соответствующий мастеру Hadoop в виртуальной машине. Приведенный ниже порт соответствует порту, указанному атрибутом dfs.datanode.ipc.address в hdfs-site.xml
Главный порт DFS: порт здесь соответствует порту, указанному FS.Defaultfs в Core-site.xml
Последнее имя пользователя должно быть таким же, как и имя пользователя, которое запускает Hadoop в виртуальной машине. Я установил и запустил Hadoop 2.6.0 с Hadoop, так что заполните Hadoop здесь. Если вы установили его с корнем, измените его на root соответственно.
После того, как эти параметры указаны, нажмите «Закончить» и затмить, чтобы узнать, как подключиться к Hadoop. Если все идет хорошо, вы можете увидеть каталоги и файлы в HDFS на панели Project Explorer.
Вы можете щелкнуть правой кнопкой мыши в файле и выбрать Delete, чтобы попробовать. Обычно первый раз неудачный, и будет много вещей. Общая идея заключается в том, что есть недостаточные разрешения. Причина в том, что текущий пользователь входа в Win7 не является работающим пользователем Hadoop в виртуальной машине. Есть много решений. Например, вы можете создать нового пользователя администратора Hadoop на Win7, а затем переключиться на Hadoop, чтобы войти в Win7, а затем использовать Eclipse для разработки. Однако это слишком раздражает, самый простой способ:
Добавлено в hdfs-site.xml
<свойство> <mame> dfs.permissions </name> <dather> false </value> </property>
Затем в виртуальной машине запустите hadoop dfsadmin -safemode
Чтобы быть в безопасности, другой Hadoop Fs -Chmod 777 /
Короче говоря, он должен полностью отключить обнаружение безопасности Hadoop (на этапе обучения нет необходимости, не делайте этого, когда он официально произведен), наконец -то перезапустите Hadoop, затем перейдите в Eclipse и повторите операцию Delete File только сейчас, и все должно быть в порядке.
1.4 Создание проекта образца WoldCount
Создайте новый проект и выберите Project Map/уменьшить
Просто поставьте дальше на wodcount.java, код заключается в следующем:
Пакет yjmyzz; импорт java.io.ioexception; import java.util.stringtokenizer; импорт org.apache.hadoop.conf.configuration; импорт org.apache.hadoop.fs.path; импорт org.apache.hadoop.io.intwrite; org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.reducer; import org.apache.hadoop.mapreduce.lib.input.fileinputformat; импорт org.apache.hadoop.mapreduce.lib.utput.FileOutputformat; org.apache.hadoop.util.genericoptionsparser; открытый класс WordCount {public Static Tokenizermapper Extends <объект, текст, текст, Intrable> {private final Static intraitable one = new Intrable (1); Приватный текстовый слово = new Text (); public void Map (ключ объекта, значение текста, контекст контекста), прозывая ioException, прерывание Exception {stringTokenizer itr = new StringTokenizer (value.toString ()); while (itr.hasmoretokens ()) {word.set (itr.nexttoken ()); context.write (слово, один); }}} public static class intsumreducer расширяет Reducer <текст, Intwrable, Text, Intwrable> {Private Intwraite Result = new Intwritable (); public void уменьшить (текстовый ключ, итерабильный <Intwrable> Значения, контекст контекста) бросает ioException, прерывание Extexception {int sum = 0; for (intwrable al: values) {sum += val.get (); } result.set (sum); context.write (ключ, результат); }} public static void main (string [] args) бросает исключение {configuration conf = new Configuration (); String [] orethargs = new genericoptionsparser (conf, args) .getremainingArgs (); if (oreArgs.length <2) {System.err.println ("Использование: WordCount <in> [<in> ...] <up>"); System.Exit (2); } Job job = abob.getInstance (conf, "count"); job.setjarbyclass (wordcount.class); job.setmapperclass (tokenizermapper.class); job.setCombinerclass (intsumreducer.class); job.setreducerclass (intsumreducer.class); job.setOutputKeyClass (text.class); job.setOutputValueClass (Intwriteble.class); for (int i = 0; i <otherArgs.length - 1; ++ i) {fileInputFormat.AddInputPath (job, новый путь (другие Args [i])); } FileOutputFormat.SetOutPutPath (задание, новый путь (другие Args [otherArgs.length - 1])); System.Exit (abob.WaitForComplotion (true)? 0: 1); }}Затем поместите log4j.properties, контент заключается в следующем: (для удобства работы проверьте различные выходы)
log4j.rootlogger = info, stdout#log4j.logger.org.springframework = info#log4j.logger.org.apache.activemq = info#log4j.logger.org.apache. ActiveMq.spring = warn#log4j.logger.org.apache.activemq.store.journal = info#log4j.logger.org.apache.activemq.or g.active.journal = infolog4j.appender.stdout = org.apache.log4j.consoleappenderlog4j.appender.stdout.layout = org.apache.log4j.patternlayoutlog4j.appender.stdout.layout.conversionpattern =%d {Ablsout} | %-5,5p | %-16.16t | %-32.32c {1} | %-32,32C %4L | %m%nОкончательная структура каталога заключается в следующем:
Затем вы можете запустить его, конечно, это не удастся, потому что для WordCount не будет введено никаких параметров, см. Следующий рисунок:
1.5 Установить параметры работы
Поскольку WordCount должен ввести файл для подсчета слов, а затем вывести в другую папку, поэтому дайте два параметра, см. Приведенный выше рисунок, введите аргументы в программе
HDFS: //172.28.20.xxx: 9000/jimmy/input/readme.txt
HDFS: //172.28.20.xxx: 9000/jimmy/output/
Пожалуйста, обратитесь к этому, чтобы изменить его (в основном замените IP на IP на вашей виртуальной машине). Обратите внимание, что если в файле input/readm.txt его нет, сначала загрузите его вручную, а затем/вывод/не должен существовать. В противном случае, если программа работает до конца и обнаруживает, что целевой каталог существует, сообщается об ошибке. После этого вы можете установить точку останова в соответствующей позиции, и вы, наконец, можете отладить ее:
3. Intellij Idea Отдаленная отладка Hadoop
3.1 Создать проект Maven WordCount
POM -файл выглядит следующим образом:
<? xml version = "1.0" Encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <doliderversion> 4.0.0 </modelversion> <groupid> yjmyzz </GroupId> <sersion> 1.0-snapshot </version> <dependencies> <dependency> <groupid> org.apache.hadoop </GroupId> <artifactid> Hadoop-common </artifactid> <sersive> 2.6.0 </version> </depertive> <dependency> <groupid> org.apache.hadoop </version> <Artifactid> hadoop-mapreduce-client-jobclient </artifactid> <sersion> 2.6.0 </version> </depertive> <deyedency> <groupid> commons-cli </groupid> <artifactid> commons-cli </artifactid> <serse> 1.2 </version> </repertive> </repertive> <buld> <finalName> $ {project.artifactid} </finalName> </build> </project>Структура проекта заключается в следующем:
Щелкните правой кнопкой мыши по проекту -> Открыть настройки модуля или нажмите F12, чтобы открыть свойства модуля
Добавление зависимости Libary ссылки
Затем импортируйте все соответствующие пакеты под $ hadoop_home
Импортируемая Ливина может быть названа, например, Hadoop2.6
3.2 Установите параметры работы
Обратите внимание на два места :
1 - это программные режимы, которые аналогичны Eclipes, указание входных файлов и выходных папок
2 - это рабочий каталог, то есть рабочий каталог, указанный как каталог, в котором находится $ hadoop_home
Тогда вы можете отлаживать
Единственная вещь, которая недоволен IntelliJ, - это то, что нет плагина Hadoop, подобного Eclipse. Каждый раз, когда вы запускаете WordCount, вы можете только вручную удалять выходной каталог в командной строке, а затем отладку. Чтобы решить эту проблему, вы можете улучшить код WordCount и удалить выходной каталог перед запуском, см. Следующий код:
Пакет yjmyzz; импорт java.io.ioexception; import java.util.stringtokenizer; импорт org.apache.hadoop.conf.configuration; импорт org.apache.hadoop.fs.filesystem; import org.apache.hadoop.fs.path; import orgache.io.iu org.apache.hadoop.mapreduce.job; import org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.reducer; import org.apache.hadoop.mapreduce.lib.input.fileinputformatformat; importmportibretamportautmentaRatformatformat; org.apache.hadoop.util.genericoptionsparser; открытый класс WordCount {public Static Tokenizermapper Extends <объект, текст, текст, Intrable> {private final Static intraitable one = new Intrable (1); Приватный текстовый слово = new Text (); public void Map (ключ объекта, значение текста, контекст контекста), прозывая ioException, прерывание Exception {stringTokenizer itr = new StringTokenizer (value.toString ()); while (itr.hasmoretokens ()) {word.set (itr.nexttoken ()); context.write (слово, один); }}} public static class intsumreducer расширяет Reducer <текст, Intwrable, Text, Intwrable> {Private Intwraite Result = new Intwritable (); public void уменьшить (текстовый ключ, итерабильный <Intwrable> Значения, контекст контекста) бросает ioException, прерывание Extexception {int sum = 0; for (intwrable al: values) {sum += val.get (); } result.set (sum); context.write (ключ, результат); }} / ** * Удалить указанный каталог * * @param conf * @param dirpath * @throws ioexception * / private static void letetedir (configuration conf, string dirpath) бросает ioexception {fileystem fs = filesystem.get (conf); PATH TARGETPATH = новый путь (DIRPATH); if (fs.exists (targetpath)) {boolean delresult = fs.delete (targetpath, true); if (delresult) {System.out.println (TargetPath + "был удален успешно."); } else {System.out.println (TargetPath + "Удаление не удалось."); }}} public static void main (string [] args) бросает исключение {configuration conf = new Configuration (); String [] orethargs = new genericoptionsparser (conf, args) .getremainingArgs (); if (oreArgs.length <2) {System.err.println ("Использование: WordCount <in> [<in> ...] <up>"); System.Exit (2); } // Удалить выходной каталог First DeletEdIr (conf, другие аргии [otherargs.length - 1]); Job job = job.getinstance (conf, "count"); job.setjarbyclass (wordcount.class); job.setmapperclass (tokenizermapper.class); job.setCombinerclass (intsumreducer.class); job.setreducerclass (intsumreducer.class); job.setOutputKeyClass (text.class); job.setOutputValueClass (Intwriteble.class); for (int i = 0; i <otherArgs.length - 1; ++ i) {fileInputFormat.AddInputPath (job, новый путь (другие Args [i])); } FileOutputFormat.SetOutPutPath (задание, новый путь (другие Args [otherArgs.length - 1])); System.Exit (abob.WaitForComplotion (true)? 0: 1); }} Но этого недостаточно. При запуске в среде IDE IDE необходимо знать, к какому экземпляру HDFS подключиться (он похож на разработку DB, вам необходимо указать DataSource в конфигурации XML), скопировать основной сайт.
Содержимое следующее:
<? xml version = "1.0" Encoding = "UTF-8"?> <? XML-Stylesheet Type = "text/xsl" href = "configuration.xsl"?> <configuration> <property> <mame> fs.defaultfs </name> <value> hdfs: //172.28.20.20.2.
Просто замените IP выше на IP на виртуальной машине.