elasticsearch,Pycharm,Pyspark,elasticsearch" /> elasticsearch,Pycharm,Pyspark,elasticsearch" />

Pyspark与Pycharm的集成

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__":

我对如何配置Pycharm有点迷茫,这样我就可以直接在Pyspark中运行脚本了。我正在使用Elasticsearch集群的Pyspark ontop,并使用以下代码运行脚本。当我试图将pyspark shell配置为解释器时,它使用默认的python解释器运行,但这不起作用,错误是它不是有效的SDK:

__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文件的默认路径。
  • 在虚拟python环境中查找路径
  • /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

  • 将外部jar文件复制到默认路径

  • 希望它能帮到你。

    你可以试试,它对我有用。使用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/