我在thrift服务器模式下运行配置单元.我在jar文件中有一个UDF,我试图通过运行来使用它
add jar <path to jar>
create temporary function func_name as 'com.test.udf.UDF_CLASS'
Run Code Online (Sandbox Code Playgroud)
但是,当我运行create temporary function命令时,我收到一个错误
查询返回非零代码:9,原因:FAILED:执行错误,从org.apache.hadoop.hive.ql.exec.FunctionTask返回代码1
我已经检查了jar的名称和路径以及运行hive服务器的用户是否具有访问jar的所有正确权限.奇怪的是,如果我在CLI模式下运行配置单元并运行完全相同的命令,那么一切正常.关于为何hive CLI可能与hive thrift服务器表现不同的任何想法?
我是hadoop的新手,我花了几个小时试图谷歌这个问题,但我找不到任何有用的东西.我的问题是HDFS说文件仍然是打开的,即使写入它的过程已经很久了.这使得无法从文件中读取.
我在目录上运行了fsck,它报告一切都很健康.但是,当我运行"hadoop fsck -fs hdfs:// hadoop/logs/raw/directory_containing_file -openforwrite"时,我得到了
Status: CORRUPT
Total size: 222506775716 B
Total dirs: 0
Total files: 630
Total blocks (validated): 3642 (avg. block size 61094666 B)
********************************
CORRUPT FILES: 1
MISSING BLOCKS: 1
MISSING SIZE: 30366208 B
********************************
Minimally replicated blocks: 3641 (99.97254 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 0 (0.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 2
Average block replication: 2.9991763
Corrupt blocks: 0
Missing replicas: 0 (0.0 %)
Number of data-nodes: …
Run Code Online (Sandbox Code Playgroud) 编辑:我已经发现单例的构造函数被多次调用,因此看起来这些类被单独的类加载器多次加载.如何在Tomcat中创建全局单例?我一直在谷歌搜索,但到目前为止没有运气.
我有一个像我这样构造的单例对象:
private static volatile KeyMapper mapper = null;
public static KeyMapper getMapper()
{
if(mapper == null)
{
synchronized(Utils.class)
{
if(mapper == null)
{
mapper = new LocalMemoryMapper();
}
}
}
return mapper;
}
Run Code Online (Sandbox Code Playgroud)
KeyMapper类基本上是HashMap的同步包装器,只有两个函数,一个用于添加映射,另一个用于删除映射.在我的32位Windows机器上运行Tomcat 6.24时,一切正常.然而,当在64位Linux机器(带有OpenJDK 1.6.0-b09的CentOS 5.4)上运行时,我添加一个映射并打印出KeyMapper使用的HashMap的大小,以验证添加的映射(即验证大小= 1).然后我尝试用另一个请求检索映射,并且我一直变为null,当我检查HashMap的大小时它是0.我确信映射不会被意外删除,因为我已经注释掉所有要删除的调用(我不使用clear或任何其他mutators,只是获取和放置).
请求通过Tomcat 6.24(配置为使用200个线程,最少4个线程)并且我将-Xnoclassgc传递给jvm以确保类不会无意中收集垃圾(jvm也在-server模式下运行).我还为KeyMapper添加了一个finalize方法,如果它被垃圾收集以确认它没有被垃圾收集,则打印到stderr.
我在我的智慧结束,我无法弄清楚为什么一分钟HashMap中的条目存在而下一个不是:(
我的server.xml如下所示:
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="200"
minSpareThreads="4"/>
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="10000"
maxKeepAliveRequests="1"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Run Code Online (Sandbox Code Playgroud)
但是,在Tomcat管理器(http:// localhost/manager/status)中,它显示如下
http-8080: Max threads: -1 Current thread count: -1 Current thread busy: -1
jk-8009: Max threads: 200 Current thread count: 4 Current thread busy: 1
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它看起来像http-8080没有使用执行程序,即使它也被指示并且jk-8009正在使用执行程序,即使它没有被指示.经理只是误报或我没有正确设置线程池?