Muchos principiantes de Hadoop probablemente son los mismos. Dado que no hay suficientes recursos de la máquina, solo puedo crear una pseudo distribución de Hadoop instalada en la máquina virtual. Luego uso Eclipse o IntelliJ Idea en Win7 para escribir pruebas de código. Entonces, la pregunta es, ¿cómo enviar de forma remota/reducir las tareas a la depuración remota de Hadoop y Breakpoint en Win7?
1. Preparación
1.1 En Win7, encuentre un directorio y descomprima Hadoop-2.6.0. En este artículo, d: /yangjm/code/study/hadoop/hadoop-2.6.0 (lo siguiente está representado por $ hadoop_home)
1.2 Agregue varias variables de entorno en 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
Además, la variable de ruta se adjunta al final; %Hadoop_home%/bin
2. Eclipse Remote Depurging
1.1 Descargar complemento Hadoop-Eclipse-Plugin
Hadoop-Eclipse-Plugin es un complemento Hadoop especialmente utilizado para Eclipse, que puede ver el directorio y el contenido de archivo de HDFS directamente en el entorno IDE. Su código fuente está alojado en GitHub, y la dirección oficial del sitio web es https://github.com/winghc/hadoop2x-eclipse-plugin
Si está interesado, puede descargar el código fuente y compilarlo usted mismo. Baidu tomará muchos artículos, pero si solo usa https://github.com/winghc/hadoop2x-eclipse-plugin/tree/master/release%20, se proporcionan varias versiones compiladas aquí. Solo úsalo directamente. Copie el Hadoop-Eclipse-Plugin-2.6.0.0.0.Jar descargado al directorio Eclipse/Plugins, y luego reinicie Eclipse. Todo está hecho.
1.2 Descargue el paquete de complemento Hadoop2.6 para la plataforma Windows64-bit (hadoop.dll, winutils.exe)
Bajo Hadoop-Common-Project/Hadoop-Common/Src/Main/Winutils en el código fuente Hadoop2.6.0, hay un proyecto VS.NET. Compilar este proyecto puede obtener este montón de archivos y archivos de salida.
hadoop.dll y winutil.exe son los más útiles. Copie WinUtils.exe al directorio $ Hadoop_home/bin, y copie hadoop.dll al directorio %windir %/system32 (principalmente para evitar que el complemento reporte varios errores inexplicables, como referencias de objetos vacíos).
Nota: Si no desea compilar, puede descargar directamente el archivo compilado Hadoop2.6 (x64) v0.2.Rar
1.3 Configuración del complemento Hadoop-Eclipse-Plugin
Iniciar Eclipse, Windows-> Show View-> Otro
Window-> Preferencias-> Hadoop Map/Reduce Especifique el directorio raíz de Hadoop en Win7 (es decir: $ Hadoop_home)
Luego, en el panel de ubicaciones map/reducción, haga clic en el icono de elefante bebé
Agregar una ubicación
Esta interfaz es muy importante. Explicaré varios parámetros:
El nombre de la ubicación es solo un nombre, solo llámalo
MAP/REDUCT (V2) Host Master aquí es la dirección IP correspondiente al Hadoop Master en la máquina virtual. El puerto a continuación corresponde al puerto especificado por el atributo dfs.datanode.ipc.Address en HDFS-Site.xml
Puerto maestro DFS: el puerto corresponde aquí al puerto especificado por Fs.defaultfs en Core-Site.xml
El último nombre de usuario debe ser el mismo que el nombre de usuario que ejecuta Hadoop en la máquina virtual. Instalé y ejecuté Hadoop 2.6.0 con Hadoop, así que complete Hadoop aquí. Si lo instaló con raíz, cámbielo a raíz en consecuencia.
Después de especificar estos parámetros, haga clic en Finalizar y eclipse para saber cómo conectarse a Hadoop. Si todo va bien, puede ver los directorios y archivos en HDFS en el Panel de Explorador del Proyecto.
Puede hacer clic derecho en el archivo y seleccionar Eliminar para probar. Por lo general, la primera vez no tiene éxito, y habrá muchas cosas. La idea general es que no hay permisos suficientes. La razón es que el usuario actual de inicio de sesión de Win7 no es el usuario en ejecución de Hadoop en la máquina virtual. Hay muchas soluciones. Por ejemplo, puede crear un nuevo usuario de administrador de Hadoop en Win7, luego cambiar a Hadoop para iniciar sesión en Win7 y luego usar Eclipse para desarrollar. Sin embargo, esta es demasiado molesta, la forma más fácil:
Agregado en hdfs-site.xml
<Property> <name> dfs.permissions </name> <alon valor> falso </value> </property>
Luego, en la máquina virtual, ejecute Hadoop dfsadmin -safemode deja
Para estar a salvo, otro Hadoop FS -Chmod 777 /
En resumen, es apagar por completo la detección de seguridad de Hadoop (no hay necesidad de estos en la etapa de aprendizaje, no haga esto cuando se produce oficialmente), finalmente reinicie Hadoop, luego vaya a Eclipse y repita la operación del archivo de eliminación en este momento, y debería estar bien.
1.4 Creación de un proyecto de muestra WoldCount
Cree un nuevo proyecto y seleccione Map/reduzca el proyecto
Simplemente coloque el siguiente en wodcount.java, el código es el siguiente:
paquete yjmyzz; import java.io.ioException; import java.util.stringtokenizer; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.path; importar org.apache.hadoop.io.intwrituckitable; import org.apache.hadoop.mapreduce.job; importar org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.reducer; import org.apache.hadoop.mapreduce.lib.input.fileinformat; importar org.apache.hadoop.mapreduce org.apache.hadoop.util.genericOptionsParser; public class WordCount {public static class tokenizermapper extiende mapper <objeto, texto, texto, intwritable> {private final static intwritable one = new intwritable (1); Palabra de texto privado = nuevo texto (); Public void Map (clave de objeto, valor de texto, contexto de contexto) lanza ioexception, interruptedException {stringTokenizer ITR = new StringTokenizer (value.ToString ()); while (itr.hasmoretokens ()) {word.set (itr.nextToken ()); context.write (palabra, uno); }}} clase pública de clase estática intsumeducer extiende reductor <text, intwritable, text, intwritable> {private intwritable resultado = new intwritable (); Public void Reduce (clave de texto, iterable <intwritable> valores, contexto de contexto) arroja ioexception, interruptedException {int sum = 0; for (intwritable val: valores) {sum += val.get (); } resultado.set (suma); context.write (clave, resultado); }} public static void main (string [] args) lanza la excepción {Configuration conf = new Configuration (); String [] OTROArGS = new GenericOptionsParser (conf, args) .getRemainSargs (); if (otherArgs.length <2) {System.err.println ("Usage: WordCount <in> [<in> ...] <aut>"); System.exit (2); } Trabajo de trabajo = Job.GetInstance (conf, "Recuento de palabras"); Job.SetJarbyClass (WordCount.Class); Job.SetMapperClass (tokenizermapper.class); Job.SetCombinLass (intsumeducer.class); Job.SetEducerClass (intsumeducer.class); Job.SetOutputKeyClass (text.class); Job.SetOutputValuecLass (intwritable.class); for (int i = 0; i <otherargs.length - 1; ++ i) {fileInputFormat.addinputPath (trabajo, nueva ruta (otherargs [i])); } FileOutputFormat.SetOutputPath (trabajo, nueva ruta (otener [otherargs.length - 1])); System.exit (Job.WaitForCompletion (verdadero)? 0: 1); }}Luego, coloque un log4j.properties, el contenido es el siguiente: (Para la conveniencia de ejecutar, verifique varias salidas)
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.appender.stdout.layout.conversionpattern =%d {absoluto} | %-5.5p | %-16.16t | %-32.32c {1} | %-32.32c %4L | %MinnesotaLa estructura final del directorio es la siguiente:
Entonces puede ejecutarlo, por supuesto que no tendrá éxito, porque no se ingresan parámetros para el contenido de Word, consulte la siguiente figura:
1.5 Establecer parámetros de operación
Porque WordCount es ingresar un archivo para contar palabras y luego emitir a otra carpeta, así que dar dos parámetros, consulte la figura anterior, ingrese en los argumentos del programa
hdfs: //172.28.20.xxx: 9000/jimmy/input/readme.txt
hdfs: //172.28.20.xxx: 9000/jimmy/output/
Consulte esto para cambiarlo (reemplace principalmente la IP con la IP en su máquina virtual). Tenga en cuenta que si el archivo de entrada/lectura. De lo contrario, si el programa se ejecuta hasta el final y encuentra que el directorio de destino existe, se informará un error. Después de esto, puede establecer un punto de interrupción en la posición apropiada y finalmente puede depurarlo:
3. Idea de IntelliJ de depuración remota Hadoop
3.1 Crear un proyecto Maven WordCount
El archivo POM es el siguiente:
<? xml versión = "1.0" encoding = "utf-8"?> <Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschemainstance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion> 4.0.0 </modelversion> <grupo> yjmyzz </groupid> <artifactid> <versión> 1.0-snapshot </versión> <pendencies> <pendency> <grupid> org.apache.hadoop </groupid> <artifactid> hadoop-common </arfactid> <version> 2.6.0 </versión> </pendency> <pendency> <uproupid> org.apache.hadoop </proupid> <AtifactId> Hadoop-Mapreduce-Client-Jobclient </artifactid> <versión> 2.6.0 </versión> </pendency> <pendency> <MoupROUD> Commons-Cli </groupid> <artifactid> commons-cli </artifactid> <versión> 1.2 </sersion> </dependencia> </dependencias> <11 construcciones> <FinalName> $ {Project.ArtifactId} </finalName> </build> </proyecto>La estructura del proyecto es la siguiente:
Haga clic con el botón derecho en el proyecto -> Abra la configuración del módulo o presione F12 para abrir las propiedades del módulo
Agregar referencias de Library de dependencia
Luego importe todos los paquetes correspondientes bajo $ hadoop_home
Se puede nombrar la liberación importada, como Hadoop2.6
3.2 Establecer parámetros de operación
Nota dos lugares :
1 es regímenes de programa, que son similares a los eclipes, especificando archivos de entrada y carpetas de salida
2 es el directorio de trabajo, es decir, el directorio de trabajo, especificado como el directorio donde se encuentra $ hadoop_home
Entonces puedes depurar
Lo único que es infeliz bajo IntelliJ es que no hay un complemento Hadoop similar al eclipse. Cada vez que ejecuta WordCount, solo puede eliminar manualmente el directorio de salida en la línea de comando y luego depurar. Para resolver este problema, puede mejorar el código de cuenta de Word y eliminar el directorio de salida antes de ejecutar, consulte el siguiente código:
paquete yjmyzz; import java.io.ioException; import java.util.stringtokenizer; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.filesystem; import org.apache.hadoop.fs.path; import org.apache.io.intwritable; import org.apache.hadoop.io.text; import org.apache.hadoop.mapreduce.job; import org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.reducer; import.apache.hadoop.mapreduce.lib.inputputformat; importación; import org.apache.hadoop.mapreduce.lib.output.fileOutputFormat; import org.apache.hadoop.util.genericOptionsParser; public class WordCount {public static class tokenizenZapper extiende mApper <Object, texto, texto, intcrito> {Private Final Final Incritable One = NEW INTWITATION (1); Palabra de texto privado = nuevo texto (); Public void Map (clave de objeto, valor de texto, contexto de contexto) lanza ioexception, interruptedException {stringTokenizer ITR = new StringTokenizer (value.ToString ()); while (itr.hasmoretokens ()) {word.set (itr.nextToken ()); context.write (palabra, uno); }}} clase pública de clase estática intsumeducer extiende reductor <text, intwritable, text, intwritable> {private intwritable resultado = new intwritable (); Public void Reduce (clave de texto, iterable <intwritable> valores, contexto de contexto) arroja ioexception, interruptedException {int sum = 0; for (intwritable val: valores) {sum += val.get (); } resultado.set (suma); context.write (clave, resultado); }} / ** * Elimine el directorio especificado * * @param conf * @param dirpath * @throws ioexception * / private static void deletedir (configuración conf, string dirpath) lanza ioexception {filessystem fs = filesystem.get (conf); Ruta TargetPath = nueva ruta (dirpath); if (fs.exists (TargetPath)) {boolean delresult = fs.delete (TargetPath, true); if (delresult) {system.out.println (TargetPath + "se ha eliminado con éxito"); } else {System.out.println (TargetPath + "Falló de eliminación"); }}} public static void main (string [] args) lanza excepción {Configuración conf = nueva configuración (); String [] OTROArGS = new GenericOptionsParser (conf, args) .getRemainSargs (); if (otherArgs.length <2) {System.err.println ("Usage: WordCount <in> [<in> ...] <aut>"); System.exit (2); } // Eliminar el directorio de salida First Deletedir (conf, otherargs [otherargs.length - 1]); Trabajo trabajo = trabajo.getInstance (conf, "Recuento de palabras"); Job.SetJarbyClass (WordCount.Class); Job.SetMapperClass (tokenizermapper.class); Job.SetCombinLass (intsumeducer.class); Job.SetEducerClass (intsumeducer.class); Job.SetOutputKeyClass (text.class); Job.SetOutputValuecLass (intwritable.class); for (int i = 0; i <otherargs.length - 1; ++ i) {fileInputFormat.addinputPath (trabajo, nueva ruta (otherargs [i])); } FileOutputFormat.SetOutputPath (trabajo, nueva ruta (otener [otherargs.length - 1])); System.exit (Job.WaitForCompletion (verdadero)? 0: 1); }} Pero esto no es suficiente. Cuando se ejecuta en el entorno IDE, el IDE necesita saber a qué instancia de HDFS conectarse (es como en el desarrollo de DB, debe especificar DataSource en el XML de configuración), copiar el Core-Site.xml en $ Hadoop_Home/Etc/Hadoop al directorio de recursos, similar a lo siguiente:
El contenido es el siguiente:
<? xml versión = "1.0" encoding = "utf-8"?> <? xml-stylesheet type = "text/xsl" href = "configuration.xsl"?> <Configuration> <property> <name> fs.defaultfs </name> <value> hdfs: //172.28.20.****: 9000 </value> </mroduct> </configuration> </Configuration>
Simplemente reemplace la IP de arriba con la IP en la máquina virtual.