spark parallelize examples example ejemplo apache-spark

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 / *