当我在 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

Amazon EMR:Pyspark 有奇怪的依赖问题

EMR pyspark notebook Spark 进度小部件不见了

MapReduce 作业(用 python 编写)在 EMR 上运行缓慢

如何使用 AWS Lambda 在 AWS EMR 上运行 PySpark