hadoop中的NullpointException

本文详细介绍了在使用Hadoop进行日志文件存储时,遇到的NullPointException问题,主要原因是传递给HDFS接口的路径包含不必要的前缀。文章深入分析了问题原因,并提供了解决方案,即在调用HDFS接口时,应确保路径字符串不包含'hdfs://'前缀。此外,还解释了如何通过强制关闭文件来恢复未关闭状态的文件,以避免后续操作中的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做一个hadoop项目中,利用HDFS存储日志文件。为了将未关闭的文件进行恢复,我们需要判断一个文件是否为正在打开的状态。fs.getClient().namenode.getBlockLocations(path.toUri().getPath(), 0,

fs.getFileStatus(path).getLen()).isUnderConstruction();通过这个调用可以获取是否在打开。再调用fs.recoverLease(path)去强制关闭该文件。由于我们在getBlockLocations中最初用path.toString方法去调,结果导致以下NullPointException

org.apache.hadoop.ipc.RemoteException: java.io.IOException: java.lang.NullPointerException

       at org.apache.hadoop.ipc.Client.call(Client.java:1107)
       at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:226)
       at $Proxy0.getBlockLocations(Unknown Source)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:597)
       at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)
       at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)
       at $Proxy0.getBlockLocations(Unknown Source)
       at com.webex.da.hdc.web.DFSServlet.isOpen(DFSServlet.java:272)
       at com.webex.da.hdc.web.DFSServlet.rename(DFSServlet.java:255)
       at com.webex.da.hdc.web.DFSServlet.handleRename(DFSServlet.java:182)
       at com.webex.da.hdc.web.DFSServlet.doPost(DFSServlet.java:93)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
       at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)

 经过仔细调查,发现是path的问题,path.toString将会有hdfs://namenode前缀,而这个接口不应该包含这个前缀。因此我们在调用HDFS接口时一定要消息,如果要传递path为字符串,不应该包含前缀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值