Visión global: primavera is one of the widely used frameworks in enterprise applications development. primavera ten compoñentes diferentes como Spring ORM, Primavera JDBC etc para apoiar características diferentes. Primavera para Apache Hadoop é a estrutura de apoio á creación de aplicacións con compoñentes do Hadoop como HDFS, MapReduce e Hive etc. primavera ofrece APIs para traballar con todos estes compoñentes. Primavera tamén soporta a integración do Hadoop con outros proxectos do ecosistema da primavera para o desenvolvemento de aplicacións da vida real. Neste artigo iremos discutir o uso de primavera para cadros Apache Hadoop.
Introdución:
Apache Hadoop é unha estrutura de software de código aberto, que se usa para almacenar e procesar conxuntos de datos de volume maior. A primavera é tamén un framework de código aberto, que é amplamente utilizado en aplicacións Java / J2EE. inxección de dependencia do Spring (DE) ou inversión de control (IO) mecanismo tornouse unha alternativa popular para os Enterprise Java Beans (ou EJB) modelo. Mola ten a vantaxe de ser suficientemente flexible para ser facilmente conectado con calquera outra estrutura de desenvolvemento. Usando esta vantaxe de primavera, podemos conectar con Apache Hadoop para axudarnos a obter o máximo beneficio de cada un destes dous cadros.
Comezar:
Nesta sección, imos falar sobre como crear un Job Hadoop MapReduce usando Spring. Isto implica os seguintes pasos -
- Step 1 - Obter as dependencias necesarias utilizando Maven - Como sabemos Maven é altamente dependente o ficheiro pom.xml, facemos as seguintes entradas no noso arquivo pom.xml. Estas entradas de dependencia son para o núcleo Hadoop e framework Spring.
Listing1: entradas de configuración de mostra no ficheiro pom.xml
[código]
< !– Primavera de datos Apache Hadoop — >
< dependencia >
< groupId > org.springframework.data </ groupId >
< artifactId > Primavera-data-Hadoop </ artifactId >
< version > 1.0.0.DIVULGACIÓN </ version >
< /dependencia >
< !– Apache Hadoop Núcleo -- >
< dependencia >
< groupId > org.apache.hadoop </ groupId >
< artifactId > Hadoop núcleos </ artifactId >
< version > 1.0.3 </version >
</dependencia>
[/ código]
- Step 2 - Crear a componente Mapper - Como sabemos un compoñente mapeador se usa para romper o problema en compoñentes menores. Estes compoñentes menores, a continuación, chegar a ser máis fácil de resolver. Podemos ter o noso propio compoñente de mapeador de personalización, ampliando o mapa Apache reducir clase Mapper. Necesitamos substituír o método mapa desta clase. A clase mapeador espera que os catro parámetros a seguir -
para entrada: Seguintes parámetros para clave de entrada eo valor
- ENTÓN - Este parámetro describe o tipo de chave, que é proporcionada como unha entrada para o compoñente mapeador.
- VALUEIN - Este parámetro describe o tipo de valor que é proporcionada como unha entrada para o compoñente mapeador.
para saída: Seguintes parámetros para clave de produción e no valor
- KEYOUT - Este parámetro describe o tipo de colocar un parámetro clave do compoñente mapeador.
- VALUEOUT - Este parámetro describe o tipo de valor de saída do compoñente mapeador.
Cada un destes parámetros debe aplicar a gravable interface. No exemplo dado, temos usado noso mapeador para ler o contido dun ficheiro dunha liña de cada vez e preparar pares chave-valor de cada liña. Nosa implementación do método mapa executa as seguintes tarefas -
- First, dividir cada liña única en palabras
- Segundo, percorrer cada palabra e sacar nin todos os caracteres unicode que non sexan nin cartas nin caracteres.
- Terceiro, construír un par de valores clave usando o método de gravación do contexto clase que é compatible co par clave-valor de saída espera.
Listing2: clase Mapper personalizado Mostra
[Code]
clase pública MyWordMapper estende Mapper<LongWritable, texto, texto, IntWritable> {
myword Texto privada = new Texto();
@ Override
mapa protected void(clave LongWritable, valor de texto, contexto contexto) lanza IOException, InterruptedException {
liña String = Value.ToString();
StringTokenizer lineTokenz = new StringTokenizer(line);
mentres (lineTokenz.hasMoreTokens()) {
Cordas cleaned_data = removeNonLettersNonNumbers(lineTokenz.nextToken());
myword.set(cleaned_data);
context.write(myword, nova IntWritable(1));
}
}
/**
* Substituír todos os caracteres unicode que non son números nin letras cunha cadea baleira.
* orixinais @param, É a cadea orixinal
* @return un obxecto cadea que contén só letras e números
*/
removeNonLettersNonNumbers private String (cadea orixinal) {
volver original.replaceAll(“[^ \ P{L}\\p{N}]”, “”);
}
}
[/Code]
Step 3 - crear o redutor Compoñente - Un redutor é un compoñente que exclúe os valores intermedios non desexados e encamiña só os pares de valores clave que son relevantes. Para ter o noso redutor personalizado, nosa clase debe estender o redutor clase e máis de montar o método de reducir. A clase redutor de espera os seguintes catro parámetros.
para entrada: Seguintes parámetros para clave de entrada eo valor
- ENTÓN - Este parámetro describe o tipo de chave, que é proporcionada como unha entrada para o compoñente mapeador.
- VALUEIN - Este parámetro describe o tipo de valor que é proporcionada como unha entrada para o compoñente mapeador.
para saída: Seguintes parámetros para clave de produción e no valor
- KEYOUT - Este parámetro describe o tipo de colocar un parámetro clave do compoñente mapeador
- VALUEOUT - Este parámetro describe o tipo de valor de saída do compoñente mapeador.
Durante a posta en marcha, hai que ter seguro de que o tipo de datos dos parámetros e 'keyin' 'keyout' son os mesmos. Tamén o 'valuein "e os parámetros" valueout debe ser de mesmo tipo. A implantación do método de reducir executa os seguintes pasos -
- First, Asegúrese de que a clave de entrada contén a palabra desexada.
- Segundo, Se o paso anterior é certa, obter o número de aparicións da palabra.
- Terceiro, construír un novo par de chaves-valor chamando o método de escritura da clase redutor.
Listing3: clase Redutor personalizado Mostra
[Code]
importación org.apache.hadoop.io.IntWritable;
importación org.apache.hadoop.io.Text;
importación org.apache.hadoop.mapreduce.Reducer;
clase pública MyWordReducer estende Redutor<texto, IntWritable, texto, IntWritable> {
protexidas estática MY_TARGET_TEXT final String = “Hadoop”;
@ Override
protected void reducir(keyTxt texto, Iterable<IntWritable> values, contexto contexto) lanza IOException, InterruptedException {
se (containsTargetWord(keyTxt)) {
int wCount = 0;
a (valor IntWritable: values) {
wCount = value.get();
}
context.write(key, nova IntWritable(wCount));
}
}
containsTargetWord private boolean(keyTxt texto) {
volver keyTxt.toString().é igual a(MY_TARGET_TEXT);
}
}
[/Code]
- Step 4 - Crear o contexto da aplicación - O seguinte paso é crear o contexto da aplicación usando XML. Podemos configurar o contexto de aplicación do noso programa a usar os pasos a seguir -
- Crear un ficheiro de propiedades que contén o valor das propiedades de configuración. Un arquivo de propiedades da aplicación de exemplo móstrase a continuación -
[Code]
fs.default.name = hdfs://localhost:9000
mapred.job.tracker = localhost:9001
input.path = / path / to / input / arquivo /
output.path = / path / to / saída / ficheiro
[/Code]
- Configurar un soporte de propiedade lugar que se usa para obter os valores de propiedades de configuración desde o ficheiro de propiedades creado. Isto pódese facer engadindo a seguinte na nosa arquivo XML contexto de aplicación -
[Code]
<contexto:localización da propiedade-espazo reservado =”classpath:application.properties” />
[/Code]
- Configurar Apache Hadoop eo seu traballo - Podemos configurar o sistema de ficheiros predeterminado ea súa rastreador traballo, engadindo a seguinte na nosa ficheiro contexto aplicación
[Code]
<HDP:configuración>
fs.default.name = ${fs.default.name}
mapred.job.tracker = ${mapred.job.tracker}
</HDP:configuración>
[/Code]
Hai que engadir o seguinte na nosa ficheiro contextual XML aplicación para definir o rastreador de traballo -
[Code]
<HDP:ID de traballo =”wordCountJobId”
input-path =”${input.path}”
output-path =”${output.path}”
jar-by-class =”net.qs.spring.data.apachehadoop.Main”
mapeador =”net.qs.spring.data.apachehadoop.MyWordMapper”
redutor =”net.qs.spring.data.apachehadoop.MyWordReducer”/>
[/Code]
- Configurar o corredor de traballo que se executa o traballo Hadoop creado. O corredor de traballo pode ser configurado engadindo a seguinte na nosa ficheiro contextual XML aplicación
[Code]
<HDP:ID de traballo-runner =”wordCountJobRunner” job-ref =”wordCountJobId” run-at-inicialización =”certo”/>
[/Code]
- Step 5 – Cargando o contexto de aplicación no inicio - Agora podemos realizar o traballo Hadoop creado por cargar o contexto da aplicación cando a aplicación execútase. Podemos facelo a través da creación da instancia do obxecto ClassPathXmlApplicationContext que acepta o nome do noso arquivo de contexto de aplicación como parámetro de entrada para o constructor. Isto pódese facer como baixo -
Listing4: Mostra mostrando carga de contexto de aplicación
[Code]
importación org.springframework.context.ApplicationContext;
importación org.springframework.context.support.ClassPathXmlApplicationContext;
public class principal {
public static void main(Corda[] argumentos) {
ApplicationContext CTX = new ClassPathXmlApplicationContext(“applicationContext.xml”);
}
}
[/Code]
- Step 6 - Realizar a tarefa MapReduce - Podemos comezar o noso mapa reducir a tarefa usando os seguintes pasos -
- Subir un ficheiro de entrada no HDFS - Podemos facelo, executando o seguinte comando no ventá de consola -
[Code]
Hadoop DFS -put sample.txt /input/sample.txt
[/Code]
Segue-se un ficheiro de entrada de mostra, que foi usado neste exemplo. A palabra clave destino 'Hadoop ' é destaque na VERDE. A palabra "Hadoop ' existe 4 veces na mostra.
Image1: ficheiro de entrada de mostra
- Asegúrese de que o arquivo foi enviado con éxito, executando o seguinte comando. Ha amosar o ficheiro de entrada.
[código]
DFS Hadoop -LS / input
[/código]
- Realizar a tarefa MapReduce. Isto pódese facer a executar método principal do noso arquivo Java do IDE. Se todos os pasos funcionan como se esperaba, a continuación, o seguinte será a saída.
saída: Hadoop 4
Summary: Imos completar o que temos discutido ata agora nas seguintes balas –
- tanto primavera e Hadoop son estruturas útiles a partir da comunidade de código aberto.
- Ao combinar estes, podemos obter o beneficio de ambos os cadros.
- Crear un mapa reducir traballo usando primavera é un proceso de seis etapas, tal como se explica anteriormente.