apache-spark - parallelize - scala rdd map
¿Cómo usar TwitterUtils en Spark shell? (3)
Estoy tratando de usar twitterUtils en el Spark Shell (donde no están disponibles por defecto).
He agregado lo siguiente a spark-env.sh
:
SPARK_CLASSPATH="/disk.b/spark-master-2014-07-28/external/twitter/target/spark-streaming-twitter_2.10-1.1.0-SNAPSHOT.jar"
Ahora puedo ejecutar
import org.apache.spark.streaming.twitter._
import org.apache.spark.streaming.StreamingContext._
sin un error en el shell, que no sería posible sin agregar el jar al classpath ("error: object twitter no es miembro del paquete org.apache.spark.streaming"). Sin embargo, obtendré un error al ejecutar esto en el shell Spark:
scala> val ssc = new StreamingContext(sc, Seconds(1))
ssc: org.apache.spark.streaming.StreamingContext =
org.apache.spark.streaming.StreamingContext@6e78177b
scala> val tweets = TwitterUtils.createStream(ssc, "twitter.txt")
error: bad symbolic reference. A signature in TwitterUtils.class refers to
term twitter4j in package <root> which is not available.
It may be completely missing from the current classpath, or the version on the classpath might be incompatible with the version used when compiling
TwitterUtils.class.
¿Qué me estoy perdiendo? ¿Debo importar otro tarro?
Sí, necesitas los JAR de Twitter4J además del spark-streaming-twitter
que ya tienes. Específicamente, los desarrolladores de Spark sugieren usar Twitter4J versión 3.0.3 .
Después de descargar los archivos JAR correctos, querrá pasarlos al shell a través de la bandera --jars
. Creo que también puedes hacer esto a través de SPARK_CLASSPATH
como lo has hecho.
Así es como lo hice en un clúster de Spark EC2:
#!/bin/bash
cd /root/spark/lib
mkdir twitter4j
# Get the Spark Streaming JAR.
curl -O "http://search.maven.org/remotecontent?filepath=org/apache/spark/spark-streaming-twitter_2.10/1.0.0/spark-streaming-twitter_2.10-1.0.0.jar"
# Get the Twitter4J JARs. Check out http://twitter4j.org/archive/ for other versions.
TWITTER4J_SOURCE=twitter4j-3.0.3.zip
curl -O "http://twitter4j.org/archive/$TWITTER4J_SOURCE"
unzip -j ./$TWITTER4J_SOURCE "lib/*.jar" -d twitter4j/
rm $TWITTER4J_SOURCE
cd
# Point the shell to these JARs and go!
TWITTER4J_JARS=`ls -m /root/spark/lib/twitter4j/*.jar | tr -d ''/n''`
/root/spark/bin/spark-shell --jars /root/spark/lib/spark-streaming-twitter_2.10-1.0.0.jar,$TWITTER4J_JARS
Otra cosa que podría hacer además de agregar manualmente dependencias de dependencias (que pronto se convertirá en una pesadilla si comienza a incluir muchas jarras), es crear un proyecto ficticio sbt, agregar el plugin sbt-assembly, enumerar sus coordenadas de dependencia en la compilación .sbt, luego ejecute sbt assembly
, luego apunte su SPARK_CLASSPATH
al frasco de grasa resultante. De esta manera, sbt hace el arduo trabajo de descargar y vincular tarros en lugar de ti.
Crea un directorio en spark-home como:
~ / spark-2.0.0-bin-hadoop2.7 / ext-jar /
para todos los archivos jar externos y poner todos los archivos jar en ese directorio
Agregue las siguientes líneas en spark-defaults.conf
spark.driver.extraClassPath ~ / spark-2.0.0-bin-hadoop2.7 / ext-jars / * spark.executor.extraClassPath ~ / spark-2.0.0-bin-hadoop2.7 / ext-jars / *