<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; baggioss</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/baggioss/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 13:40:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>磨磋 hadoop：touchz 时遇到 InterruptedIOException 原因调查</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/06/23/hadooptouchz-interruptedioexception/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/06/23/hadooptouchz-interruptedioexception/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 06:43:08 +0000</pubDate>
		<dc:creator>baggioss</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[intel]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/06/23/hadooptouchz-interruptedioexception/</guid>
		<description><![CDATA[最近通过hadoop fs -touchz 命令时，时常会遇到WARNING 级别的InterruptedIOException。 首先我们分析下touchz的原理比较简单，就是先create 一个文件，然后在close掉对应的FSDataOutputStream。 首先在hadoop 0.19.1中每个DFSClient拥有一个lease。对应于nn中的LeaseManager，DFSClient的 client name作为一个lease的holder。 lease manager 维护了文件path －&#62; lease和 DFSClient name -&#62; lease -&#62; path (多个) 的映射关系。 如以上流程所示，当DFSClient create一个文件的时候，通过rpc call Namenode 的createFile来创建文件。Namenode调用FSNameSystem的startFile()， FSNameSystem又调用 LeaseManager 的addLease（）为新创建的文件添加一个lease。如果该lease已经存在，则update lease的lastUpdate 时间，并将该文件的path加入到lease中。然后，DFSClient 将通过调用DFSClient的put(),该文件的path put掉DFSClient中的 LeaseChecker中，（如果是第一次put，将会启动LeaseChecker这个守护线程）。这个过程是一个同步调用的过程。 文件create成功之后，守护线程LeaseChecker会每30s, 通过rpc调用renew一下 该DFSClient所拥有的lease。 文件的close（）与create（）是个完全不同的过程。close（）主要完成了2个操作。 1. LeaseChecker的close（）会将pendingCreates 列表中的全部项remove掉，并将文件路径对应的OutputStream全部close 2. interrupt() LeaseChecker 线程 问题就处在close（）的第2步，当LeaseChecker线程正在sleep时，该interrupt exception 将会被catch住，打印一条debug的error msg。如果恰好是Lease checker在renew（），DFSClient同nn通信的socket被interrupt. Client.java 的wrapException（）会将socket被interrupted [...]]]></description>
			<content:encoded><![CDATA[<p>最近通过hadoop fs -touchz 命令时，时常会遇到WARNING 级别的InterruptedIOException。<br />
首先我们分析下touchz的原理比较简单，就是先create 一个文件，然后在close掉对应的FSDataOutputStream。<br />
<img src="http://hi.csdn.net/attachment/201004/10/0_1270877500Q1ZL.gif" alt="" /><br />
首先在hadoop 0.19.1中每个DFSClient拥有一个lease。对应于nn中的LeaseManager，DFSClient的 client name作为一个lease的holder。 lease manager 维护了文件path －&gt; lease和 DFSClient name -&gt; lease -&gt; path (多个) 的映射关系。</p>
<p>如以上流程所示，当DFSClient create一个文件的时候，通过rpc call Namenode 的createFile来创建文件。Namenode调用FSNameSystem的startFile()， FSNameSystem又调用 LeaseManager 的addLease（）为新创建的文件添加一个lease。如果该lease已经存在，则update lease的lastUpdate 时间，并将该文件的path加入到lease中。然后，DFSClient 将通过调用DFSClient的put(),该文件的path put掉DFSClient中的 LeaseChecker中，（如果是第一次put，将会启动LeaseChecker这个守护线程）。这个过程是一个同步调用的过程。</p>
<p>文件create成功之后，守护线程LeaseChecker会每30s, 通过rpc调用renew一下 该DFSClient所拥有的lease。</p>
<p>文件的close（）与create（）是个完全不同的过程。close（）主要完成了2个操作。</p>
<p>1. LeaseChecker的close（）会将pendingCreates 列表中的全部项remove掉，并将文件路径对应的OutputStream全部close</p>
<p>2. interrupt() LeaseChecker 线程</p>
<p>问题就处在close（）的第2步，当LeaseChecker线程正在sleep时，该interrupt exception 将会被catch住，打印一条debug的error msg。如果恰好是Lease checker在renew（），DFSClient同nn通信的socket被interrupt.</p>
<p>Client.java 的wrapException（）会将socket被interrupted 的 exception捕获，并转为IOException丢出，该IOException冲过重重包围，最终被DFSClient中的 LeaseChecker抓获。并扔出个 LOG.warn("Problem renewing lease for " + clientName, ie);</p>
<p>对于被close（），而未来的及释放的lease， lease manager会有一个线程moniter，周期性检查该lease是否超过 hard limit(1小时)。如果超过则将该lease remove掉。</p>
<p>--------------------------------------------------------------------------------</p>
<p>附1 ：Thread interrupt()的jdk说明</p>
<p>If this thread is blocked in a java.nio.channels.Selector then the thread's interrupt status will be set and it will return immediately from the selection operation, possibly with a non-zero value, just as if the selector's wakeup method were invoked.</p>
<p>附2. exception stack：</p>
<p>10/04/05 11:18:20 WARN hdfs.DFSClient: Problem renewing lease for DFSClient_591364472</p>
<p>java.io.IOException: Call to hdpnn/10.249.54.101:9000 failed on local exception: java.io.InterruptedIOException: Interruped while waiting for IO on channel java.nio.channels.SocketChannel[connected local=/172.23.113.43:30811 remote=hdpnn/10.249.54.101:9000]. 60000 millis timeout left.</p>
<p>at org.apache.hadoop.ipc.Client.wrapException(Client.java:732)</p>
<p>at org.apache.hadoop.ipc.Client.call(Client.java:700)</p>
<p>at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:216)</p>
<p>at $Proxy0.renewLease(Unknown Source)</p>
<p>at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)</p>
<p>at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)</p>
<p>at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)</p>
<p>at java.lang.reflect.Method.invoke(Method.java:597)</p>
<p>at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)</p>
<p>at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)</p>
<p>at $Proxy0.renewLease(Unknown Source)</p>
<p>at org.apache.hadoop.hdfs.DFSClient$LeaseChecker.renew(DFSClient.java:958)</p>
<p>at org.apache.hadoop.hdfs.DFSClient$LeaseChecker.run(DFSClient.java:970)</p>
<p>at java.lang.Thread.run(Thread.java:619)</p>
<p>Caused by: java.io.InterruptedIOException: Interruped while waiting for IO on channel java.nio.channels.SocketChannel[connected local=/172.23.113.43:30811 remote=hdpnn/10.249.54.101:9000]. 60000 millis timeout left.</p>
<p>at org.apache.hadoop.net.SocketIOWithTimeout$SelectorPool.select(SocketIOWithTimeout.java:277)</p>
<p>at org.apache.hadoop.net.SocketIOWithTimeout.doIO(SocketIOWithTimeout.java:155)</p>
<p>at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:150)</p>
<p>at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:123)</p>
<p>at java.io.FilterInputStream.read(FilterInputStream.java:116)</p>
<p>at org.apache.hadoop.ipc.Client$Connection$PingInputStream.read(Client.java:272)</p>
<p>at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)</p>
<p>at java.io.BufferedInputStream.read(BufferedInputStream.java:237)</p>
<p>at java.io.DataInputStream.readInt(DataInputStream.java:370)</p>
<p>at org.apache.hadoop.ipc.Client$Connection.receiveResponse(Client.java:494)</p>
<p>at org.apache.hadoop.ipc.Client$Connection.run(Client.java:439)</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/06/23/hadooptouchz-interruptedioexception/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

