Muitos iniciantes do Hadoop provavelmente são iguais. Como não há recursos de máquina suficientes, só posso criar uma pseudo -distribuição do Hadoop instalada na máquina virtual. Então eu uso o Eclipse ou Intellij IDEA no Win7 para escrever testes de código. Portanto, a questão é: como enviar remotamente o mapa/reduzir as tarefas para a depuração remota do Hadoop e do ponto de interrupção no Win7?
1. Preparação
1.1 No Win7, encontre um diretório e descompacte o Hadoop-2.6.0. Neste artigo, d: /yangjm/code/study/hadoop/hadoop-2.6.0 (o seguinte é representado por $ hadoop_home)
1.2 Adicione várias variáveis de ambiente no 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
Além disso, a variável do caminho é anexada no final; %Hadoop_home%/bin
2. Depuração remota eclipse
1.1 Baixe o plugin Hadoop-Eclipse-Plugin
O Hadoop-Eclipse-Plugin é um plug-in Hadoop especialmente usado para o Eclipse, que pode visualizar o diretório e o conteúdo do arquivo de HDFs diretamente no ambiente IDE. Seu código-fonte está hospedado no Github e o endereço oficial do site é https://github.com/winghc/hadoop2x-eclipse-plugin
Se você estiver interessado, pode baixar o código -fonte e compilá -lo você mesmo. O Baidu levará muitos artigos, mas se você usar https://github.com/winghc/hadoop2x-eclipse-plugin/tree/master/release%20, várias versões compiladas são fornecidas aqui. Basta usá -lo diretamente. Copie o Hadoop-Eclipse-Plugin-2.6.6.0. Está tudo pronto.
1.2 Baixe o pacote de plug-in Hadoop2.6 para plataforma Windows64-bit (Hadoop.dll, winutils.exe)
Sob Hadoop-Common-Project/Hadoop-Common/SRC/Main/Winutils no código-fonte Hadoop2.6.0, existe um projeto vs.NET. Compilar este projeto pode obter esse grupo de arquivos e arquivos de saída.
hadoop.dll e winutils.exe são os mais úteis. Copie winutils.exe para o diretório $ hadoop_home/bin e copie o hadoop.dll para o diretório %windir %/system32 (principalmente para impedir que o plug-in relate vários erros inexplicáveis, como referências de objetos vazios).
Nota: Se você não quiser compilar, pode baixar diretamente o arquivo compilado Hadoop2.6 (x64) v0.2.rar
1.3 Configurando o plugin Hadoop-Eclipse-Plugin
Comece Eclipse, Windows-> Show View-> Outros
Window-> Preferências-> Hadoop Map/Reduce Especifique o diretório raiz do Hadoop no Win7 (ou seja: $ hadoop_home)
Em seguida, no painel Map/Reduce Locations, clique no ícone do elefante bebê
Adicione um local
Esta interface é muito importante. Vou explicar vários parâmetros:
O nome da localização é apenas um nome, basta chamar
MAP/Reduce (V2) Host Master Aqui está o endereço IP correspondente ao Hadoop Master na máquina virtual. A porta abaixo corresponde à porta especificada pelo atributo dfs.datanode.ipc.address em hdfs-site.xml
Porta mestre do DFS: a porta aqui corresponde à porta especificada por fs.defaultfs em Core-site.xml
O último nome de usuário deve ser o mesmo que o nome de usuário que executa o Hadoop na máquina virtual. Eu instalei e administrei o Hadoop 2.6.0 com o Hadoop, então preencha o Hadoop aqui. Se você o instalou com o Root, altere -o para enraizar de acordo.
Depois que esses parâmetros forem especificados, clique em Concluir e eclipse para saber como se conectar ao Hadoop. Se tudo correr bem, você poderá ver os diretórios e arquivos no HDFS no painel do Project Explorer.
Você pode clicar com o botão direito do mouse no arquivo e selecionar Excluir para experimentar. Geralmente, a primeira vez não é bem -sucedida e haverá muitas coisas. A idéia geral é que não há permissões insuficientes. O motivo é que o usuário atual de login do Win7 não é o usuário em execução do Hadoop na máquina virtual. Existem muitas soluções. Por exemplo, você pode criar um novo usuário do Hadoop Administrator no Win7 e depois mudar para o Hadoop para fazer login no Win7 e depois usar o Eclipse para se desenvolver. No entanto, isso é muito irritante, da maneira mais fácil:
Adicionado no hdfs-site.xml
<PROPTY> <name> dfs.permissions </name> <Value> false </value> </sition>
Então, na máquina virtual, execute hadoop dfsadmin -Safemode licença
Para estar seguro, outro Hadoop FS -Chmod 777 /
Em suma, é desligar completamente a detecção de segurança do Hadoop (não há necessidade de isso na fase de aprendizado, não faça isso quando for produzido oficialmente), finalmente reinicie o Hadoop, depois vá para o Eclipse e repetir a operação de arquivo de exclusão agora e tudo bem.
1.4 Criando um projeto de amostra WoldCount
Crie um novo projeto e selecione mapa/reduzir o projeto
Basta colocar em seguida no wodcount.java, o código é o seguinte:
pacote yjmyzz; importar java.io.ioException; importar java.util.stringTokenizer; importar org.apache.hadoop.conf.configuration; importar org.apache.hadoop.fs.path; importar org.apache.hadoop.io.intwritable; importação; org.apache.hadoop.mapreduce.job; importar org.apache.hadoop.mapreduce.mapper; importar org.apache.hadoop.mapreduce.reducer; importformat. org.apache.hadoop.util.genericOptionsParser; public class WordCount {public static class TokenizerMapper estende o mapeador <objeto, texto, texto, intwek> {private final estático intwitável = novo intwritable (1); palavra de texto privado = novo texto (); Public void map (chave do objeto, valor de texto, contexto de contexto) lança a ioException, interruptEdException {stringTokenizer itr = new StringTokenizer (value.toString ()); while (iTr.HasMORETOKENS ()) {word.set (iTR.NextToken ()); context.write (word, um); }}} classe estática pública IntsumredUcer estende o redutor <text, IntWritable, text, IntWritable> {Private Intwrity Result = new IntWritable (); public void Reduce (tecla de texto, valores iterable <intwitrity>, contexto de contexto) lança a ioException, interruptedException {int sum = 0; for (intwitrity val: valores) {sum += val.get (); } resultado.set (soma); context.write (chave, resultado); }} public static void main (string [] args) lança Exceção {Configuration conf = new Configuration (); String [] outrosargs = new GenericOptionsParser (conf, args) .getRemAllAldArgs (); if (outrosargs.length <2) {System.err.println ("Uso: WordCount <In> [<in> ...] <O out>"); System.Exit (2); } Job job = job.getInstance (conf, "contagem de palavras"); Job.setJarbyClass (WordCount.class); job.setMapPerClass (TokenizermApper.class); Job.SetCombinerclass (intsumredcer.class); Job.SetReduCerclass (intsumredcer.class); job.setOutputKeyClass (text.class); job.setOutputValuEclass (intwritable.class); for (int i = 0; i <outrosargs.length - 1; ++ i) {FileInputFormat.addinputPath (Job, novo caminho (outrosargs [i])); } FileOutputFormat.setOutputPath (Job, novo caminho (outrosargs [outrosargs.length - 1])); System.Exit (Job.WaitForCompletion (true)? 0: 1); }}Em seguida, coloque um log4j.properties, o conteúdo é o seguinte: (Para a conveniência da corrida, verifique várias saídas)
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.activeio.journal = Infolog4j.appender.stdout = org.apache.log4j.consoleppenderLog4j.appender.stdout.layout = org.apache.log4j.patternlayoutLog4j.apnder.stdout.Layout.conversionPnation %-5,5p | %-16.16t | %-32,32c {1} | %-32,32C %4L | %m%nA estrutura final do diretório é a seguinte:
Então você pode executá -lo, é claro que não terá sucesso, porque nenhum parâmetros é inserido para o WordCount, consulte a figura a seguir:
1.5 Defina parâmetros de operação
Como o WordCount é inserir um arquivo para contar palavras e depois sair para outra pasta; portanto, dê dois parâmetros, consulte a figura acima, insira os argumentos do programa
hdfs: //172.28.20.xxx: 9000/jimmy/input/readme.txt
hdfs: //172.28.20.xxx: 9000/jimmy/output/
Consulte isso para alterá -lo (substitua principalmente o IP pelo IP em sua máquina virtual). Observe que, se o arquivo de entrada/leitura.txt não o tiver, faça o upload manualmente primeiro e depois/output/não deverá existir. Caso contrário, se o programa chegar até o final e descobrir que o diretório de destino existir, será relatado um erro. Depois disso, você pode definir um ponto de interrupção na posição apropriada e finalmente depurar:
3. Intellij Idea Remote Debugging Hadoop
3.1 Crie um projeto Maven WordCount
O arquivo POM é o seguinte:
<? xml versão = "1.0" coding = "utf-8"?> <Projeto xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.ww3.org/2001/xmlschaMance xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <lodelversion> 4.0.0 </modelversion> <vroupId> yjmzzzzzzzzzzzzzzzzhzz> <Versão> 1.0-SNAPSHOT </Version> <Ependencies> <pendence> <puperid> org.apache.hadoop </groupiD> <ArtifactId> hadoop-common </sutifactId> <versão> 2.6.0 </versão> </dependency> <spendency> <purbumid> orgachepache.hadoop </groupid> <TRAFACTID> Hadoop-mapreduce-client-jobclient </stutifactId> <versão> 2.6.0 </version> </dependency> <pendence> <purbrougid> Commons-cli </proupiD> <stifactId> Commons-cli </Artifactid> <Versão> 1.2 </versão> </dependência> </dependências> </dependências> </sorfactid> <versão <FinalName> $ {Project.artifactId} </finalName> </fruct> </ject>A estrutura do projeto é a seguinte:
Clique com o botão direito do mouse no projeto -> Configurações de módulo aberto ou pressione F12 para abrir as propriedades do módulo
Adicionando referências de dependência
Em seguida, importe todos os pacotes correspondentes sob $ hadoop_home
O Libary importado pode ser nomeado, como Hadoop2.6
3.2 Definir parâmetros de operação
Nota dois lugares :
1 é regimes de programa, que são semelhantes aos eclipes, especificando arquivos de entrada e pastas de saída
2 está trabalhando diretório, ou seja, o diretório de trabalho, especificado como o diretório em que $ hadoop_home está localizado
Então você pode depurar
A única coisa infeliz sob Intellij é que não há plug -in Hadoop semelhante ao Eclipse. Toda vez que você executa o WordCount, você pode excluir manualmente o diretório de saída na linha de comando e depois depurar. Para resolver esse problema, você pode melhorar o código do WordCount e excluir o diretório de saída antes de executar, consulte o seguinte código:
pacote yjmyzz; importar java.io.ioException; importar java.util.stringTokenizer; importar org.apache.hadoop.conf.configuration; importar org.apache.hadoop.files.filesystem; importettty.hadoop.filed.hadache.Hilesystem; org.apache.hadoop.mapreduce.job; importar org.apache.hadoop.mapreduce.mapper; importar org.apache.hadoop.mapreduce.reducer; importformat. org.apache.hadoop.util.genericOptionsParser; public class WordCount {public static class TokenizerMapper estende o mapeador <objeto, texto, texto, intwek> {private final estático intwitável = novo intwritable (1); palavra de texto privado = novo texto (); Public void map (chave do objeto, valor de texto, contexto de contexto) lança a ioException, interruptEdException {stringTokenizer itr = new StringTokenizer (value.toString ()); while (iTr.HasMORETOKENS ()) {word.set (iTR.NextToken ()); context.write (word, um); }}} classe estática pública IntsumredUcer estende o redutor <text, IntWritable, text, IntWritable> {Private Intwrity Result = new IntWritable (); public void Reduce (tecla de texto, valores iterable <intwitrity>, contexto de contexto) lança a ioException, interruptedException {int sum = 0; for (intwitrity val: valores) {sum += val.get (); } resultado.set (soma); context.write (chave, resultado); }} / ** * Exclua o diretório especificado * * @param conf * @param dirpath * @throws ioexception * / private estático void DeLetedir (Configuration conf, string dirpath) lança ioexception {filesystem fs = filesystem.get (conf); Path TargetPath = novo caminho (Dirpath); if (fs.exists (TargetPath)) {boolean delResult = fs.Delete (TargetPath, true); if (DelResult) {System.out.println (TargetPath + "foi excluído com sucesso."); } else {System.out.println (TargetPath + "exclusão falhou."); }}} public static void main (string [] args) lança Exceção {Configuration conf = new Configuration (); String [] outrosargs = new GenericOptionsParser (conf, args) .getRemAllAldArgs (); if (outrosargs.length <2) {System.err.println ("Uso: WordCount <In> [<in> ...] <O out>"); System.Exit (2); } // Exclua o diretório de saída Primeiro Deletedir (conf, outrosargs [outrosargs.length - 1]); Trabalho job = job.getInstance (conf, "contagem de palavras"); Job.setJarbyClass (WordCount.class); job.setMapPerClass (TokenizermApper.class); Job.SetCombinerclass (intsumredcer.class); Job.SetReduCerclass (intsumredcer.class); job.setOutputKeyClass (text.class); job.setOutputValuEclass (intwritable.class); for (int i = 0; i <outrosargs.length - 1; ++ i) {FileInputFormat.addinputPath (Job, novo caminho (outrosargs [i])); } FileOutputFormat.setOutputPath (Job, novo caminho (outrosargs [outrosargs.length - 1])); System.Exit (Job.WaitForCompletion (true)? 0: 1); }} Mas isso não é suficiente. Ao executar no ambiente IDE, o IDE precisa saber a quais instância do HDFS se conectar (é como no desenvolvimento de dB, você precisa especificar o DataSource na configuração XML), copie o Core-site.xml sob $ hadoop_home/etc/hadoop para o diretório de recursos, semelhante ao seguinte:
O conteúdo é o seguinte:
<? xml versão = "1.0" coding = "utf-8"?> <? xml-stylesheet type = "text/xsl" href = "confguration.xsl"?
Basta substituir o IP acima pelo IP na máquina virtual.