2017-08-06 737 views
0

我被困在使用UDF jar中。我需要在我的UDF中解析簡單的UserAgent。我發現了一個流行的UserAgent解析器http://www.bitwalker.eu/software/user-agent-utils,它包含在我的項目中。在項目中我使用maven。我添加了所有的依賴關係,實現了eveyrthing並對其進行測試。它在我的本地機器上正常工作。接下來,我會在用於構建jar的maven中進行乾淨安裝。我通過添加jar {MyJarName}在Hive中使用這個jar,然後創建一個函數:創建臨時函數{functionName}爲{pathToUDFClass},並得到像這樣的異常。Hive UDF引發類未找到異常在選擇

Caused by: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {"bidid":"8326c0ec49e5746f1af03400f37e5797","tstamp":20131022185001163,"logtype":1 
,"ipinyouid":"D89E8S5bwWz","useragent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; InfoPath.2)","ip":"61.138.253.*","regionid":374,"cityid":375,"adexchange":1 
,"domain":"449a7568331085d43d5867de26ce1ee1","url":"5ecba5b62bafd3428cdc1398b40cf88f","anonymousurl":"null","adslotid":null,"adslotwidth":300,"adslotheight":250,"adslotvisibility":"Na","adslotformat":"Na","adslo 
tfloorprice":0,"creativeid":"10722","biddingprice":294,"payingprice":135,"landingpageurl":"null","advertiserid":2821,"userprofileids":[10006,10110,10063]}               
     at org.apache.hadoop.hive.ql.exec.tez.MapRecordSource.processRow(MapRecordSource.java:91)                             
     at org.apache.hadoop.hive.ql.exec.tez.MapRecordSource.pushRecord(MapRecordSource.java:68)                             
     at org.apache.hadoop.hive.ql.exec.tez.MapRecordProcessor.run(MapRecordProcessor.java:325)                             
     at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:150)                           
     ... 14 more                                                 
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {"bidid":"8326c0ec49e5746f1af03400f37e5797","tstamp":20131022185001163,"logtype":1,"ipinyouid":"D89E8S5bwWz"," 
useragent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; InfoPath.2)","ip":"61.138.253.*","regionid":374,"cityid":375,"adexchange":1,"domain":"449a7568331085d43 
d5867de26ce1ee1","url":"5ecba5b62bafd3428cdc1398b40cf88f","anonymousurl":"null","adslotid":null,"adslotwidth":300,"adslotheight":250,"adslotvisibility":"Na","adslotformat":"Na","adslotfloorprice":0,"creativeid": 
"10722","biddingprice":294,"payingprice":135,"landingpageurl":"null","advertiserid":2821,"userprofileids":[10006,10110,10063]}                      
     at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:565)                                 
     at org.apache.hadoop.hive.ql.exec.tez.MapRecordSource.processRow(MapRecordSource.java:83)                             
     ... 17 more                                                 
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public org.apache.hadoop.io.Text hive.homework3.UserAgentDetector.evaluate(org.apache.hadoop.io.Text) on object hive.homewor 
[email protected] of class hive.homework3.UserAgentDetector with arguments {Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; InfoPath.2):org.apache.hadoo 
p.io.Text} of size 1                                                
     at org.apache.hadoop.hive.ql.exec.FunctionRegistry.invoke(FunctionRegistry.java:1019)                              
     at org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge.evaluate(GenericUDFBridge.java:182)                            
     at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator._evaluate(ExprNodeGenericFuncEvaluator.java:186)                        
     at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:77)                              
     at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:65)                              
     at org.apache.hadoop.hive.ql.exec.SelectOperator.process(SelectOperator.java:81)                               
     at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:841)                                  
     at org.apache.hadoop.hive.ql.exec.TableScanOperator.process(TableScanOperator.java:133)                              
     at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:170)                              
     at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:555)                                 
     ... 18 more                                                 
Caused by: java.lang.reflect.InvocationTargetException                                        
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)                                    
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)                               
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)                             
     at java.lang.reflect.Method.invoke(Method.java:498)                                       
     at org.apache.hadoop.hive.ql.exec.FunctionRegistry.invoke(FunctionRegistry.java:995)                              
     ... 27 more                                                 
Caused by: java.lang.NoClassDefFoundError: eu/bitwalker/useragentutils/UserAgent                                 
     at hive.homework3.UserAgentDetector.formatter(UserAgentDetector.java:30)                                 
     at hive.homework3.UserAgentDetector.evaluate(UserAgentDetector.java:22)                                  
     ... 32 more                                                 
Caused by: java.lang.ClassNotFoundException: eu.bitwalker.useragentutils.UserAgent                                 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381)                                    
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)                                     
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)                                   
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)                                     
     ... 34 more                                                 
]], Vertex did not succeed due to OWN_TASK_FAILURE, failedTasks:1 killedTasks:21, Vertex vertex_1501829365845_0009_1_00 [Map 1] killed/failed due to:OWN_TASK_FAILURE]DAG did not succeed due to VERTEX_FAILURE. fa 
iledVertices:1 killedVertices:0 
從這些

,因爲我明白,最重要的是:

Caused by: java.lang.ClassNotFoundException: eu.bitwalker.useragentutils.UserAgent                                 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381)                                    
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)                                     
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)                                   
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)                                     
     ... 34 more  

我在Maven項目使用外部庫。

這是UDF創建,順便在本地工作中,一切正常,並通過測試。但是在Hive中它不起作用。我想這個我使用的lib有問題,但是如果我在本地工作正常可以嗎?

import eu.bitwalker.useragentutils.UserAgent; 
import org.apache.hadoop.hive.ql.exec.Description; 
import org.apache.hadoop.hive.ql.exec.UDF; 
import org.apache.hadoop.io.Text; 


@Description(
     name = "agentdetector", 
     value = "_FUNC_(str) - detects a user-agent of user", 
     extended = "Example:\n" + 
       " > SELECT agent(line) FROM test ipy; \n" 
) 
public class UserAgentDetector extends UDF { 

    public Text evaluate(Text text) { 
     Text value = new Text(""); 
     if (text != null) { 
      value.set(formatter(text)); 
      return value; 
     } else { 
      return null; 
     } 
    } 

    private Text formatter(Text text) { 
     UserAgent userAgent = UserAgent.parseUserAgentString(text.toString()); 
     StringBuilder builder = new StringBuilder(); 
     builder.append("Browser : ").append(userAgent.getBrowser().getName()).append("\n"); 
     text.set(builder.toString()); 
     return text; 
    } 

而且對Maven的依賴是:

<dependency> 
      <groupId>eu.bitwalker</groupId> 
      <artifactId>UserAgentUtils</artifactId> 
      <version>1.20</version> 
    </dependency> 

回答

1

爲了解決這個問題,只需添加插件,在您的pom.xml

  <plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <configuration> 
        <archive> 
         <manifest> 
          <mainClass>{pathToMainClass}</mainClass> 
         </manifest> 
        </archive> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
       </configuration> 
      </plugin> 

和運行的彙編:Maven中的插件組裝。