<?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>lee的个人空间</title>
	<atom:link href="http://www.javali.org/feed" rel="self" type="application/rss+xml" />
	<link>http://www.javali.org</link>
	<description>理论指导实践，实践验证理论</description>
	<lastBuildDate>Wed, 07 Sep 2011 16:39:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>shell script统计——用array充当map</title>
		<link>http://www.javali.org/435</link>
		<comments>http://www.javali.org/435#comments</comments>
		<pubDate>Wed, 07 Sep 2011 16:35:48 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[shell script]]></category>

		<guid isPermaLink="false">http://www.javali.org/?p=435</guid>
		<description><![CDATA[对于扣订人员来说，用程序实现自动化流程处理是非常省事的，如同google的广告系统，它完全不需要人工干预，简直就是一部造钱的机器。 让人蛋疼的是我所做的工作本是自动化的，近期由于合作方问题，导致数据不再符合自动化统计流程，领导有命：统计数据还是要形成常态出具的，悲催的我只能领命。 对于大量的日志数据，虽不能全自动化，但也不至于完全靠手工，实现个半自动化统计程序应对短期的突发事故还是可行的 日志格式以竖线分隔，需要统计出每个位置的点击数，需求比较简单，首先考虑的是利用shell来完成。 可利用cut来截取所需字段，另shell script做数值运算也挺简单，但需要一个类似map的存储结构，位置作为key, 点击数作为value shell没有map类型数据结构，仅有的是array，查阅了相关array使用方法后，在特定场合可以将array充当map来使用——位置当作array的下标，该位置的点击数则充当array下标的值 代码如下： #! /bin/bash #author sawenlee 2011-09-01 #func   calculate the sum of each position # PATH=.:/usr/local/bin:/bin:/usr/bin:/usr/sbin/:/sbin:/usr/local/sbin:/home/dev/bin:/usr/local/mysql/bin export PATH base=/data/urlred #args length must be greater than 0 if [ $# == "0" ]; then echo &#8220;Usage: [calc_click] src_file&#8221; exit 1 fi declare -a result #we need an data [...]]]></description>
			<content:encoded><![CDATA[<p>对于扣订人员来说，用程序实现自动化流程处理是非常省事的，如同google的广告系统，它完全不需要人工干预，简直就是一部造钱的机器。</p>
<p>让人蛋疼的是我所做的工作本是自动化的，近期由于合作方问题，导致数据不再符合自动化统计流程，领导有命：统计数据还是要形成常态出具的，悲催的我只能领命。</p>
<p>对于大量的日志数据，虽不能全自动化，但也不至于完全靠手工，实现个半自动化统计程序应对短期的突发事故还是可行的</p>
<p>日志格式以竖线分隔，需要统计出每个位置的点击数，需求比较简单，首先考虑的是利用shell来完成。</p>
<p>可利用cut来截取所需字段，另shell script做数值运算也挺简单，但需要一个类似map的存储结构，位置作为key, 点击数作为value</p>
<p>shell没有map类型数据结构，仅有的是array，查阅了相关array使用方法后，在特定场合可以将array充当map来使用——位置当作array的下标，该位置的点击数则充当array下标的值</p>
<p>代码如下：</p>
<div>#! /bin/bash</div>
<div>#author sawenlee 2011-09-01</div>
<div>#func   calculate the sum of each position</div>
<div>#</div>
<div>PATH=.:/usr/local/bin:/bin:/usr/bin:/usr/sbin/:/sbin:/usr/local/sbin:/home/dev/bin:/usr/local/mysql/bin</div>
<div>export PATH</div>
<div>base=/data/urlred</div>
<div>#args length must be greater than 0</div>
<div>if [ $# == "0" ]; then</div>
<div>echo &#8220;Usage: [calc_click] src_file&#8221;</div>
<div>exit 1</div>
<div>fi</div>
<div>declare -a result #we need an data structure to collect results</div>
<div>declare -i num</div>
<div>maxLen=100 #set array max length</div>
<div>#this is the target file we are goting to handle</div>
<div>txtFile=$base/$1</div>
<div>if test -e $txtFile ; then</div>
<div>echo &#8220;starting to handle file : $txtFile&#8221;</div>
<div>echo &#8220;Index  count&#8221;</div>
<div>for pos in `cat $txtFile | grep success| cut -d &#8216;|&#8217; -f 4` ;  #截取位置元素</div>
<div>do</div>
<div>if [ $pos -lt $maxLen -a  $pos -gt 0 ]; then   #过滤掉无效的位置</div>
<div>((result[$pos]++))                                            #shell script的数值运算很特别</div>
<div>fi</div>
<div>done</div>
<div>for  ((i = 1; i &lt;= $maxLen; i++))                    #输出结果</div>
<div>do</div>
<div>if test ! -z &#8220;${result[$i]}&#8221;  ; then                    #如果有值才输出</div>
<div>echo &#8220;$i ${result[$i]}&#8221;</div>
<div>fi</div>
<div>done</div>
<div>else</div>
<div>echo &#8220;$txtFile doesn&#8217;t exist&#8221;</div>
<div>fi</div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javali.org/435/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MapReduce记录——合理选择Key优化UV计算</title>
		<link>http://www.javali.org/419</link>
		<comments>http://www.javali.org/419#comments</comments>
		<pubDate>Wed, 07 Sep 2011 15:36:45 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[资料总结]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[map reduce]]></category>
		<category><![CDATA[uv]]></category>

		<guid isPermaLink="false">http://www.javali.org/?p=419</guid>
		<description><![CDATA[根据MapReduce计算的流程，在Map阶段选择好KeyValue，然后在reduce中输出计算结果，计算UV的话，最终的结果只是一个数字 我最开始的思路是: map阶段选择常数1作为key,uid作为value,在reduce阶段将map输出放置到HashSet中排重，输出hashSet的size即为正确的UV 我运行的日志如下： 11/08/22 16:14:54 INFO mapred.JobClient:   FileSystemCounters 11/08/22 16:14:54 INFO mapred.JobClient:     FILE_BYTES_READ=817583842 11/08/22 16:14:54 INFO mapred.JobClient:     HDFS_BYTES_READ=11406242768 11/08/22 16:14:54 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=1459132572 11/08/22 16:14:54 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=9 11/08/22 16:14:54 INFO mapred.JobClient:   Map-Reduce Framework 11/08/22 16:14:54 INFO mapred.JobClient:     Reduce input groups=1 11/08/22 [...]]]></description>
			<content:encoded><![CDATA[<p>根据MapReduce计算的流程，在Map阶段选择好KeyValue，然后在reduce中输出计算结果，计算UV的话，最终的结果只是一个数字</p>
<p>我最开始的思路是:</p>
<p>map阶段选择常数1作为key,uid作为value,在reduce阶段将map输出放置到HashSet中排重，输出hashSet的size即为正确的UV</p>
<p>我运行的日志如下：</p>
<div>11/08/22 16:14:54 INFO mapred.JobClient:   FileSystemCounters</div>
<div>11/08/22 16:14:54 INFO mapred.JobClient:     FILE_BYTES_READ=817583842</div>
<div>11/08/22 16:14:54 INFO mapred.JobClient:     HDFS_BYTES_READ=11406242768</div>
<div>11/08/22 16:14:54 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=1459132572</div>
<div>11/08/22 16:14:54 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=9</div>
<div>11/08/22 16:14:54 INFO mapred.JobClient:   Map-Reduce Framework</div>
<div><span style="color: #ff0000;">11/08/22 16:14:54 INFO mapred.JobClient:     Reduce input groups=1</span></div>
<div>11/08/22 16:14:54 INFO mapred.JobClient:     Combine output records=0</div>
<div>11/08/22 16:14:54 INFO mapred.JobClient:     Map input records=5097005</div>
<div>11/08/22 16:14:54 INFO mapred.JobClient:     Reduce shuffle bytes=0</div>
<div><span style="color: #ff0000;">11/08/22 16:14:54 INFO mapred.JobClient:     Reduce output records=1</span></div>
<div>11/08/22 16:14:54 INFO mapred.JobClient:     Spilled Records=17676018</div>
<div>11/08/22 16:14:54 INFO mapred.JobClient:     Map output bytes=61164060</div>
<div>11/08/22 16:14:54 INFO mapred.JobClient:     Combine input records=0</div>
<div><span style="color: #ff0000;">11/08/22 16:14:54 INFO mapred.JobClient:     Map output records=5097005</span></div>
<div><span style="color: #ff0000;">11/08/22 16:14:54 INFO mapred.JobClient:     Reduce input records=5097005</span></div>
<div><span style="color: #ff0000;"><span style="color: #000000;">从以上红色标记日志可以看出处理记录数为5097005条，但reduce分组为1，reduce输出结果也为1</span></span></div>
<div>这是因为key值相同，在mapreduce过程中会将相同的key归并在一起，不难理解这种情况仅仅只有一个reduce任务</div>
<div>由此造成的后果是reduce任务只会在集群其中一个节点上运行，不仅没有利用好集群处理能力，反倒因为大量数据集中而导致计算效率低下，如果出现OOM异常，那也算正常(因为将所有用户都放置到一个hashset中)</div>
<div>改进：</div>
<div>既然reduce任务负载不均衡是因为key单一导致，那可以打散key，把reduce任务分解成N个，分配到整个集群上计算；这就可以解决问题</div>
<div>我在map阶段把uid整数化后（为什么要整数化，而不直接用字符串？这个大家都应该清楚，整数相对字符串而言，整数更节省存储容量，值比较效率更高） 对1000取模充当key,value为uid; 于是就有1000个不同的key，也将产生1000个reduce任务，这样就充分利用了集群的计算能力；</div>
<div>map阶段     key: uid%1000                   value: uid</div>
<div>这样就会产生0-999的key，reduce部分不需要改动，输出的结果可能如下：</div>
<p>uid%1000=0       XXX</p>
<p>uid%1000=1        XXX</p>
<p>uid%1000=2       XXXX</p>
<p>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.</p>
<p>uid%1000=998   XXXX</p>
<p>uid%1000=999   XXXX</p>
<p>上面输出的结果并非我需要的，但无碍，可以在这基础上再做mapreduce一遍，reduce任务里求和就可以了</p>
<p>map代码：<br />
public void map(Object key, Text value, Context ctx)<br />
throws IOException, InterruptedException {<br />
try {</p>
<p>String[] elements = value.toString().split(&#8220;\\|&#8221;); // 按|分隔符打散</p>
<p>String userid = elements[7]; // 获取用户标识</p>
<p>long uidHash = NetUtil.hash(NetUtil.computeMd5(userid), 0); // 哈希转整数</p>
<p>int mapKey = (int) (uidHash % 1000);//取模将key打散</p>
<p>ctx.write(new IntWritable(mapKey), new LongWritable(uidHash));</p>
<p>} catch (Exception e) {<br />
e.printStackTrace();<br />
return;<br />
}<br />
}</p>
<p>reduce代码</p>
<p>public void reduce(IntWritable key, Iterable&lt;LongWritable&gt; values,<br />
Context ctx) throws IOException, InterruptedException {</p>
<p>Set&lt;Long&gt; uidSet = new HashSet&lt;Long&gt;();</p>
<p>Iterator&lt;LongWritable&gt; iter = values.iterator();<br />
while (iter.hasNext()) {<br />
long uid = iter.next().get();<br />
uidSet.add(uid);<br />
}</p>
<p>ctx.write(key, new LongWritable(uidSet.size()));<br />
}</p>
<div>运行后的日志如下：</div>
<div><span style="color: #ff0000;"><br />
</span></div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:   FileSystemCounters</div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:     FILE_BYTES_READ=817583986</div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:     HDFS_BYTES_READ=11406242768</div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=1459132860</div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=7890</div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:   Map-Reduce Framework</div>
<div><span style="color: #ff0000;">11/08/22 16:08:39 INFO mapred.JobClient:     Reduce input groups=1000</span></div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:     Combine output records=0</div>
<div><span style="color: #ff0000;">11/08/22 16:08:39 INFO mapred.JobClient:     Map input records=5097005</span></div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:     Reduce shuffle bytes=0</div>
<div><span style="color: #ff0000;">11/08/22 16:08:39 INFO mapred.JobClient:     Reduce output records=1000</span></div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:     Spilled Records=17676018</div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:     Map output bytes=61164060</div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:     Combine input records=0</div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:     Map output records=5097005</div>
<div>11/08/22 16:08:39 INFO mapred.JobClient:     Reduce input records=5097005</div>
<div>同样的输入记录数，但可以看到以分散成了1000个reduce任务，输出结果同样是1000个</div>
]]></content:encoded>
			<wfw:commentRss>http://www.javali.org/419/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>一个Nio异常——ClosedSelectorException</title>
		<link>http://www.javali.org/423</link>
		<comments>http://www.javali.org/423#comments</comments>
		<pubDate>Sat, 03 Sep 2011 03:02:15 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[资料总结]]></category>
		<category><![CDATA[ClosedSelectorException]]></category>
		<category><![CDATA[mina]]></category>
		<category><![CDATA[nio]]></category>

		<guid isPermaLink="false">http://www.javali.org/?p=423</guid>
		<description><![CDATA[最近自己写的nio程序持续报错（client-server端借助mina实现） DefaultExceptionMonitor.exceptionCaught(45) 2011-09-02 09:40:57 &#124; Unexpected exception. java.nio.channels.ClosedSelectorException at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:66) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80) at org.apache.mina.transport.socket.nio.NioProcessor.select(NioProcessor.java:69) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:961) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) at java.lang.Thread.run(Thread.java:595) 通过搜索引擎没有查出问题，但可能的原因是线程阻塞在Selector.select()时，调用了wakeup方法,而此时selector已经关闭 与淘宝大牛 @dennis zhuang 对这个问题做了一次交流，他与我一致认为问题不在mina上，而在于使用错误，导致mina关闭了selector。 因client每发送一次消息都会报一次异常，Dennis 以此推断是我用短连接但没有复用NioSocketConnector造成的，client端发送完消息关闭NioSocketConnector就可能报ClosedSelectorException问题，这涉及mina的内部实现： 当client端关闭connector，mina要关闭NioProcessor线程，此时线程正阻塞在select上，所以先关闭selector，然后唤醒它，mina就会提示selector已经被关闭 此外创建NioSocketConnector代价太大，所以即使用短连接也得考虑复用它，而不是每通信完一次，就将其关闭，这样就可以解决异常问题（复用connector不关闭它），同时还能提高性能。当然最好的是用mina构建client-server的长连接，实现重连机制，通信稳定且性能更优！]]></description>
			<content:encoded><![CDATA[<p>最近自己写的nio程序持续报错（client-server端借助mina实现）</p>
<p>DefaultExceptionMonitor.exceptionCaught(45) 2011-09-02 09:40:57 | Unexpected exception.<br />
java.nio.channels.<span style="color: #ff0000;">ClosedSelectorException</span><br />
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:66)<br />
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)<br />
at org.apache.mina.transport.socket.nio.NioProcessor.select(NioProcessor.java:69)<br />
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:961)<br />
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)<br />
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)<br />
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)<br />
at java.lang.Thread.run(Thread.java:595)</p>
<p>通过搜索引擎没有查出问题，但可能的原因是线程阻塞在Selector.select()时，调用了wakeup方法,而此时selector已经关闭</p>
<p>与淘宝大牛 @dennis zhuang 对这个问题做了一次交流，他与我一致认为问题不在mina上，而在于使用错误，导致mina关闭了selector。</p>
<p>因client每发送一次消息都会报一次异常，Dennis 以此推断是我用短连接但没有复用NioSocketConnector造成的，client端发送完消息关闭NioSocketConnector就可能报ClosedSelectorException问题，这涉及mina的内部实现：</p>
<p><span style="color: #ff0000;">当client端关闭connector，mina要关闭NioProcessor线程，此时线程正阻塞在select上，所以先关闭selector，然后唤醒它，mina就会提示selector已经被关闭</span></p>
<p>此外创建NioSocketConnector代价太大，所以即使用短连接也得考虑复用它，而不是每通信完一次，就将其关闭，这样就可以解决异常问题（复用connector不关闭它），同时还能提高性能。当然最好的是用mina构建client-server的长连接，实现重连机制，通信稳定且性能更优！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javali.org/423/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>NginX多域名跳转总结</title>
		<link>http://www.javali.org/401</link>
		<comments>http://www.javali.org/401#comments</comments>
		<pubDate>Sun, 14 Aug 2011 03:59:47 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[资料总结]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[域名映射]]></category>

		<guid isPermaLink="false">http://www.javali.org/?p=401</guid>
		<description><![CDATA[&#160; 简要需求如下(注：以下域名和ip形式纯属假象，你肯定没见过a.b.c.d的ip，这些字母代表0-255之间的数字)： 1,aaa.com———&#62;a.b.c.d:8080/web 2,aaa.com/admin&#8211;&#62;a.b.c.d:8082/admin 3,bbb.com&#8212;&#8212;&#8212;-&#62;a.b.c.d:8083/wap 经过多次的尝试，始终没法把第一条和第三条映射上，nginx的简化配置如下： server aaa.com location / { proxy_pass http://a.b.c.d:8080/web } location /admin{ proxy_pass http://a.b.c.d:8082/admin } server bbb.com location /{ proxy_pass http://a.b.c.d:8083/wap } # service nginx reconfigure后发现除了第二条映射生效外，其他两个都始终报302 404错误，然后将第一、三条 location / 分别改成 /web   /wap 与/admin一致后，然后通过aaa.com/web  aaa.com/wap访问就能成功，通过这规律可能是一个域名只能映射到ip:port；而到模块名就必须也得在域名后加上相应的模块名;而且要用到模块名，在location处的映射必须与应用名一致即如果配置了下面这种形式同样会出错： server aaa.com location /myAdmin{ proxy_pass http://a.b.c.d:8082/admin; } 以上红色字体部分对某些应用必须要相同，否则没法跳转。 根据现有情况，只能改变应用模块的访问方式了，将web,wap所有的应用名去掉，保证a.b.c.d:8080就能访问到web站点，而不需要加上/web,wap同理 改动后自己服务器上测试后通过！ &#160; nginx安装：http://www.javali.org/360]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p><img title="insalling-configuring-nginx-003" src="http://www.javali.org/wp-content/uploads/2011/08/insalling-configuring-nginx-003.gif" alt="" width="634" height="363" /></p>
<p>简要需求如下(注：以下域名和ip形式纯属假象，你肯定没见过a.b.c.d的ip，这些字母代表0-255之间的数字)：</p>
<p>1,aaa.com———&gt;a.b.c.d:8080/web</p>
<p>2,aaa.com/admin&#8211;&gt;a.b.c.d:8082/admin</p>
<p>3,bbb.com&#8212;&#8212;&#8212;-&gt;a.b.c.d:8083/wap</p>
<p>经过多次的尝试，始终没法把第一条和第三条映射上，nginx的简化配置如下：</p>
<p>server aaa.com</p>
<p>location / {</p>
<p>proxy_pass http://a.b.c.d:8080/web</p>
<p>}</p>
<p>location /admin{</p>
<p>proxy_pass http://a.b.c.d:8082/admin</p>
<p>}</p>
<p>server bbb.com</p>
<p>location /{</p>
<p>proxy_pass http://a.b.c.d:8083/wap</p>
<p>}</p>
<p># service nginx reconfigure后发现除了第二条映射生效外，其他两个都始终报302 404错误，然后将第一、三条 location / 分别改成 /web   /wap</p>
<p>与/admin一致后，然后通过aaa.com/web  aaa.com/wap访问就能成功，通过这规律可能是一个域名只能映射到ip:port；而到模块名就必须也得在域名后加上相应的模块名;而且要用到模块名，在location处的映射必须与应用名一致即如果配置了下面这种形式同样会出错：</p>
<p>server aaa.com</p>
<p>location /<span style="color: #ff0000;">myAdmin</span>{</p>
<p>proxy_pass http://a.b.c.d:8082/<span style="color: #ff0000;">admin</span>;</p>
<p>}</p>
<p>以上红色字体部分对某些应用必须要相同，否则没法跳转。</p>
<p>根据现有情况，只能改变应用模块的访问方式了，将web,wap所有的应用名去掉，保证a.b.c.d:8080就能访问到web站点，而不需要加上/web,wap同理</p>
<p>改动后自己服务器上测试后通过！</p>
<p>&nbsp;</p>
<p>nginx安装：<a title="Nginx安装配置" href="http://www.javali.org/360" target="_blank">http://www.javali.org/360</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javali.org/401/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hive使用总结</title>
		<link>http://www.javali.org/392</link>
		<comments>http://www.javali.org/392#comments</comments>
		<pubDate>Fri, 05 Aug 2011 08:55:28 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[资料总结]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[hive]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.javali.org/?p=392</guid>
		<description><![CDATA[hive特性： 数据存储在hdfs上，依托hadoop集群实现并行计算 采用hiveQL作为查询语言，与SQL极其相似 Hive中存储的数据无固定格式要求，可随用户自定义 可追加数据，但不支持更改 可扩展性强，支持大规模并行计算 &#160; hive安装 请确保 hadoop集群处在运行状态 当前用户环境变量中有HADOOP_HOME，如果不设置，hive没法运行 $cd /opt/soft $wget  http://apache.etoak.com/hive/hive-0.7.0/hive-0.7.0-bin.tar.gz $tar -zxvf  hive-0.7.0-bin.tar.gz $mv hive-0.7.0 hive $cd hive/conf $cp hive-default.xml hive-site.xml $cd ../bin $./hive   启动hive进入命令行 操作指南 可见官网文档：https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-SQLOperations Hive提供了很多的函数，可以在命令行下show functions罗列所有的函数 你会发现这些函数名与mysql的很相近，绝大多数相同的， 可通过describe function functionName 查看函数使用方法 hive支持的数据类型很简单就int,string等原子类型， 连日期时间类型也不支持， 但通过to_date unix_timestamp date_diff date_add date_sub等函数就能完成mysql同样的时间日期复杂操作 分区 hive与mysql分区有些区别，mysql分区是用表结构中的字段来分区(range,list,hash等)，而hive不同，他需要手工指定分区列，这个列是独立于表结构，但属于表中一列，在加载数据时手动指定分区 试用： create table mytest(id int,name string ,regtime [...]]]></description>
			<content:encoded><![CDATA[<p>hive特性：</p>
<p>数据存储在hdfs上，依托hadoop集群实现并行计算</p>
<p>采用hiveQL作为查询语言，与SQL极其相似</p>
<p>Hive中存储的数据无固定格式要求，可随用户自定义</p>
<p>可追加数据，但不支持更改</p>
<p>可扩展性强，支持大规模并行计算</p>
<p>&nbsp;</p>
<p><em><strong>hive安装</strong></em><br />
请确保 hadoop集群处在运行状态<br />
当前用户环境变量中有HADOOP_HOME，如果不设置，hive没法运行</p>
<p>$cd /opt/soft<br />
$wget  http://apache.etoak.com/hive/hive-0.7.0/hive-0.7.0-bin.tar.gz<br />
$tar -zxvf  hive-0.7.0-bin.tar.gz<br />
$mv hive-0.7.0 hive<br />
$cd hive/conf</p>
<p>$cp hive-default.xml hive-site.xml<br />
$cd ../bin<br />
$./hive   启动hive进入命令行</p>
<p><em><strong>操作指南</strong></em><br />
可见官网文档：<a href="https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-SQLOperations" target="_blank">https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-SQLOperations</a></p>
<p>Hive提供了很多的函数，可以在命令行下show functions罗列所有的函数<br />
你会发现这些函数名与mysql的很相近，绝大多数相同的，<br />
可通过describe function functionName 查看函数使用方法</p>
<p>hive支持的数据类型很简单就int,string等原子类型， 连日期时间类型也不支持，</p>
<p>但通过to_date unix_timestamp date_diff date_add date_sub等函数就能完成mysql同样的时间日期复杂操作</p>
<p><em><strong>分区</strong></em><br />
hive与mysql分区有些区别，mysql分区是用表结构中的字段来分区(range,list,hash等)，而hive不同，他需要手工指定分区列，这个列是独立于表结构，但属于表中一列，在加载数据时手动指定分区</p>
<p>试用：<br />
create table mytest(id int,name string ,regtime string) PARTITIONED by (ds string) row format delimited fields terminated by &#8216;\t&#8217; stored as textfile ;</p>
<p>创建一个数据文件<br />
1       sawenlee        2011-07-28 22:23:12<br />
2       tonylee 2011-08-03 22:24:21<br />
3       nick    2011-08-02 6:2:43</p>
<p>执行<br />
LOAD DATA LOCAL INPATH &#8216;../data/test.txt&#8217; OVERWRITE INTO TABLE mytest  PARTITION (ds=&#8217;2011-08-02&#8242;);</p>
<p>LOAD DATA LOCAL INPATH &#8216;../data/test.txt&#8217; OVERWRITE INTO TABLE mytest  PARTITION (ds=&#8217;2011-08-03&#8242;);</p>
<p>再看hive文件结构</p>
<p><img class="aligncenter size-full wp-image-394" title="warehouse" src="http://www.javali.org/wp-content/uploads/2011/08/warehouse.png" alt="" width="386" height="121" /></p>
<p>如果执行一个查询，hive会将其转换成map reduce在hadoop上执行(select * from mytest除外)</p>
<p>select * from mytest where to_date(regtime) &gt;to_date(&#8217;2011-8-1&#8242;);</p>
<p><img class="aligncenter size-full wp-image-398" title="hive_query" src="http://www.javali.org/wp-content/uploads/2011/08/hive_query.png" alt="" width="934" height="220" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javali.org/392/feed</wfw:commentRss>
		<slash:comments>5430</slash:comments>
		</item>
		<item>
		<title>newrsslib4j v1.0发布了</title>
		<link>http://www.javali.org/385</link>
		<comments>http://www.javali.org/385#comments</comments>
		<pubDate>Thu, 04 Aug 2011 14:19:43 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[资料总结]]></category>
		<category><![CDATA[newrsslib4j]]></category>
		<category><![CDATA[rss]]></category>

		<guid isPermaLink="false">http://www.javali.org/?p=385</guid>
		<description><![CDATA[项目地址：http://code.google.com/p/newrsslib4j/ 源码下载：svn checkout http://newrsslib4j.googlecode.com/svn/trunk/ newrsslib4j-read-only 下载jar包:   http://code.google.com/p/newrsslib4j/downloads/list 描述：在rsslib4j源码基础上，保持外接口不变，添加了rss字节流编码探测及内部编码转换，理论上支持所有的编码，组件使用较原版更健壮、更稳定 change log #1,引入了mozilla的jchardet包，作为组件一部分，用于探测rss字节流编码，新增了一辅助类Chaset.java 提供了几个静态编码探测方法： String guess(URL url)； String guess(String path) String guess(InputStream in) #2,引入UnicodeReader替换原有的InputStreamReader，不用InputStreamReader的 原因在于某些UTF-8编码开始会带有BOM (Byte Order Mark) ;导致解析xml失败：Content is not allowed in prolog. 这是jdk1.5的bug,1.6已修复；在sun的buglist里发现了这个问题，并找到了UnicodeReader #3，改造RSSParser解析类，新加一个类属性 private InputSource is; 替换原有的InputStream，因原有没有考虑国际化编码问题，而InputSource可以Reader构造产生，改造完如下： /** * Set rss resource by URL * @param ur the remote url * @throws RSSException */ [...]]]></description>
			<content:encoded><![CDATA[<p>项目地址：<a href="http://code.google.com/p/newrsslib4j/" target="_blank">http://code.google.com/p/newrsslib4j/</a></p>
<p>源码下载：svn checkout http://newrsslib4j.googlecode.com/svn/trunk/ newrsslib4j-read-only</p>
<p>下载jar包:   <a href="http://code.google.com/p/newrsslib4j/downloads/list" target="_blank">http://code.google.com/p/newrsslib4j/downloads/list</a></p>
<p>描述：在rsslib4j源码基础上，保持外接口不变，添加了rss字节流编码探测及内部编码转换，理论上支持所有的编码，组件使用较原版更健壮、更稳定</p>
<hr />
<h1>change log</h1>
<p>#1,引入了mozilla的jchardet包，作为组件一部分，用于探测rss字节流编码，新增了一辅助类Chaset.java 提供了几个静态编码探测方法：<br />
String guess(URL url)；<br />
String guess(String path)<br />
String guess(InputStream in)</p>
<hr />
<p>#2,引入UnicodeReader替换原有的InputStreamReader，不用InputStreamReader的 原因在于某些UTF-8编码开始会带有BOM (Byte Order Mark) ;导致解析xml失败：Content is not  allowed in prolog.   这是jdk1.5的bug,1.6已修复；在sun的buglist里发现了这个问题，并找到了UnicodeReader</p>
<hr />
<p>#3，改造RSSParser解析类，新加一个类属性 private InputSource is; 替换原有的InputStream，因原有没有考虑国际化编码问题，而InputSource可以Reader构造产生，改造完如下：<br />
/**<br />
* Set rss resource by URL<br />
* @param ur the remote url<br />
* @throws RSSException<br />
*/<br />
public void setXmlResource(URL ur) throws RSSException{<br />
try{</p>
<p>URLConnection con = u.openConnection();<br />
con.setReadTimeout(10000);<br />
String charset = Charset.guess(ur);<br />
is = new InputSource (new UnicodeReader(con.getInputStream(),charset));<br />
if (con.getContentLength() == -1 &amp;&amp; is == null){<br />
this.fixZeroLength();<br />
}<br />
}catch(IOException e){<br />
throw new RSSException(&#8220;RSSParser::setXmlResource fails: &#8220;+e.getMessage());<br />
}<br />
}</p>
<hr />
<p><strong>user guide</strong><br />
代码片段：<br />
URL url = new URL(&#8220;http://cn.engadget.com/rss.xml&#8221;);<br />
RSSHandler handler = new RSSHandler();   RSSParser.parseXmlFile(url, handler, false);<br />
RSSChannel ch = handler.getRSSChannel();<br />
System.out.println(ch.toString());<br />
List&lt;RSSItem&gt; lst = handler.getRSSChannel().getItems();<br />
for (int j = 0; j &lt; lst.size(); j++) {<br />
RSSItem itm = lst.get(j);<br />
System.out.println(itm.toString());<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javali.org/385/feed</wfw:commentRss>
		<slash:comments>1285</slash:comments>
		</item>
		<item>
		<title>windows下hadoop开发环境搭建</title>
		<link>http://www.javali.org/378</link>
		<comments>http://www.javali.org/378#comments</comments>
		<pubDate>Thu, 28 Jul 2011 09:34:58 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[资料总结]]></category>
		<category><![CDATA[cygwin]]></category>
		<category><![CDATA[standalone hadoop]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.javali.org/?p=378</guid>
		<description><![CDATA[准备 jdk1.6及以上 cygwin eclipse3.X hadoop-0.20.2.tar.gz 参见hadoop分布式集群搭建一文 cygwin安装 进入cygwin首页，点击setup.exe 在线安装，选择一个镜像点直接下一步;如果安装不成功，则换一个镜像 默认的cygwin安装是不带openssh的以及vi工具的；前者是hadoop环境必备的，后者则用来编辑配置文件 可以重新再点击setup.exe，进入到软件列表里，在查询框分别输入openssh 、vi 点击条目变成install,而非skip ，下一步即可实现在线安装 配置sshd $ ssh-keygen   一直按回车直到执行结束 $ cat ~/.ssh/id_rsa.pub &#62;&#62;authorized_keys 执行ssh localhost还需要密码的话，就分别执行chmod 755 authorized_keys 安装hadoop 将hadoop-0.20.2.tar.gz拷贝到CYGWIN_HOME/home/USER_NAME/下 $ tar -zxvf hadoop-0.20.2.tar.gz $ mv hadoop-0.20.2 hadoop $ cd hadoop/conf $ vi hadoop-env.sh  设置JAVA_HOME 如果不设置则无法启动hadoop $ vi core-site.xml 内容修改为: &#60;property&#62; &#60;name&#62;fs.default.name&#60;/name&#62; &#60;value&#62;hdfs://localhost:9770&#60;/value&#62; &#60;/property&#62; $ vi mapred-site.xml    [...]]]></description>
			<content:encoded><![CDATA[<p><strong>准备</strong></p>
<ol>
<li> jdk1.6及以上</li>
<li> cygwin</li>
<li> eclipse3.X</li>
<li> hadoop-0.20.2.tar.gz</li>
<li> 参见<a href="http://www.javali.org/304" target="_blank">hadoop分布式集群搭建</a>一文</li>
</ol>
<hr />
<p><strong>cygwin安装</strong><br />
进入<a href="http://cygwin.com/install.html" target="_blank">cygwin首页</a>，点击<a href="http://cygwin.com/setup.exe" target="_blank">setup.exe</a><br />
在线安装，选择一个镜像点直接下一步;如果安装不成功，则换一个镜像</p>
<p>默认的cygwin安装是不带openssh的以及vi工具的；前者是hadoop环境必备的，后者则用来编辑配置文件</p>
<p>可以重新再点击setup.exe，进入到软件列表里，在查询框分别输入openssh 、vi<br />
点击条目变成install,而非skip ，下一步即可实现在线安装</p>
<hr />
<p><strong>配置sshd</strong><br />
$ ssh-keygen   一直按回车直到执行结束</p>
<p>$ cat ~/.ssh/id_rsa.pub &gt;&gt;authorized_keys<br />
执行ssh localhost还需要密码的话，就分别执行chmod 755 authorized_keys</p>
<hr />
<p><strong>安装hadoop</strong><br />
将hadoop-0.20.2.tar.gz拷贝到CYGWIN_HOME/home/USER_NAME/下<br />
$ tar -zxvf hadoop-0.20.2.tar.gz<br />
$ mv hadoop-0.20.2 hadoop<br />
$ cd hadoop/conf<br />
$ vi hadoop-env.sh  设置JAVA_HOME 如果不设置则无法启动hadoop</p>
<p>$ vi core-site.xml<br />
内容修改为:<br />
&lt;property&gt;<br />
&lt;name&gt;fs.default.name&lt;/name&gt;<br />
&lt;value&gt;hdfs://localhost:9770&lt;/value&gt;<br />
&lt;/property&gt;</p>
<p>$ vi mapred-site.xml    我的cygwin_home是c:\cygwin 用户名是sawenlee<br />
内容修改为<br />
&lt;property&gt;<br />
&lt;name&gt;mapred.job.tracker&lt;/name&gt;<br />
&lt;value&gt;localhost:9771&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;property&gt;<br />
&lt;name&gt;mapred.system.dir&lt;/name&gt;<br />
&lt;value&gt;C:\cygwin\home\sawenlee\hadoop\system\mapred.system.dir&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;property&gt;<br />
&lt;name&gt;mapred.local.dir&lt;/name&gt;<br />
&lt;value&gt;C:\cygwin\home\sawenlee\hadoop\data\mapred.local.dir&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;property&gt;<br />
&lt;name&gt;mapred.child.tmp&lt;/name&gt;<br />
&lt;value&gt;C:\cygwin\home\sawenlee\hadoop\data\temp&lt;/value&gt;<br />
&lt;/property&gt;</p>
<p>$ vi hdfs-site.xml<br />
内容修改为<br />
&lt;property&gt;<br />
&lt;name&gt;dfs.name.dir&lt;/name&gt;<br />
&lt;value&gt;C:\cygwin\home\sawenlee\hadoop\data\dfs.name.dir&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;property&gt;<br />
&lt;name&gt;dfs.data.dir&lt;/name&gt;<br />
&lt;value&gt;C:\cygwin\home\sawenlee\hadoop\data\dfs.data.dir&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;property&gt;<br />
&lt;name&gt;dfs.permissions&lt;/name&gt;<br />
&lt;value&gt;false&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;property&gt;<br />
&lt;name&gt;dfs.replication&lt;/name&gt;<br />
&lt;value&gt;1&lt;/value&gt;<br />
&lt;/property&gt;</p>
<hr />
<p><strong>启动hadoop服务</strong><br />
$ bin/hadoop namenode -format  #格式化namenode<br />
$ bin/start-all.sh  启动namenode datanode jobtracker tasktracker等</p>
<hr />
<p><strong>配置eclipse插件</strong><br />
将hadoop目录下的contrib/eclipse-plugin.jar拷贝到eclipse安装目录的plugins下<br />
重新启动eclipse即可看到右上角视图中多了一个map/reduce视角</p>
<p>配置hadoop_home<br />
window&#8211;&gt;preferences&#8211;&gt;map/reduce设置hadoop安装路径，必须与服务配置一致，不然会产生意料不到的问题</p>
<p>配置hdfs location<br />
在map/reduce视图下，new hadoop location&#8230;<br />
如下图配置： 注意第一个端口是在core-site.xml中配置的，第二个是在mapred-site.xml配置的，根据实际情况填写</p>
<p><img class="aligncenter size-full wp-image-379" title="hdfs_location" src="http://www.javali.org/wp-content/uploads/2011/07/hdfs_location.png" alt="" width="581" height="164" /></p>
<p>如果配置成功可以直接浏览到hdfs上的文件，如下图</p>
<p><img class="aligncenter size-full wp-image-380" title="hdfs_file" src="http://www.javali.org/wp-content/uploads/2011/07/hdfs_file.png" alt="" width="448" height="125" /></p>
<hr />
<p><strong>运行本地测试程序</strong><br />
new project&#8212;&gt;map/reduce project &#8212;&gt;new class</p>
<p>public class HdfsCat {</p>
<p>/**<br />
* @param args<br />
* @throws IOException<br />
*/<br />
public static void main(String[] args) throws IOException {<br />
String uri = &#8220;hdfs://localhost:9770/tmp/wordcount/test.txt&#8221;;<br />
Configuration cnf = new Configuration();<br />
FileSystem fs = FileSystem.get(URI.create(uri),cnf);<br />
InputStream in = null;<br />
try {<br />
in = fs.open(new Path(uri));<br />
IOUtils.copyBytes(in, System.out, 4096,false);<br />
}finally{<br />
IOUtils.closeStream(in);<br />
}<br />
}<br />
}</p>
<p>直接run，如果没有出错，在控制台看到文件内容了，那么恭喜你，本地调试环境搭建成功了</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javali.org/378/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL日志文件设置及ibdata1瘦身</title>
		<link>http://www.javali.org/369</link>
		<comments>http://www.javali.org/369#comments</comments>
		<pubDate>Mon, 25 Jul 2011 02:56:35 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[资料总结]]></category>
		<category><![CDATA[binlog]]></category>
		<category><![CDATA[ibdata1]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.javali.org/?p=369</guid>
		<description><![CDATA[今天无意间发现开发服务器磁盘空间利用近100%，结合df &#38; du查找出了罪魁祸首是mysql的数据文件和日志文件占用过多磁盘如图 ibdata1占用了35G，mysql-bin.****占用近20G；而开发服务器是非主从架构，不存在日志复制，数据同步机制的。 所以第一步可以把二进制文件清理掉 以管理员身份登录mysql 执行RESET MASTER清除所有的二进制日志 另外还可以有针对性的删除 PURGE MASTER LOGS TO &#38; PURGE MASTER LOGS BEFORE 执行PURGE MASTER LOGS TO &#8216;mysql-bin.******&#8217;命令，是单独删除日志文件 执行PURGE MASTER LOGS BEFORE &#8216;yyyy-mm-dd hh:mm:ss&#8217;命令，是将在&#8217;yyyy-mm-dd hh:mm:ss&#8217;时间之前的所有日志进行删除 &#160; 如果存在主从同步，设置二进制日志文件失效时间可有效防止磁盘空间无止境的被占用 expire_logs_days=3 这样日志文件只保留3天，如果设置0则代表日志文件永不失效 &#160; &#160; &#160; &#160; &#160; ibdata1数据文件瘦身 在网上查找了相关资料，ibdata1是存放innodb引擎数据和索引的文件，因开发服务器参数设置不当，所有数据库数据及索引都存放在一个文件，而且这个文件有个特点是：不能通过mysql命令缩小，删除或者drop数据（表）同样不会变小，但新增数据可重复利用空间； 如果给ibdata1瘦身就只能先将库结构及数据dump备份成文件，然后drop掉所有的库，并删除掉ibdata1,利用mysql将之前备份的文件重建数据库 如果采用独立表空间则可以避免这个问题,设置方式；此法有风险，请在备用机上测试OK后再尝试 在my.cnf中的innodb块新增一行配置 innodb_file_per_table 重启server后，今后新建的innodb引擎表都会独立一个文件以table_name.ibd文件存在每个库数据文件夹下。]]></description>
			<content:encoded><![CDATA[<p>今天无意间发现开发服务器磁盘空间利用近100%，结合df &amp; du查找出了罪魁祸首是mysql的数据文件和日志文件占用过多磁盘如图<br />
<img class="alignleft size-full wp-image-370" title="data_binary" src="http://www.javali.org/wp-content/uploads/2011/07/data_binary.png" alt="" width="239" height="493" /></p>
<p>ibdata1占用了35G，mysql-bin.****占用近20G；而开发服务器是非主从架构，不存在日志复制，数据同步机制的。</p>
<p>所以第一步可以把二进制文件清理掉</p>
<p>以管理员身份登录mysql</p>
<p>执行<strong>RESET MASTER</strong>清除所有的二进制日志</p>
<p>另外还可以有针对性的删除<br />
<strong>PURGE MASTER LOGS TO</strong> &amp; <strong>PURGE MASTER LOGS BEFORE</strong><br />
执行PURGE MASTER LOGS TO &#8216;mysql-bin.******&#8217;命令，是单独删除日志文件<br />
执行PURGE MASTER LOGS BEFORE &#8216;yyyy-mm-dd hh:mm:ss&#8217;命令，是将在&#8217;yyyy-mm-dd hh:mm:ss&#8217;时间之前的所有日志进行删除</p>
<p>&nbsp;</p>
<p>如果存在主从同步，设置二进制日志文件失效时间可有效防止磁盘空间无止境的被占用</p>
<p><strong>expire_logs_days=3</strong> 这样日志文件只保留3天，如果设置0则代表日志文件永不失效</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>ibdata1数据文件瘦身</strong></p>
<p>在网上查找了相关资料，ibdata1是存放innodb引擎数据和索引的文件，因开发服务器参数设置不当，所有数据库数据及索引都存放在一个文件，而且这个文件有个特点是：不能通过mysql命令缩小，删除或者drop数据（表）同样不会变小，但新增数据可重复利用空间；</p>
<p>如果给ibdata1瘦身就只能先将库结构及数据dump备份成文件，然后drop掉所有的库，并删除掉ibdata1,利用mysql将之前备份的文件重建数据库</p>
<p>如果采用独立表空间则可以避免这个问题,设置方式；<strong><span style="color: #ff0000;">此法有风险，请在备用机上测试OK后再尝试</span></strong></p>
<p>在my.cnf中的innodb块新增一行配置</p>
<p>innodb_file_per_table</p>
<p>重启server后，今后新建的innodb引擎表都会独立一个文件以table_name.ibd文件存在每个库数据文件夹下。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javali.org/369/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nginx安装配置</title>
		<link>http://www.javali.org/360</link>
		<comments>http://www.javali.org/360#comments</comments>
		<pubDate>Mon, 11 Jul 2011 06:01:22 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[架构]]></category>
		<category><![CDATA[资料总结]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://www.javali.org/?p=360</guid>
		<description><![CDATA[准备 nginx-0.8.x pcre-8.10 zlib-1.2.5 并解压到/opt/soft目录下 准备nginx用户，并加入到www组中： #追加一个www组 groupadd -f www&#160; #追加一个nginx用户 useradd -s /sbin/nologin -g www nginx 编译nginx：以下每个参数看着是- 实际是两个横线，要替换下 ./configure &#8211;prefix=/usr/local/nginx \&#160; &#8211;user=nginx &#8211;group=www \ &#8211;with-pcre=/opt/soft/pcre-8.10 \ &#8211;with-zlib=/opt/soft/zlib-1.2.5 \ &#8211;with-http_stub_status_module \ &#8211;without-http_fastcgi_module \ &#8211;without-http_memcached_module \ &#8211;without-http_map_module \ &#8211;without-http_geo_module \ &#8211;without-http_autoindex_module make;make install #编译启动文件 vi /etc/init.d/nginx 将下述内容拷贝其中： #!/bin/bash # v.0.0.1 # create by jackbillow at 2007.10.15 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>准备</strong></p>
<ul>
<li>nginx-0.8.x</li>
<li>pcre-8.10</li>
<li>zlib-1.2.5</li>
</ul>
<p>并解压到/opt/soft目录下</p>
<hr />
<p>准备nginx用户，并加入到www组中：</p>
<div>
<div>#追加一个www组<br />
groupadd -f www&nbsp;</p>
<p>#追加一个nginx用户<br />
useradd -s /sbin/nologin -g www nginx</p>
</div>
</div>
<p><strong>编译nginx：以下每个参数看着是- 实际是两个横线，要替换下<br />
</strong></p>
<div>
<div>./configure &#8211;prefix=/usr/local/nginx \&nbsp;</p>
<p>&#8211;user=nginx &#8211;group=www \</p>
<p>&#8211;with-pcre=/opt/soft/pcre-8.10 \</p>
<p>&#8211;with-zlib=/opt/soft/zlib-1.2.5 \</p>
<p>&#8211;with-http_stub_status_module \</p>
<p>&#8211;without-http_fastcgi_module \</p>
<p>&#8211;without-http_memcached_module \</p>
<p>&#8211;without-http_map_module \</p>
<p>&#8211;without-http_geo_module \</p>
<p>&#8211;without-http_autoindex_module</p>
</div>
</div>
<hr />
<div>
<div>make;make install</div>
</div>
<hr />
<div>
<div>#编译启动文件<br />
vi /etc/init.d/nginx</div>
</div>
<hr />
<p>将下述内容拷贝其中：</p>
<div>
<div>#!/bin/bash<br />
# v.0.0.1<br />
# create by jackbillow at 2007.10.15<br />
# nginx &#8211; This shell script takes care of starting and stopping nginx.<br />
#<br />
# chkconfig: &#8211; 60 50<br />
# description: nginx [engine x] is light http web/proxy server<br />
# that answers incoming ftp service requests.<br />
# processname: nginx<br />
# config: /etc/nginx.conf</div>
<div># <span style="color: #ff0000;">目录需要替换</span></div>
<div><span style="color: #ff0000;">nginx_path=&#8221;/usr/local/nginx&#8221;</span><br />
<span style="color: #ff0000;"> nginx_pid=&#8221;/usr/local/nginx/nginx.pid&#8221;</span>&nbsp;</p>
<p># Source function library.<br />
. /etc/rc.d/init.d/functions</p>
<p># Source networking configuration.<br />
. /etc/sysconfig/network</p>
<p># Check that networking is up.<br />
[ ${NETWORKING} = "no" ] &amp;&amp; exit 0<br />
[ -x $nginx_path/sbin/nginx ] || exit 0<br />
RETVAL=0<br />
prog=&#8221;nginx&#8221;</p>
<p>start() {<br />
# Start daemons.<br />
if [ -e $nginx_pid -a ! -z $nginx_pid ];then<br />
echo &#8220;nginx already running&#8230;.&#8221;<br />
exit 1<br />
fi<br />
if [ -e $nginx_path/conf/nginx.conf ];then<br />
echo -n $&#8221;Starting $prog: &#8221;<br />
$nginx_path/sbin/nginx -c $nginx_path/conf/nginx.conf &amp;<br />
RETVAL=$?<br />
[ $RETVAL -eq 0 ] &amp;&amp;<br />
{ touch /var/lock/subsys/$prog success $&#8221;$prog&#8221; }</p>
<p>echo<br />
else<br />
RETVAL=1<br />
fi<br />
return $RETVAL<br />
}<br />
# Stop daemons.<br />
stop() {<br />
echo -n $&#8221;Stopping $prog: &#8221;<br />
killproc -d 10 $nigx_path/sbin/nginx<br />
RETVAL=$?<br />
echo<br />
[ $RETVAL = 0 ] &amp;&amp; rm -f $nginx_pid /var/lock/subsys/$prog<br />
}<br />
# See how we were called.<br />
case &#8220;$1&#8243; in<br />
start)<br />
start<br />
;;<br />
stop)<br />
stop<br />
;;<br />
reconfigure)<br />
stop<br />
start<br />
;;<br />
status)<br />
status $prog<br />
RETVAL=$?<br />
;;<br />
*)<br />
echo $&#8221;Usage: $0<br />
{start |stop |reconfigure |status}</p>
<p>&#8221;<br />
exit 1<br />
esac<br />
exit $RETVAL</p>
</div>
</div>
<div>
<div>
<hr />
<p>#追加系统服务<br />
chkconfig &#8211;add /etc/init.d/nginx</p>
</div>
</div>
<div>
<div>
<hr />
<p>#分配执行权限<br />
chmod +x /etc/init.d/nginx</p>
</div>
</div>
<div>
<div>
<hr />
<p>#启动nginx<br />
service nginx start</p>
</div>
</div>
<div>
<div>
<hr />
<p>#停止nginx<br />
service nginx stop</p>
</div>
</div>
<div>
<div>
<hr />
<p>#重启nginx<br />
service nginx reconfigure</p>
</div>
</div>
<div>
<div>
<hr />
<p>#查看nginx状态<br />
service nginx status</p>
</div>
</div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javali.org/360/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Couchbase的技术交流会记录</title>
		<link>http://www.javali.org/317</link>
		<comments>http://www.javali.org/317#comments</comments>
		<pubDate>Sat, 09 Jul 2011 15:54:59 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[资料总结]]></category>
		<category><![CDATA[couchbase]]></category>
		<category><![CDATA[distributed database]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.javali.org/?p=317</guid>
		<description><![CDATA[这次完全是奔着活动主题去的——当下火热的nosql,云计算平台的解决方案 活动地点是在中关村某咖啡店，首先是签到领取t-shirt，进入会场演讲者steven早已就位，看到首页PPT投影在屏幕上时就已明白,T-shirt不是白送的，饮料也不是白喝的，演讲者Steven是来推广他家产品的。 废话少说，直奔主题！ couchbase有多款产品： couchbase server  &#38;  cousebase single server &#38; couchbase mobile couchbase server是这次分享的主角，毕竟是云计算的解决方案定位的主题 couchbase server有以下特点： 1，A distributed key-value NoSQL database——schema-less, auto-sharding, high-performance 2，Horizontally scalable——可动态增删节点（Zero downtime topology change），通过界面操作即可，系统会自动rebalance节点数据 3，Support hadoop integration——要做大量数据统计分析时可通过flume&#38;sqoop将数据从couchbase迁移到hdfs 4，Easy management and monitoring——完善友好的监控系统（可通过后台监测ops、内存、硬盘、网络等指标） couchbase架构 moxi为分布式代理，通过key查找它的value位置完全由它来决定，相当于memcache客户端的分布式hash算法，couchbase 集成了memcachd充当缓存，它完全可以memcached模式运行，数据就完全存储在内存中，不会持久化到磁盘上。 数据写入流程 rebalance机制——如何能zero downtime topology change，仅仅是在节点扩展时，迁移需要迁移的数据，如下图node1&#38;node2中仅仅迁移了多余的两组数据，所以速度还是非常快的 这仅仅是本次会议总结，今后有机会再测试下它的性能；附上一张现场讨论PP couchbase官方网站：http://www.couchbase.com/products-and-services/overview 培训文档点这里下载]]></description>
			<content:encoded><![CDATA[<p>这次完全是奔着活动主题去的——当下火热的nosql,云计算平台的解决方案</p>
<p>活动地点是在中关村某咖啡店，首先是签到领取t-shirt，进入会场演讲者steven早已就位，看到首页PPT投影在屏幕上时就已明白,T-shirt不是白送的，饮料也不是白喝的，演讲者Steven是来推广他家产品的。</p>
<p>废话少说，直奔主题！</p>
<p>couchbase有多款产品： couchbase server  &amp;  cousebase single server &amp; couchbase mobile</p>
<p>couchbase server是这次分享的主角，毕竟是云计算的解决方案定位的主题</p>
<p>couchbase server有以下特点：</p>
<p>1，A distributed key-value NoSQL database——schema-less, auto-sharding, high-performance</p>
<p>2，Horizontally scalable——可动态增删节点（Zero downtime topology change），通过界面操作即可，系统会自动rebalance节点数据</p>
<p>3，Support hadoop integration——要做大量数据统计分析时可通过flume&amp;sqoop将数据从couchbase迁移到hdfs</p>
<p>4，Easy management and monitoring——完善友好的监控系统（可通过后台监测ops、内存、硬盘、网络等指标）</p>
<p>couchbase架构</p>
<p>moxi为分布式代理，通过key查找它的value位置完全由它来决定，相当于memcache客户端的分布式hash算法，couchbase 集成了memcachd充当缓存，它完全可以memcached模式运行，数据就完全存储在内存中，不会持久化到磁盘上。</p>
<p style="text-align: center;"><a href="http://www.javali.org/wp-content/uploads/2011/07/architecture.png"><img class="aligncenter size-full wp-image-333" title="architecture" src="http://www.javali.org/wp-content/uploads/2011/07/architecture.png" alt="" width="586" height="411" /><br />
</a></p>
<p>数据写入流程</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-335" title="writedata_flow1" src="http://www.javali.org/wp-content/uploads/2011/07/writedata_flow1.png" alt="" width="585" height="382" /></p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-336" title="writedata_flow1" src="http://www.javali.org/wp-content/uploads/2011/07/writedata_flow11.png" alt="" width="585" height="382" /></p>
<p>rebalance机制——如何能zero downtime topology change，仅仅是在节点扩展时，迁移需要迁移的数据，如下图node1&amp;node2中仅仅迁移了多余的两组数据，所以速度还是非常快的</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-337" title="rebalancing" src="http://www.javali.org/wp-content/uploads/2011/07/rebalancing.png" alt="" width="618" height="480" /></p>
<p>这仅仅是本次会议总结，今后有机会再测试下它的性能；附上一张现场讨论PP</p>
<p><img class="aligncenter size-large wp-image-338" title="IMAG0016" src="http://www.javali.org/wp-content/uploads/2011/07/IMAG0016-1024x613.jpg" alt="" width="600" height="359" /></p>
<p>couchbase官方网站：<a href="http://www.couchbase.com/products-and-services/overview" target="_blank">http://www.couchbase.com/products-and-services/overview</a></p>
<p>培训文档点<a href="http://vdisk.weibo.com/s/rMd5/1310104586" target="_blank">这里下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javali.org/317/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

