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
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
J'attends vos réponses avec impatience.
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!
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.
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
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.