Le programme Java Java a été écrit pour expérimenter avec Apache spark.
Le programme essaie de lire une liste de mots positifs et négatifs d'un fichier respectif, de le comparer au fichier maître et de filtrer les résultats en conséquence.
import Java.io.Serializable;
import Java.io.FileNotFoundException;
import Java.io.File;
import Java.util.*;
import Java.util.Iterator;
import Java.util.List;
import Java.util.List;
import org.Apache.spark.api.Java.*;
import org.Apache.spark.api.Java.function.Function;
public class SimpleApp implements Serializable{
public static void main(String[] args) {
String logFile = "/tmp/master.txt"; // Should be some file on your system
String positive = "/tmp/positive.txt"; // Should be some file on your system
String negative = "/tmp/negative.txt"; // Should be some file on your system
JavaSparkContext sc = new JavaSparkContext("local[4]", "Twitter Analyzer", "/home/welcome/Downloads/spark-1.1.0/", new String[]{"target/scala-2.10/Simple-Assembly-0.1.0.jar"});
JavaRDD<String> positiveComments = sc.textFile(logFile).cache();
List<String> positiveList = GetSentiments(positive);
List<String> negativeList= GetSentiments(negative);
final Iterator<String> iterator = positiveList.iterator();
int i = 0;
while (iterator.hasNext())
{
JavaRDD<String> numAs = positiveComments.filter(new Function<String, Boolean>()
{
public Boolean call(String s)
{
return s.contains(iterator.next());
}
});
numAs.saveAsTextFile("/tmp/output/"+ i);
i++;
}
}
public static List<String> GetSentiments(String fileName) {
List<String> input = new ArrayList<String>();
try
{
Scanner sc = new Scanner(new File(fileName));
while (sc.hasNextLine()) {
input.add(sc.nextLine());
}
}
catch (FileNotFoundException e){
// do stuff here..
}
return input;
}
}
L'erreur suivante est générée lors de l'exécution de la tâche spark,
Exception in thread "main" org.Apache.spark.SparkException: Task not serializable
at org.Apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:166)
at org.Apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:158)
at org.Apache.spark.SparkContext.clean(SparkContext.scala:1242)
at org.Apache.spark.rdd.RDD.filter(RDD.scala:282)
at org.Apache.spark.api.Java.JavaRDD.filter(JavaRDD.scala:78)
at SimpleApp.main(SimpleApp.Java:37)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.Apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:328)
at org.Apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75)
at org.Apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: Java.io.NotSerializableException: Java.util.ArrayList$Itr
at Java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.Java:1183)
at Java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.Java:1547)
at Java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.Java:1508)
at Java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.Java:1431)
at Java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.Java:1177)
at Java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.Java:1547)
at Java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.Java:1508)
at Java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.Java:1431)
at Java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.Java:1177)
at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:347)
at org.Apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:42)
at org.Apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:73)
at org.Apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:164)
... 12 more
Des pointeurs ??
Lorsque vous créez une classe anonyme, le compilateur fait certaines choses:
JavaRDD<String> numAs = positiveComments.filter(new Function<String, Boolean>()
{
public Boolean call(String s)
{
return s.contains(iterator.next());
}
});
Il sera réécrit comme:
JavaRDD<String> numAs = positiveComments.filter(new Function<String, Boolean>()
{
private Iterator<...> $iterator;
public Boolean call(String s)
{
return s.contains($iterator.next());
}
});
C'est pourquoi vous pouvez avoir un NotSerializableException
car l'itérateur n'est pas sérialisable.
Pour éviter cela, extrayez simplement le résultat du suivant avant:
String value = iterator.next();
JavaRDD<String> numAs = positiveComments.filter(new Function<String, Boolean>()
{
public Boolean call(String s)
{
return s.contains(value);
}
});
Certains Java Faits
Quelques faits sur Spark.
Règle générale pour éviter les problèmes de sérialisation:
Pour une compréhension approfondie, suivez http://bytepadding.com/big-data/spark/understanding-spark-serialization/