Problema com-libjars em hadoop
estou a dizer o seguinte no terminal:
Hadoop@ubuntu:/usr/local/hadoop$ bin /hadoop jar/home/hadoop / vardtst.jar-libjar / home / hadoop / clui.jar-libjar / home/hadoop / model.jar gutenberg ou101
e estou a receber a seguinte excepção:
em java. net. URLClassLoader$1.run(URLClassLoader. java:202)
em java.seguranca.Controlador de acesso.doPrivileged (método nativo)
At java.net.URLClassLoader.findClass (URLClassLoader. java: 190)
em java.idioma.Carregador de classe.classe de carga(ClassLoader.java: 306)
em java.idioma.Carregador de classe.classe de carga(ClassLoader.java: 247)
em java.idioma.Classe.forName0 (método nativo)
em java.idioma.Classe.forName(Classe.java: 247)
em organizacao.Apache.hadoop.util.RunJar.main (RunJar.java: 149)
Por Favor, Ajudem-Me ..Obrigado.3 answers
Também vale a pena notar um ponto subtil mas importante: a forma de especificar Frascos adicionais para JVMs executando mapa distribuído reduz tarefas e para JVM executando cliente de trabalho é muito diferente.
-a libjars torna os frascos disponíveis apenas para JVMs a correr o mapa remoto e a reduzir a tarefa
Para tornar estes mesmos JAR disponíveis para o JVM cliente (o JVM que é criado quando executa o comando hadoop jar), é necessário definir o ambiente HADOOP_CLASSSPATH variável:
$ export LIBJARS=/path/jar1,/path/jar2 $ export HADOOP_CLASSPATH=/path/jar1:/path/jar2 $ hadoop jar my-example.jar com.example.MyTool -libjars ${LIBJARS} -mytoolopt value
Ver: http://grepalex.com/2013/02/25/hadoop-libjars/
Outra causa de comportamento incorreto-libjars pode estar na implementação e inicialização erradas da classe de trabalho personalizado.
- classe de trabalho deve implementar interface de ferramentas
- a instância de classe de configuração deve ser obtida chamando getConf () em vez de criar uma nova instância;
Ver: http://kickstarthadoop.blogspot.ca/2012/05/libjars-not-working-in-custom-mapreduce.html
Quando estiver a indicar os '- LIBJARS ' com o comando Hadoop jar. Primeiro certifique-se de editar a sua classe de condução como mostrado abaixo:
public class myDriverClass extends Configured implements Tool {
public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(), new myDriverClass(), args);
System.exit(res);
}
public int run(String[] args) throws Exception
{
// Configuration processed by ToolRunner
Configuration conf = getConf();
Job job = new Job(conf, "My Job");
...
...
return job.waitForCompletion(true) ? 0 : 1;
}
}
Agora edite o seu comando "hadoop jar" como mostrado abaixo:
Hadoop jar Youraplication.jar [myDriverClass] args-libjar localização / para/jar / fileAgora vamos perceber o que acontece por baixo. Basicamente estamos lidando com os novos argumentos da linha de comando, implementando a Interface de Ferramenta . O ToolRunner é usado para executar classes implementando interface de Ferramenta. Ele funciona em conjunto com GenericOptionsParser para processar os argumentos genéricos da linha de comandos hadoop e modifica a configuração da ferramenta.
Dentro do nosso principal () estamos a chamar ToolRunner.executar (nova configuração (), nova classe myDriverClass (), args) - isto executa a ferramenta dada por Ferramenta.executar (texto[]), Depois de analisar com os argumentos genéricos indicados. Ele usa a configuração dada, ou constrói um se ele é nulo e, em seguida, define o Configuração da ferramenta com a versão modificada do conf.
Agora dentro do método de execução, quando chamamos getConf () temos a versão modificada da configuração. Então certifique-se que você tem a linha abaixo em seu código. Se você implementar tudo o resto e ainda fazer uso da configuração conf = nova configuração(), nada iria funcionar.
Conf de configuração = getConf ();
A forma correcta de executar é: hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar /home/hadoop/vardtst.jar VardTest-libjar/home/hadoop / clui.jar, / home/hadoop / model.jar gutenberg ou101
Em que VardTest é a classe que contém o método principal ().
Obrigado.