Fehler in pyspark mit udf: Sie müssen bauen, Funken mit Bienenkorb. Export ‚SPARK_HIVE=true“ und starten Sie build/sbt-Montage

Ich versuche, führen Sie diesen code in Pyspark 1.6.2 Verwendung von Pre-built for Hadoop 2.6 in Windows 7 professional

Funktioniert alles einwandfrei bis zu dem Punkt, wo ich definieren, der udf. Können Sie einige Hinweise geben. Benötige ich zum kompilieren Spark mit hive ? Was ist dann die Verwendung des pre-built for Hadoop 2.6. Kann ich nicht ändern C:\tmp\hive Berechtigungen, da bin ich nicht der system admin. Könnte sein, dass der Grund für diese Fehlermeldung ?

from pyspark import  SparkContext
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

rdd = sc.parallelize([('u1', 1, [1 ,2, 3]), ('u1', 4, [1, 2, 3])])
df = rdd.toDF(['user', 'item', 'fav_items'])
# Print dataFrame
df.show()

from pyspark.sql.functions import *
from pyspark.sql.types import IntegerType

function = udf(lambda item, items: 1 if item in items else 0, IntegerType())

df.select('user', 'item', 'fav_items', function(col('item'),   col('fav_items')).alias('result')).show()

Dann bekomme ich diesen Fehler:

You must build Spark with Hive. Export 'SPARK_HIVE=true' and run build/sbt assembly
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\yrxt028\Downloads\spark-1.6.2-bin-hadoop2.6\spark-1.6.2-bin-hadoop2.6\python\pyspark\sql\functions.py", line 1597, in udf
    return UserDefinedFunction(f, returnType)
  File "C:\Users\yrxt028\Downloads\spark-1.6.2-bin-hadoop2.6\spark-1.6.2-bin-hadoop2.6\python\pyspark\sql\functions.py", line 1558, in __init__
    self._judf = self._create_judf(name)
  File "C:\Users\yrxt028\Downloads\spark-1.6.2-bin-hadoop2.6\spark-1.6.2-bin-hadoop2.6\python\pyspark\sql\functions.py", line 1569, in _create_judf
    jdt = ctx._ssql_ctx.parseDataType(self.returnType.json())
  File "C:\Users\yrxt028\Downloads\spark-1.6.2-bin-hadoop2.6\spark-1.6.2-bin-hadoop2.6\python\pyspark\sql\context.py", line 683, in _ssql_ctx
    self._scala_HiveContext = self._get_hive_ctx()
  File "C:\Users\yrxt028\Downloads\spark-1.6.2-bin-hadoop2.6\spark-1.6.2-bin-hadoop2.6\python\pyspark\sql\context.py", line 692, in _get_hive_ctx
    return self._jvm.HiveContext(self._jsc.sc())
  File "C:\Users\yrxt028\Downloads\spark-1.6.2-bin-hadoop2.6\spark-1.6.2-bin-hadoop2.6\python\lib\py4j-0.9-src.zip\py4j\java_gateway.py", line 1064,
l__
  File "C:\Users\yrxt028\Downloads\spark-1.6.2-bin-hadoop2.6\spark-1.6.2-bin-hadoop2.6\python\pyspark\sql\utils.py", line 45, in deco
    return f(*a, **kw)
  File "C:\Users\yrxt028\Downloads\spark-1.6.2-bin-hadoop2.6\spark-1.6.2-bin-hadoop2.6\python\lib\py4j-0.9-src.zip\py4j\protocol.py", line 308, in g
