web-dev-qa-db-fra.com

Échec de la détection d'un répertoire personnel hadoop valide.

J'ai mis en place un nœud unique Hadoop 2.2.0 et je l'ai démarré. Je peux parcourir le FS sur http://localhost:50070/ Ensuite, j'ai essayé d'écrire un fichier factice à l'aide du code suivant.

public class Test {
public void write(File file) throws IOException{
    FileSystem fs = FileSystem.get(new Configuration());
    Path outFile = new Path("test.jpg");       
    FSDataOutputStream out = fs.create(outFile);        

}    

Je reçois l'exception suivante

INFO:   DEBUG - field org.Apache.hadoop.metrics2.lib.MutableRate org.Apache.hadoop.security.UserGroupInformation$UgiMetrics.loginSuccess with annotation @org.Apache.hadoop.metrics2.annotation.Metric(valueName=Time, value=[Rate of successful kerberos logins and latency (milliseconds)], about=, type=DEFAULT, always=false, sampleName=Ops)
    INFO:   DEBUG - field org.Apache.hadoop.metrics2.lib.MutableRate org.Apache.hadoop.security.UserGroupInformation$UgiMetrics.loginFailure with annotation @org.Apache.hadoop.metrics2.annotation.Metric(valueName=Time, value=[Rate of failed kerberos logins and latency (milliseconds)], about=, type=DEFAULT, always=false, sampleName=Ops)
    INFO:   DEBUG - UgiMetrics, User and group related metrics
    INFO:   DEBUG -  Creating new Groups object
    INFO:   DEBUG - Trying to load the custom-built native-hadoop library...
    INFO:   DEBUG - Failed to load native-hadoop with error: Java.lang.UnsatisfiedLinkError: no hadoop in Java.library.path
    INFO:   DEBUG - Java.library.path=/usr/lib/jvm/jdk1.7.0/jre/lib/AMD64:/usr/lib/jvm/jdk1.7.0/jre/lib/i386::/usr/Java/packages/lib/i386:/lib:/usr/lib
    INFO:   WARN - Unable to load native-hadoop library for your platform... using builtin-Java classes where applicable
    INFO:   DEBUG - Falling back to Shell based
    INFO:   DEBUG - Group mapping impl=org.Apache.hadoop.security.ShellBasedUnixGroupsMapping
    INFO:   DEBUG - Group mapping impl=org.Apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback; cacheTimeout=300000
    INFO:   DEBUG - hadoop login
    INFO:   DEBUG - hadoop login commit
    INFO:   DEBUG - using local user:UnixPrincipal: qualebs
    INFO:   DEBUG - UGI loginUser:qualebs (auth:SIMPLE)
    INFO:   DEBUG - Failed to detect a valid hadoop home directory
    Java.io.IOException: HADOOP_HOME or hadoop.home.dir are not set.
        at org.Apache.hadoop.util.Shell.checkHadoopHome(Shell.Java:225)
        at org.Apache.hadoop.util.Shell.<clinit>(Shell.Java:250)
        at 
    org.Apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.Java:639)
        at org.Apache.hadoop.fs.FilterFileSystem.setPermission(FilterFileSystem.Java:468)
        at org.Apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.Java:456)
        at org.Apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.Java:424)
        at org.Apache.hadoop.fs.FileSystem.create(FileSystem.Java:905)
        at org.Apache.hadoop.fs.FileSystem.create(FileSystem.Java:886)
        at org.Apache.hadoop.fs.FileSystem.create(FileSystem.Java:783)
        at org.Apache.hadoop.fs.FileSystem.create(FileSystem.Java:772)
        at com.qualebs.managers.HadoopDFS.writer(HadoopDFS.Java:41)

Où est-ce que je place HADOOP_HOME ou hadoop.home.dir? Le système d'exploitation est Ubuntu 11.10 

Les seuls fichiers de configuration que j'ai configurés sont les suivants avec les propriétés ajoutées

  1. core-site.xml 

<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>
  1. hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>
  1. mapred-site.xml.template

<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>localhost:9001</value>
    </property>
</configuration>

J'attends vos réponses avec impatience.

9
qualebs

Je trouve ma solution ici en faisant ceci:

System.setProperty("hadoop.home.dir", "/");

Cette exception est levée par checkHadoopHome () in org.Apache.hadoop.util.Shell

J'espère que ça aide!

12
Yongfeng

Je recevais exactement les mêmes messages d'erreur de quelque chose, je ne crois pas que cela soit lié à des chemins. J'ai eu mon enregistreur mal réglé:

Causait l'erreur:

import org.Apache.log4j._

trait Logger {
  val logger = LogManager.getRootLogger
}

Fixe le:

import org.Apache.log4j._

trait Logger {
  val logger = LogManager.getRootLogger
  logger.setLevel(Level.INFO)
}

La solution n’est peut-être pas du tout de changer les chemins.

0
Akavall

ajoutez-le au fichier bash du terminal si vous n'utilisez pas d'utilisateur dédié pour hadoop.

1. start terminal
2. Sudo vi .bashrc
3. export HADOOP_HOME=YOUR_HADOOP_HOME_DIRECTORY(don't include bin folder)
4. save
5. restart terminal and check it if it's saved by typing : echo $HADOOP_HOME
0
Aditya Peshave

Cette configuration ne fonctionne pas sous Windows. Une solution consiste à créer un dossier sur votre projet (par exemple, winutils/bin) et à y placer le fichier winutils.exe (voir https://wiki.Apache.org/hadoop/WindowsProblems ). Ensuite, dans le code Java, ajoutez 

static {
    String OS = System.getProperty("os.name").toLowerCase();

    if (OS.contains("win")) {
      System.setProperty("hadoop.home.dir", Paths.get("winutils").toAbsolutePath().toString());
    } else {
      System.setProperty("hadoop.home.dir", "/");
    }
  }

J'espère que ça aide.

0
florins