Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2306170
  • 博文数量: 266
  • 博客积分: 5485
  • 博客等级: 大校
  • 技术积分: 3695
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-20 11:05
个人简介

多读书,多做事,广交朋友,趣味丛生

文章分类

全部博文(266)

分类: 云计算

2012-08-31 17:54:44

一. FileSystem close导致图片访问和服务器tcp负载问题
 
  问题描述:通过HDFS API将图片上传到HDFS,客户端图片列表出现图片显示不完

整的情况,并且随机性很大,另外频繁刷新图片列表,服务器tcp连接数飙升,

50010端口的NameNode进程ESTABLISHED却不释放,严重影响服务器负载
   
   解决问题过程

1. 开始分析客户端Web Socket访问程序,并做简单的程序对比进行测试,

排除了客户端的问题;

        2. 确定是HDFS出现问题,从写的HDFS访问API着手,分析读取过程,经测

试发现是FileSystem的问题,当调用fs.close()方法时,访问单个图片运行正常,

当在一个页面中发送访问多个图片的servlet请求时,程序即出现FileSystem is 

closed异常,可以确定是这里的问题。
        
        查看Hadoop的源码发现,在fs.close方法内部,hadoop将clientRunning调

为false,这样,当第一加载的图片显示后,后面的图片调用open方法时,在

checkOpen方法中会发现clientRunning为false,随即抛出异常,代码如下:

点击(此处)折叠或打开

  1. /**
  2.    * Close the file system, abandoning all of the leases and files being
  3.    * created and close connections to the namenode.
  4.    */
  5.   public synchronized void close() throws IOException {
  6.     if(clientRunning) {
  7.       leasechecker.close();
  8.       clientRunning = false;
  9.       try {
  10.         leasechecker.interruptAndJoin();
  11.       } catch (InterruptedException ie) {
  12.       }
  13.   
  14.       // close connections to the namenode
  15.       RPC.stopProxy(rpcNamenode);
  16.     }
  17.   }

 点击(此处)折叠或打开

  1. private void checkOpen() throws IOException {
  2.     if (!clientRunning) {
  3.       IOException result = new IOException("Filesystem closed");
  4.       throw result;
  5.     }
  6.   }
一周的不眠夜总算有个句号,hadoop和分布式编程要从源码和原理入手啊,

千万不要以为把环境配置好就诸事顺利,后面的路还很长很值得回味哈,加油~

阅读(2998) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~