_value
py4j.protocol.Py4JJavaError: An error occurred while calling None.org.apache.spark.sql.hive.HiveContext.
: java.lang.RuntimeException: java.lang.RuntimeException: The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rwx--
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)
        at org.apache.spark.sql.hive.client.ClientWrapper.<init>(ClientWrapper.scala:204)
        at org.apache.spark.sql.hive.client.IsolatedClientLoader.createClient(IsolatedClientLoader.scala:238)
        at org.apache.spark.sql.hive.HiveContext.executionHive$lzycompute(HiveContext.scala:218)
        at org.apache.spark.sql.hive.HiveContext.executionHive(HiveContext.scala:208)
        at org.apache.spark.sql.hive.HiveContext.functionRegistry$lzycompute(HiveContext.scala:462)
        at org.apache.spark.sql.hive.HiveContext.functionRegistry(HiveContext.scala:461)
        at org.apache.spark.sql.UDFRegistration.<init>(UDFRegistration.scala:40)
        at org.apache.spark.sql.SQLContext.<init>(SQLContext.scala:330)
        at org.apache.spark.sql.hive.HiveContext.<init>(HiveContext.scala:90)
        at org.apache.spark.sql.hive.HiveContext.<init>(HiveContext.scala:101)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:234)
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:381)
        at py4j.Gateway.invoke(Gateway.java:214)
        at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:79)
        at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:68)
        at py4j.GatewayConnection.run(GatewayConnection.java:209)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rwx------
        at org.apache.hadoop.hive.ql.session.SessionState.createRootHDFSDir(SessionState.java:612)
        at org.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:554)
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:508)
        ... 21 more
  • Sie haben hive separat installiert? oder haben Sie gerade heruntergeladen haben spark und mit dem default-Konfigurationen(hive)?
  • Das hive ist nicht separat installiert. Ich bin mit dem pre-built-Konfiguration für hadoop 2.6. Ich habe immer verwendet pyspark auf meinem mac, das ist das erste mal, Umgang mit udfs auf Windows.
InformationsquelleAutor ML_Passion | 2016-07-18

 

2 Replies
  1. 2

    müssen Sie erstellen hive-site.xml Datei in $SPARK_HOME/conf Lage. Sie können in dieser Datei überschreiben scratch dir Weg. Dies sind die wichtigsten Konfigurationen, die Sie sollten in hive-site.xml – Datei, aber Sie können dies überprüfen,link für weitere Einstellungen, wenn Sie einige andere Fehler:

    <!-- Hive Execution Parameters -->
    <property>
      <name>hadoop.tmp.dir</name>
      <value>${test.tmp.dir}/hadoop-tmp</value>
      <description>A base for other temporary directories.</description>
    </property>
    
    <!--
    <property>
      <name>hive.exec.reducers.max</name>
      <value>1</value>
      <description>maximum number of reducers</description>
    </property>
    -->
    
    <property>
      <name>hive.exec.scratchdir</name>
      <value>${test.tmp.dir}/scratchdir</value>
      <description>Scratch space for Hive jobs</description>
    </property>
    
    <property>
      <name>hive.exec.local.scratchdir</name>
      <value>${test.tmp.dir}/localscratchdir/</value>
      <description>Local scratch space for Hive jobs</description>
    </property>
    <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:derby:;databaseName=${test.tmp.dir}/junit_metastore_db;create=true</value>
    </property>
    
    <property>
      <name>javax.jdo.option.ConnectionDriverName</name>
      <value>org.apache.derby.jdbc.EmbeddedDriver</value>
    </property><property>
      <!--  this should eventually be deprecated since the metastore should supply this -->
      <name>hive.metastore.warehouse.dir</name>
      <value>${test.warehouse.dir}</value>
      <description></description>
    </property>
    
    <property>
      <name>hive.metastore.metadb.dir</name>
      <value>file://${test.tmp.dir}/metadb/</value>
      <description>
      Required by metastore server or if the uris argument below is not supplied
      </description>
    </property>
    
    <property>
      <name>test.log.dir</name>
      <value>${test.tmp.dir}/log/</value>
      <description></description>
    </property>
  2. 0

    In meinem hive-site.xml ich musste einfach folgenden code:

    <configuration>
    
    
    
    <property>
      <name>hive.exec.scratchdir</name>
      <value>${/tmp1/hive}/scratchdir</value>
      <description>Scratch space for Hive jobs</description>
    </property>
    
    <property>
      <name>hive.exec.local.scratchdir</name>
      <value>${/tmp1/hive}/localscratchdir/</value>
      <description>Local scratch space for Hive jobs</description>
    </property>
    
    
    
    </configuration>

    Dieser post hat mir geholfen:

    Was hive-site.xml einschließlich der in $SPARK_HOME aussieht?

    Also anstelle von /tmp/hive , deren Berechtigungen, die ich nicht ändern konnte, habe ich einen anderen Ordner /tmp1/hive. Dank einer Tonne @BigDataLearnner. Es ist eine weitere Möglichkeit zum überschreiben das Verzeichnis, indem Sie spark-env.sh — ich habe es versucht aber es hat nicht funktioniert

    Code für spark-env.sh:

    SPARK_LOCAL_DIRS=/tmp1/hive
    SPARK_PID_DIR=/tmp1 
    • Das hat nicht funktioniert für mich, aber die erweiterte ein von @Ronak Patel hat.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.