hadoop mapreduce: java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z
Je suis en train d'écrire un snappy bloc compressé le fichier de séquence à partir d'une carte-réduire l'emploi. Je suis à l'aide de
hadoop 2.0.0-cdh4.5.0, et snappy-java 1.0.4.1
Voici mon code:
package jinvestor.jhouse.mr;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.List;
import jinvestor.jhouse.core.House;
import jinvestor.jhouse.core.util.HouseAvroUtil;
import jinvestor.jhouse.download.HBaseHouseDAO;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.SnappyCodec;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
import org.apache.hadoop.mapreduce.Job;
import org.apache.mahout.math.DenseVector;
import org.apache.mahout.math.NamedVector;
import org.apache.mahout.math.VectorWritable;
/**
* Produces mahout vectors from House entries in HBase.
*
* @author Michael Scott Knapp
*
*/
public class HouseVectorizer {
private final Configuration configuration;
private final House minimumHouse;
private final House maximumHouse;
public HouseVectorizer(final Configuration configuration,
final House minimumHouse, final House maximumHouse) {
this.configuration = configuration;
this.minimumHouse = minimumHouse;
this.maximumHouse = maximumHouse;
}
public void vectorize() throws IOException, ClassNotFoundException, InterruptedException {
JobConf jobConf = new JobConf();
jobConf.setMapOutputKeyClass(LongWritable.class);
jobConf.setMapOutputValueClass(VectorWritable.class);
//we want the vectors written straight to HDFS,
//the order does not matter.
jobConf.setNumReduceTasks(0);
Path outputDir = new Path("/home/cloudera/house_vectors");
FileSystem fs = FileSystem.get(configuration);
if (fs.exists(outputDir)) {
fs.delete(outputDir, true);
}
FileOutputFormat.setOutputPath(jobConf, outputDir);
//I want the mappers to know the max and min value
//so they can normalize the data.
//I will add them as properties in the configuration,
//by serializing them with avro.
String minmax = HouseAvroUtil.toBase64String(Arrays.asList(minimumHouse,
maximumHouse));
jobConf.set("minmax", minmax);
Job job = Job.getInstance(jobConf);
Scan scan = new Scan();
scan.addFamily(Bytes.toBytes("data"));
TableMapReduceUtil.initTableMapperJob("homes", scan,
HouseVectorizingMapper.class, LongWritable.class,
VectorWritable.class, job);
job.setOutputFormatClass(SequenceFileOutputFormat.class);
job.setOutputKeyClass(LongWritable.class);
job.setOutputValueClass(VectorWritable.class);
job.setMapOutputKeyClass(LongWritable.class);
job.setMapOutputValueClass(VectorWritable.class);
SequenceFileOutputFormat.setOutputCompressionType(job, SequenceFile.CompressionType.BLOCK);
SequenceFileOutputFormat.setOutputCompressorClass(job, SnappyCodec.class);
SequenceFileOutputFormat.setOutputPath(job, outputDir);
job.getConfiguration().setClass("mapreduce.map.output.compress.codec",
SnappyCodec.class,
CompressionCodec.class);
job.waitForCompletion(true);
}
Quand je le lance j'obtiens ceci:
java.lang.Exception: java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:401)
Caused by: java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z
at org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy(Native Method)
at org.apache.hadoop.io.compress.SnappyCodec.checkNativeCodeLoaded(SnappyCodec.java:62)
at org.apache.hadoop.io.compress.SnappyCodec.getCompressorType(SnappyCodec.java:127)
at org.apache.hadoop.io.compress.CodecPool.getCompressor(CodecPool.java:104)
at org.apache.hadoop.io.compress.CodecPool.getCompressor(CodecPool.java:118)
at org.apache.hadoop.io.SequenceFile$Writer.init(SequenceFile.java:1169)
at org.apache.hadoop.io.SequenceFile$Writer.<init>(SequenceFile.java:1080)
at org.apache.hadoop.io.SequenceFile$BlockCompressWriter.<init>(SequenceFile.java:1400)
at org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:274)
at org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:527)
at org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat.getSequenceWriter(SequenceFileOutputFormat.java:64)
at org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat.getRecordWriter(SequenceFileOutputFormat.java:75)
at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.<init>(MapTask.java:617)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:737)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:338)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:233)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Si je comment ces lignes puis mon test passe:
SequenceFileOutputFormat.setOutputCompressionType(job, SequenceFile.CompressionType.BLOCK);
SequenceFileOutputFormat.setOutputCompressorClass(job, SnappyCodec.class);
job.getConfiguration().setClass("mapreduce.map.output.compress.coded",
SnappyCodec.class,
CompressionCodec.class);
Cependant, j'ai vraiment envie d'utiliser la rapidité de compression dans mes fichiers de séquence. Quelqu'un peut-il m'expliquer ce que je fais de mal?
Comment vous avez installé le LZO et la façon dont vous exécutez votre Travail?
Je ne suis pas en utilisant la compression LZO autant que je sache, juste snappy. Je suis en cours d'exécution du travail à partir d'un test unitaire.
C'est vrai, mon erreur. Toutefois, vous devez définir la propriété java.de la bibliothèque.chemin d'accès. Par exemple: -Djava.de la bibliothèque.path=/lib/hadoop/native
J'ai créer ma configuration de l'utiliser par défaut du pas-arg constructeur, et le passer en tant que constructeur-arg à mon HouseVectorizer. Ensuite, j'appelle la vectorisation de la méthode. Je suis en cours d'exécution sur ce cloudera pré-construit cdh 4.5 VM
Je ne pense pas que j'ai besoin de java.de la bibliothèque.chemin ici, comme je l'ai dit tout ceci se passe si je viens de commenter les lignes pour faire la rapidité de compression. Je suis à l'aide de maven pour contrôler les dépendances, donc, c'est comment les hadoop truc est arriver sur mon classpath.
Je ne suis pas en utilisant la compression LZO autant que je sache, juste snappy. Je suis en cours d'exécution du travail à partir d'un test unitaire.
C'est vrai, mon erreur. Toutefois, vous devez définir la propriété java.de la bibliothèque.chemin d'accès. Par exemple: -Djava.de la bibliothèque.path=/lib/hadoop/native
J'ai créer ma configuration de l'utiliser par défaut du pas-arg constructeur, et le passer en tant que constructeur-arg à mon HouseVectorizer. Ensuite, j'appelle la vectorisation de la méthode. Je suis en cours d'exécution sur ce cloudera pré-construit cdh 4.5 VM
Je ne pense pas que j'ai besoin de java.de la bibliothèque.chemin ici, comme je l'ai dit tout ceci se passe si je viens de commenter les lignes pour faire la rapidité de compression. Je suis à l'aide de maven pour contrôler les dépendances, donc, c'est comment les hadoop truc est arriver sur mon classpath.
OriginalL'auteur msknapp | 2014-03-03
Vous devez vous connecter pour publier un commentaire.
Trouvé les informations suivantes à partir de la Cloudera Communautés
Pour exemple, j'utilise hortonworks a HDP et j'ai la configuration suivante dans mon spark-env.sh
Cela n'a pas résolu le problème pour moi. Même après l'exportation de la libsnappy chemins pour les deux ci-dessus de la bibliothèque des chemins, le même message d'erreur reste.
OriginalL'auteur Pradeep Jawahar
vérifier votre core-site.xml et mapred-site.xml ils doivent contenir les propriétés correctes et le chemin d'accès du dossier avec les bibliothèques
core-site.xml
mapred-site.xml
LD_LIBRARY_PATH - doit contenir le chemin de libsnappy..
OriginalL'auteur Oleksandr Petrenko
Mon problème était que mon JRE ne contient pas les bibliothèques natives. Cela peut ou peut ne pas être parce que je suis passé de la JDK de cloudera de la VM pré-intégrées pour JDK 1.7. La accrocheurs .les fichiers qui sont dans votre hadoop/lib/annuaire natif, le JRE besoins. Ajouter au classpath ne semble pas résoudre mon problème. Je l'ai résolu comme ceci:
Ensuite, j'ai été en mesure d'utiliser le SnappyCodec classe. Vos chemins peuvent être différents.
Qui semblait me faire le problème suivant:
Causés par: java.lang.RuntimeException: native snappy bibliothèque non disponible: SnappyCompressor n'a pas été chargé.
Encore à essayer de résoudre ce problème.
Les gars de la copie de ces fichiers entraînera dans une situation problématique une fois que vous mettez à niveau le CDH version. Vous devez les copier à chaque CDH de mise à niveau et croyez-moi, vous avez oublié que vous avez copié les fichiers par que. La bonne façon est de travailler avec LD_LIBRARY_PATH! Vous devez vous assurer qu'elle a la bonne valeur sur la Passerelle instances. Au CDH, il pourrait être que vous avez remplacé. Les valeurs par défaut sont normalement beaux-là. Lors de cette opération à distance, vous pouvez l'utilisateur java -cp ... puis vous définissez -Djava.de la bibliothèque.chemin d'accès.
OriginalL'auteur msknapp
Je vous besoin de tous les fichiers, pas seulement l' *.donc. Aussi, l'idéal serait d'inclure le dossier de votre chemin au lieu de copier les libs à partir de là. Vous devez redémarrer le MapReduce service après cela, de sorte que les nouvelles bibliothèques sont prises et peut être utilisé.
Niko
OriginalL'auteur Niko
après la suppression de hadoop.dll (j'ai copié manuellement) dans windows\system32 et mise en place HADOOP_HOME=\hadoop-2.6.4 ÇA marche!!!!!
OriginalL'auteur Jaigates
Dans mon cas, vous pouvez vérifier la ruche-fichiers de conf : mapred-site.xml
et vérifier la clé: mapreduce.admin.de l'utilisateur.env
'valeur,
Je l'ai testé dans une nouvelle datanode, et reçu non couplés-buildSnappy d'erreur sur l'ordinateur où est aucun natif dépendances ( libsnappy.donc , etc)
OriginalL'auteur staticor