Pyspark与Pycharm的集成
我对如何配置Pycharm有点迷茫,这样我就可以直接在Pyspark中运行脚本了。我正在使用Elasticsearch集群的Pyspark ontop,并使用以下代码运行脚本。当我试图将pyspark shell配置为解释器时,它使用默认的python解释器运行,但这不起作用,错误是它不是有效的SDK:Pyspark与Pycharm的集成,pycharm,pyspark,elasticsearch,Pycharm,Pyspark,elasticsearch,我对如何配置Pycharm有点迷茫,这样我就可以直接在Pyspark中运行脚本了。我正在使用Elasticsearch集群的Pyspark ontop,并使用以下代码运行脚本。当我试图将pyspark shell配置为解释器时,它使用默认的python解释器运行,但这不起作用,错误是它不是有效的SDK: __author__ = 'lucas' from pyspark import SparkContext, SparkConf if __name__ == "__main__":
__author__ = 'lucas'
from pyspark import SparkContext, SparkConf
if __name__ == "__main__":
conf = SparkConf().setAppName("ESTest")
sc = SparkContext(conf=conf)
es_read_conf = {
"es.nodes" : "localhost",
"es.port" : "9200",
"es.resource" : "titanic/passenger"
}
es_rdd = sc.newAPIHadoopRDD(
inputFormatClass="org.elasticsearch.hadoop.mr.EsInputFormat",
keyClass="org.apache.hadoop.io.NullWritable",
valueClass="org.elasticsearch.hadoop.mr.LinkedMapWritable",
conf=es_read_conf)
es_write_conf = {
"es.nodes" : "localhost",
"es.port" : "9200",
"es.resource" : "titanic/value_counts"
}
doc = es_rdd.first()[1]
for field in doc:
value_counts = es_rdd.map(lambda item: item[1][field])
value_counts = value_counts.map(lambda word: (word, 1))
value_counts = value_counts.reduceByKey(lambda a, b: a+b)
value_counts = value_counts.filter(lambda item: item[1] > 1)
value_counts = value_counts.map(lambda item: ('key', {
'field': field,
'val': item[0],
'count': item[1]
}))
value_counts.saveAsNewAPIHadoopFile(
path='-',
outputFormatClass="org.elasticsearch.hadoop.mr.EsOutputFormat",
keyClass="org.apache.hadoop.io.NullWritable",
valueClass="org.elasticsearch.hadoop.mr.LinkedMapWritable",
conf=es_write_conf)
但这会生成以下堆栈跟踪:
Traceback (most recent call last):
File "/home/lucas/PycharmProjects/tweetspark/analytics/tweetanalyzer.py", line 20, in <module>
conf=es_read_conf)
File "/var/opt/spark/python/pyspark/context.py", line 601, in newAPIHadoopRDD
jconf, batchSize)
File "/var/opt/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 538, in __call__
File "/var/opt/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD.
: java.lang.ClassNotFoundException: org.elasticsearch.hadoop.mr.LinkedMapWritable
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:278)
at org.apache.spark.util.Utils$.classForName(Utils.scala:179)
at org.apache.spark.api.python.PythonRDD$.newAPIHadoopRDDFromClassNames(PythonRDD.scala:519)
at org.apache.spark.api.python.PythonRDD$.newAPIHadoopRDD(PythonRDD.scala:503)
at org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD(PythonRDD.scala)
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 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
at py4j.Gateway.invoke(Gateway.java:259)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:207)
at java.lang.Thread.run(Thread.java:745)
回溯(最近一次呼叫最后一次):
文件“/home/lucas/PycharmProjects/tweetspark/analytics/tweetanalyzer.py”,第20行,在
conf=es_read_conf)
文件“/var/opt/spark/python/pyspark/context.py”,第601行,在newAPIHadoopRDD中
jconf,batchSize)
文件“/var/opt/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py”,第538行,在__
文件“/var/opt/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py”,第300行,在get_return_值中
py4j.protocol.Py4JJavaError:调用z:org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD时出错。
:java.lang.ClassNotFoundException:org.elasticsearch.hadoop.mr.LinkedMapWritable
在java.net.URLClassLoader$1.run(URLClassLoader.java:366)
在java.net.URLClassLoader$1.run(URLClassLoader.java:355)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:354)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:425)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:358)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:278)
位于org.apache.spark.util.Utils$.classForName(Utils.scala:179)
位于org.apache.spark.api.PythonRDD$.newapiHadooprdFromClassNames(PythonRDD.scala:519)
位于org.apache.spark.api.PythonRDD$.newAPIHadoopRDD(PythonRDD.scala:503)
位于org.apache.spark.api.PythonRDD.newAPIHadoopRDD(PythonRDD.scala)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
位于py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
在py4j.Gateway.invoke处(Gateway.java:259)
位于py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
在py4j.commands.CallCommand.execute(CallCommand.java:79)
在py4j.GatewayConnection.run处(GatewayConnection.java:207)
运行(Thread.java:745)
stacktrace正在抱怨缺少一个jar。在启动SparkContext
之前,您可以通过添加以下代码将其添加到类路径:
import os
os.environ['SPARK_CLASSPATH'] = "/path/to/elasticsearch-hadoop.jar"
conf = SparkConf().setAppName("ESTest")
sc = SparkContext(conf=conf)
...
您缺少的是elasticsearch-spark.jar。 下载,在
dist
子目录下找到elasticsearch spark,然后设置spark\u CLASSPATH环境变量
os.environ['SPARK_CLASSPATH'] = "/path/to/elasticsearch-hadoop-2.3.0/dist/elasticsearch-spark_2.10-2.3.0.jar"
另一种方法是:
import os
os.environ['PYSPARK_SUBMIT_ARGS'] = \
'--jars /full/path/to/your/jar.jar pyspark-shell'
# example
# os.environ['PYSPARK_SUBMIT_ARGS'] = \
# '--jars /home/buxizhizhoum/jars/elasticsearch-hadoop-6.4.2/dist/elasticsearch-spark-20_2.11-6.4.2.jar ' \
# 'pyspark-shell'
适用于spark 2.3和elasticsearch 6.4
所需的JAR可以从找到,我正在使用
pipenv
和pyspark
在pycharm
进行本地开发。为了不在项目中引入任何指定外部jar路径的代码,您可以下载缺少的jar并将其复制到默认jar文件路径
如何找到包含pyspark所需jar文件的默认路径。
/Users/xxxx/.local/share/virtualenvs/demo-spark-ZXzB9uOI/bin/
下运行find_spark_home.py
,获取spark home的路径/Users/xxxx/.local/share/virtualenvs/unnormal_detection-ZXzB9uOI/lib/python3.6/site packages/pyspark/jars
希望它能帮到你。你可以试试,它对我有用。使用pyspark 2.4.3 es 6.6.0和jar文件elasticsearch-hadoop-6.6.0.jar。
$ which pyspark
/Users/xxxx/.local/share/virtualenvs/demo-spark-ZXzB9uOI/bin/pyspark
$ python /Users/xxxx/.local/share/virtualenvs/demo-spark-ZXzB9uOI/bin/find_spark_home.py
/Users/xxxx/.local/share/virtualenvs/abnormal_detection-ZXzB9uOI/lib/python3.6/site-packages/pyspark
$ cp xxxx.jar /Users/xxxx/.local/share/virtualenvs/abnormal_detection-ZXzB9uOI/lib/python3.6/site-packages/pyspark/jars/