当我在 pyspark EMR 5.x 中运行用 Java 编写的 hive UDF 时出错
Posted
技术标签:
【中文标题】当我在 pyspark EMR 5.x 中运行用 Java 编写的 hive UDF 时出错【英文标题】:Getting Error when I ran hive UDF written in Java in pyspark EMR 5.x 【发布时间】:2017-01-09 10:22:28 【问题描述】:我有一个用 java 编写的 Hive UDF,我正在尝试在 pyspark 2.0.0 中使用它。以下是步骤 1.将jar文件复制到EMR 2. 开始一个 pyspark 工作,如下所示
pyspark --jars ip-udf-0.0.1-SNAPSHOT-jar-with-dependencies-latest.jar
3。使用以下代码访问 UDF
from pyspark.sql import SparkSession
from pyspark.sql import HiveContext
sc = spark.sparkContext
sqlContext = HiveContext(sc)
sqlContext.sql("create temporary function ip_map as 'com.mediaiq.hive.IPMappingUDF'")
我收到以下错误:
py4j.protocol.Py4JJavaError:调用 o43.sql 时出错。 : java.lang.NoSuchMethodError: org.apache.hadoop.hive.conf.HiveConf.getTimeVar(Lorg/apache/hadoop/hive/conf/HiveConf$ConfVars;Ljava/util/concurrent/TimeUnit;)J 在 org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.(RetryingMetaStoreClient.java:76) 在 org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:132) 在 org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:104) 在 org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:98) 在 org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:2453) 在 org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:2465) 在 org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:340) 在 org.apache.spark.sql.hive.client.HiveClientImpl.(HiveClientImpl.scala:189) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 方法)在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.apache.spark.sql.hive.client.IsolatedClientLoader.createClient(IsolatedClientLoader.scala:258) 在 org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:359) 在 org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:263) 在 org.apache.spark.sql.hive.HiveSharedState.metadataHive$lzycompute(HiveSharedState.scala:39) 在 org.apache.spark.sql.hive.HiveSharedState.metadataHive(HiveSharedState.scala:38) 在 org.apache.spark.sql.hive.HiveSharedState.externalCatalog$lzycompute(HiveSharedState.scala:46) 在 org.apache.spark.sql.hive.HiveSharedState.externalCatalog(HiveSharedState.scala:45) 在 org.apache.spark.sql.hive.HiveSessionState.catalog$lzycompute(HiveSessionState.scala:50) 在 org.apache.spark.sql.hive.HiveSessionState.catalog(HiveSessionState.scala:48) 在 org.apache.spark.sql.hive.HiveSessionState$$anon$1.(HiveSessionState.scala:63) 在 org.apache.spark.sql.hive.HiveSessionState.analyzer$lzycompute(HiveSessionState.scala:63) 在 org.apache.spark.sql.hive.HiveSessionState.analyzer(HiveSessionState.scala:62) 在 org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:49) 在 org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:64) 在 org.apache.spark.sql.SparkSession.sql(SparkSession.scala:582) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:237) 在 py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 在 py4j.Gateway.invoke(Gateway.java:280) 在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands.CallCommand.execute(CallCommand.java:79) 在 py4j.GatewayConnection.run(GatewayConnection.java:214) 在 java.lang.Thread.run(Thread.java:745)
【问题讨论】:
我查看了以下链接,但没有太大帮助。[***.com/questions/38491483/… 【参考方案1】:您可能使用不同版本的 Hive 构建了 UDF。请务必在 pom.xml
中指定用于构建包含 UDF 的 jar 的相同版本的 Hive。例如,请参阅this previous answer。
【讨论】:
以上是关于当我在 pyspark EMR 5.x 中运行用 Java 编写的 hive UDF 时出错的主要内容,如果未能解决你的问题,请参考以下文章
当我在 AWS EMR Studio 中使用 saveAsTable 保存 PySpark DataFrame 时,它会保存在哪里?
无法访问 EMR 集群 jupyter notebook 中的 pyspark
EMR pyspark notebook Spark 进度小部件不见了