<?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>C &#8211; 编码无悔 /  Intent &amp; Focused</title>
	<atom:link href="https://www.codelast.com/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.codelast.com</link>
	<description>最优化之路</description>
	<lastBuildDate>Sun, 03 May 2020 12:55:04 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>[原创]使用C++（通过Thrift）访问/操作/读写Hbase</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bd%bf%e7%94%a8c%ef%bc%88%e9%80%9a%e8%bf%87thrift%ef%bc%89%e8%ae%bf%e9%97%aehbase/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bd%bf%e7%94%a8c%ef%bc%88%e9%80%9a%e8%bf%87thrift%ef%bc%89%e8%ae%bf%e9%97%aehbase/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Thu, 01 Sep 2011 05:40:43 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[connect]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[Hbase]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[libevent]]></category>
		<category><![CDATA[operate]]></category>
		<category><![CDATA[read]]></category>
		<category><![CDATA[sample]]></category>
		<category><![CDATA[Thrift]]></category>
		<category><![CDATA[write]]></category>
		<category><![CDATA[例子]]></category>
		<category><![CDATA[操作Hbase]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[示例]]></category>
		<category><![CDATA[访问]]></category>
		<category><![CDATA[访问Hbase]]></category>
		<category><![CDATA[读写]]></category>
		<category><![CDATA[读写HBase]]></category>
		<category><![CDATA[读取]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=3303</guid>

					<description><![CDATA[<p>
	<span style="font-family: 宋体; font-size: 14px;">无奈，网上关于C++访问Hbase的文章实在太少，所以只好自己折腾一下，然后写出来了。</span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">要使用C++访问Hbase，可以走的途径少之又少，据说当前最好的方法就是通过Thrift来实现：</span></span></span><span style="font-size: 14px;"><span style="font-family: 宋体;"><a href="http://thrift.apache.org/" target="_blank" rel="noopener noreferrer"><span style="color: #000000;">http://thrift.apache.org/</span></a></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">所以本文分成几部分：（1）安装Thrift；（2）用Thrift 生成访问Hbase所需的C++文件；（3）在程序中通过Thrift来访问Hbase。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">另外，本文只包含读写Hbase数据的例子，不包含配置Hbase的方法，如需这些内容，请自行搜索。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">首先声明一下，本文基于以下环境：<br />
	<span id="more-3303"></span><!--more--><!--more--><!--more--><!--more--><!--more--><!--more--></span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">操作系统：RHEL 5.3，64位</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">Thrift 版本：0.7.0</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">要访问的 Hbase 版本：0.20.6</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">我使用0.90.4的 Hbase 安装包来生成C++所需的Hbase.h等文件（用新版的应该能兼容旧版的）</span></span></span></p>
<p>
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">下面开始，一步步来。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">（1）安装Thrift</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">不是一件很轻松的事。如果你的系统比较干净，可能很顺利地就搞定了，如果有依赖库缺失问题或者库冲突问题，那么就只能根据具体情况，一个个问题去fix了，谁知道会有多少麻烦。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">我运气比较好，在一个干净的系统上，很快就完成了。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">Thrift 至少会依赖于两个系统中一般不会带的库：libevent，boost。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">libevent 到这里下载：</span></span></span><span style="font-size: 14px;"><span style="font-family: 宋体;"><a href="http://monkey.org/~provos/libevent/" target="_blank" rel="noopener noreferrer"><span style="color: #000000;">http://monkey.org/~provos/libevent/</span></a></span></span><span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">&#160; 我使用的版本是：2.0.12-stable</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">boost 到这里下载：</span></span></span><span style="font-size: 14px;"><span style="font-family: 宋体;"><a href="http://www.boost.org/" target="_blank" rel="noopener noreferrer"><span style="color: #000000;">http://www.boost.org/</span></a></span></span><span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">&#160; 我使用的版本是：1.47.0</span></span></span></p>
<p>
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">安装libevent：</span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
./configure --prefix=/usr/local/libevent
make
make install</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">安装boost（boost不像一般的Linux源码安装包一样，它的安装不是configure，make，make install，有点怪）：</span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
./bootstrap.sh</pre>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bd%bf%e7%94%a8c%ef%bc%88%e9%80%9a%e8%bf%87thrift%ef%bc%89%e8%ae%bf%e9%97%aehbase/" class="read-more">Read More </a>]]></description>
										<content:encoded><![CDATA[<p>
	<span style="font-family: 宋体; font-size: 14px;">无奈，网上关于C++访问Hbase的文章实在太少，所以只好自己折腾一下，然后写出来了。</span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">要使用C++访问Hbase，可以走的途径少之又少，据说当前最好的方法就是通过Thrift来实现：</span></span></span><span style="font-size: 14px;"><span style="font-family: 宋体;"><a href="http://thrift.apache.org/" target="_blank" rel="noopener noreferrer"><span style="color: #000000;">http://thrift.apache.org/</span></a></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">所以本文分成几部分：（1）安装Thrift；（2）用Thrift 生成访问Hbase所需的C++文件；（3）在程序中通过Thrift来访问Hbase。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">另外，本文只包含读写Hbase数据的例子，不包含配置Hbase的方法，如需这些内容，请自行搜索。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">首先声明一下，本文基于以下环境：<br />
	<span id="more-3303"></span><!--more--><!--more--><!--more--><!--more--><!--more--><!--more--></span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">操作系统：RHEL 5.3，64位</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">Thrift 版本：0.7.0</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">要访问的 Hbase 版本：0.20.6</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">我使用0.90.4的 Hbase 安装包来生成C++所需的Hbase.h等文件（用新版的应该能兼容旧版的）</span></span></span></p>
<p>
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">下面开始，一步步来。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">（1）安装Thrift</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">不是一件很轻松的事。如果你的系统比较干净，可能很顺利地就搞定了，如果有依赖库缺失问题或者库冲突问题，那么就只能根据具体情况，一个个问题去fix了，谁知道会有多少麻烦。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">我运气比较好，在一个干净的系统上，很快就完成了。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">Thrift 至少会依赖于两个系统中一般不会带的库：libevent，boost。</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">libevent 到这里下载：</span></span></span><span style="font-size: 14px;"><span style="font-family: 宋体;"><a href="http://monkey.org/~provos/libevent/" target="_blank" rel="noopener noreferrer"><span style="color: #000000;">http://monkey.org/~provos/libevent/</span></a></span></span><span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">&nbsp; 我使用的版本是：2.0.12-stable</span></span></span></p>
<p>
	<span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">boost 到这里下载：</span></span></span><span style="font-size: 14px;"><span style="font-family: 宋体;"><a href="http://www.boost.org/" target="_blank" rel="noopener noreferrer"><span style="color: #000000;">http://www.boost.org/</span></a></span></span><span style="color: #000000;"><span style="font-size: 14px;"><span style="font-family: 宋体;">&nbsp; 我使用的版本是：1.47.0</span></span></span></p>
<p>
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">安装libevent：</span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
./configure --prefix=/usr/local/libevent
make
make install</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">安装boost（boost不像一般的Linux源码安装包一样，它的安装不是configure，make，make install，有点怪）：</span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
./bootstrap.sh --prefix=/usr/local/boost</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">不出错的话接着执行以下命令开始编译（也可以通过编辑project-config.jam文件调整编译参数）：</span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
./b2
./b2 install</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">安装Thrift：</span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
chmod +x configure
./configure --with-boost=/usr/local --prefix=/usr/local/thrift
make
make install</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">至此，安装Thrift 的工作就完成了。</span></span></p>
<p>
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">（2）用Thrift 生成访问Hbase所需的C++文件</span></span></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">访问Hbase需要在你的程序中使用若干.h，.cpp文件，这些文件是用 Thrift 生成的。</span></span></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">解压Hbase源码安装包：</span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
tar zxf hbase-0.90.4.tar.gz
cd hbase-0.90.4</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">在解压出来的文件中， 你可以找到一个名为 Hbase.thrift 的文件，这个文件定义了如何通过 Thrift 接口来访问Hbase。用这个Thrift文件，可以生成访问Hbase所需的C++文件：</span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
/usr/local/thrift/bin/thrift --gen cpp ./src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">会发现生成了gen-cpp目录：</span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
ls gen-cpp/</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">输出：</span></span></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;"><span style="color: #0000ff;">Hbase_constants.cpp &nbsp;Hbase_constants.h &nbsp;Hbase.cpp &nbsp;Hbase.h &nbsp;Hbase_server.skeleton.cpp &nbsp;Hbase_types.cpp &nbsp;Hbase_types.h</span></span></span></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">除了Hbase_server.skeleton.cpp之外，其余文件都是在我们的程序里要用到的，将它们拷贝到我们的工程目录下。</span></span></p>
<p>
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">（3）在程序中使用Thrift来访问Hbase</span></span></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">要能通过 Thrift 访问Hbase，你必须首先要打开HBase的 Thrift 服务，请参考其他文档确保这一点是可用的。</span></span></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">下一步，我们在程序中如何读取Hbase的数据？</span></span></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">我们先看看hbase源码安装包中自带的例子：在解压出来的安装包中的&nbsp;examples/thrift/ 目录下的&nbsp;DemoClient.cpp 文件，有如下代码：</span></span></p>
<div>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
  boost::shared_ptr&lt;TTransport&gt; socket(new TSocket(&quot;localhost&quot;, 9090));
  boost::shared_ptr&lt;TTransport&gt; transport(new TBufferedTransport(socket));
  boost::shared_ptr&lt;TProtocol&gt; protocol(new TBinaryProtocol(transport));
  HbaseClient client(protocol);
  try {
    transport-&gt;open();

    // do something

    transport-&gt;close();
  } catch (TException &amp;tx) {
    printf(&quot;ERROR: %s\n&quot;, tx.what());
  }</pre>
</div>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">我们就仿照这个例子来做。从DemoClient.cpp可见，我们要先创建三个指针socket，transport和protocol，后两个分别依赖于前两个，最后再创建一个client对象，我们操作Hbase就是使用这个client对象。在操作Hbase前，需要先打开到Hbase Thrift service的连接，即 transport-&gt;open()，在操作完 Hbase之后，需要关闭连接，即 transport-&gt;close()，这下就比较清楚了：我们可以写一个自己的类CHbaseOperate，它应该有一个connect函数和一个disconnect函数，分别用于打开、关闭连接，还应该有读写Hbase的基本功能。读写Hbase的方法，请参考Hbase.h中的函数，例子还是看DemoClient.cpp。</span></span><br />
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">下面上代码：<br />
	<span style="background-color: #00ff00;">HbaseOperate.h：</span></span></span></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
#ifndef __HBASE_OPERATE_H
#define __HBASE_OPERATE_H

#include &lt;string&gt;
#include &lt;protocol/TBinaryProtocol.h&gt;
#include &lt;transport/TSocket.h&gt;
#include &lt;transport/TTransportUtils.h&gt;
#include &quot;Hbase.h&quot;

/**
 * Class to operate Hbase.
 *
 * @author Darran Zhang (codelast.com)
 * @version 11-08-24
 * @declaration These codes are only for non-commercial use, and are distributed on an &quot;AS IS&quot; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
 * You must not remove this declaration at any time.
 */

using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using namespace apache::hadoop::hbase::thrift;

typedef struct hbaseRet {
  std::string rowValue;
  time_t ts;

  hbaseRet() {
    ts = 0;
  }

} hbaseRet;

class CHbaseOperate
{
public:
	CHbaseOperate();
	virtual ~CHbaseOperate();

private:
  boost::shared_ptr&lt;TTransport&gt; socket;
  boost::shared_ptr&lt;TTransport&gt; transport;
  boost::shared_ptr&lt;TProtocol&gt; protocol;

  HbaseClient *client;

  std::string  hbaseServiceHost;
  int     hbaseServicePort;
  bool    isConnected;

public:
  bool  connect();

  bool  connect(std::string host, int port);

  bool  disconnect();

  bool  putRow(const std::string &amp;tableName,
              const std::string &amp;rowKey,
              const std::string &amp;column,
              const std::string &amp;rowValue);

  bool  getRow(hbaseRet &amp;result,
              const std::string &amp;tableName,
              const std::string &amp;rowKey,
              const std::string &amp;columnName);
};

#endif</pre>
<p>
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;"><span style="background-color: #00ff00;">HbaseOperate.cpp：</span></span></span></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
#include &quot;HbaseOperate.h&quot;
#include &quot;log4cxx/log4cxx.h&quot;
#include &quot;log4cxx/propertyconfigurator.h&quot;

static log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger(&quot;HbaseOperate.cpp&quot;));

/**
 * Class to operate Hbase.
 *
 * @author Darran Zhang (codelast.com)
 * @version 11-08-24
 * @declaration These codes are only for non-commercial use, and are distributed on an &quot;AS IS&quot; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
 * You must not remove this declaration at any time.
 */

using namespace std;

CHbaseOperate::CHbaseOperate() :
socket((TSocket*)NULL), transport((TBufferedTransport*)NULL), protocol((TBinaryProtocol*)NULL), client(NULL), hbaseServicePort(9090), isConnected(false)
{
}

CHbaseOperate::~CHbaseOperate()
{
  if (isConnected) {
    disconnect();
  }
  if (NULL != client) {
    delete client;
    client = NULL;
  }
}

/**
 * Connect Hbase.
 *
 */
bool CHbaseOperate::connect()
{
  if (isConnected) {
    LOG4CXX_INFO(logger, &quot;Already connected, don&#39;t need to connect it again&quot;);
    return true;
  }

  try {
    socket.reset(new TSocket(hbaseServiceHost, hbaseServicePort));
    transport.reset(new TBufferedTransport(socket));
    protocol.reset(new TBinaryProtocol(transport));

    client = new HbaseClient(protocol);

    transport-&gt;open();
  } catch (const TException &amp;tx) {
    LOG4CXX_ERROR(logger, &quot;Connect Hbase error : &quot; &lt;&lt; tx.what());
    return false;
  }

  isConnected = true;
  return isConnected;
}

/**
 * Connect Hbase.
 *
 */
bool CHbaseOperate::connect(std::string host, int port)
{
  hbaseServiceHost = host;
  hbaseServicePort = port;

  return connect();
}

/**
 * Disconnect from Hbase.
 *
 */
bool CHbaseOperate::disconnect()
{
  if (!isConnected) {
    LOG4CXX_ERROR(logger, &quot;Haven&#39;t connected to Hbase yet, can&#39;t disconnect from it&quot;);
    return false;
  }

  if (NULL != transport) {
    try {
      transport-&gt;close();
    } catch (const TException &amp;tx) {
      LOG4CXX_ERROR(logger, &quot;Disconnect Hbase error : &quot; &lt;&lt; tx.what());
      return false;
    }
  } else {
    return false;
  }

  isConnected = false;
  return true;
}

/**
 * Put a row to Hbase.
 *
 * @param tableName   [IN] The table name.
 * @param rowKey      [IN] The row key.
 * @param column      [IN] The &quot;column family : qualifier&quot;.
 * @param rowValue    [IN] The row value.
 * @return True for successfully put the row, false otherwise.
 */
bool CHbaseOperate::putRow(const string &amp;tableName, const string &amp;rowKey, const string &amp;column, const string &amp;rowValue)
{
  if (!isConnected) {
    LOG4CXX_ERROR(logger, &quot;Haven&#39;t connected to Hbase yet, can&#39;t put row&quot;);
    return false;
  }

  try {
    std::vector&lt;Mutation&gt; mutations;
    mutations.push_back(Mutation());
    mutations.back().column = column;
    mutations.back().value = rowValue;
    client-&gt;mutateRow(tableName, rowKey, mutations);

  } catch (const TException &amp;tx) {
    LOG4CXX_ERROR(logger, &quot;Operate Hbase error : &quot; &lt;&lt; tx.what());
    return false;
  }

  return true;
}

/**
 * Get a Hbase row.
 *
 * @param result      [OUT] The object which contains the returned data.
 * @param tableName   [IN] The Hbase table name, e.g. &quot;MyTable&quot;.
 * @param rowKey      [IN] The Hbase row key, e.g. &quot;kdr23790&quot;.
 * @param columnName  [IN] The &quot;column family : qualifier&quot;.
 * @return True for successfully get the row, false otherwise.
 */
bool CHbaseOperate::getRow(hbaseRet &amp;result, const std::string &amp;tableName, const std::string &amp;rowKey, const std::string &amp;columnName)
{
  if (!isConnected) {
    LOG4CXX_ERROR(logger, &quot;Haven&#39;t connected to Hbase yet, can&#39;t read data from it&quot;);
    return false;
  }

  std::vector&lt;std::string&gt; columnNames;
  columnNames.push_back(columnName);

  std::vector&lt;TRowResult&gt; rowResult;
  try {
    client-&gt;getRowWithColumns(rowResult, tableName, rowKey, columnNames);
  } catch (const TException &amp;tx) {
    LOG4CXX_ERROR(logger, &quot;Operate Hbase error : &quot; &lt;&lt; tx.what());
    return false;
  }

  if (0 == rowResult.size()) {
    LOG4CXX_WARN(logger, &quot;Got no record with the key : [&quot; &lt;&lt; rowKey &lt;&lt; &quot;]&quot;);
    return false;
  }

  std::map&lt;std::string, TCell&gt;::const_iterator it = rowResult[rowResult.size() -1].columns.begin();
  result.rowValue = it-&gt;second.value;
  result.ts = it-&gt;second.timestamp;

  return true;
}</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">注意我在程序中使用了<a href="http://logging.apache.org/log4cxx/" target="_blank" rel="noopener noreferrer">Apache log4cxx</a>这个记录日志的库来打印/保存程序运行日志，使用方法可参考<span style="color: #ff0000;">【</span><a href="http://www.codelast.com/?p=3211" target="_blank" rel="noopener noreferrer">此链接</a><span style="color: #ff0000;">】</span>。如果你不想用，可以自己改为std::cout。<br />
	代码有了，使用方法为：可以在你的程序中创建一个全局对象：</span></span></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
CHbaseOperate g_ho;</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">在需要操作Hbase之前：</span></span></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
g_ho.connect(&quot;192.168.55.66&quot;, 9090);</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;">其中，&ldquo;192.168.55.66&rdquo;和9090分别是你的Hbase Thrift service的服务器地址和端口号，你需要正确地配置好，才能使用。本文开头已经说了，本文不讨论这方面的问题。<br />
	在操作完Hbase之后：</span></span></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
g_ho.disconnect();</pre>
<p>
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a><br />
	<span style="font-size: 14px;"><span style="font-family: 宋体;"> <span style="color: #000000;">现在再来说一下读写操作Hbase的两个函数：putRow()和getRow()。<br />
	<span style="background-color: #40e0d0;">putRow()：</span></span></span></span></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
bool  putRow(const std::string &amp;tableName,
              const std::string &amp;rowKey,
              const std::string &amp;column,
              const std::string &amp;rowValue);</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;"><span style="color: #000000;">这是向Hbase写入一条记录的函数，参数tableName为Hbase表名，即你要将记录写到哪个Hbase表中；参数rowKey为待写入的记录的key；参数column为待写入的记录的&ldquo;column family:qualifier&rdquo;组合，参数rowValue为待写入的记录的value。</span></span></span></p>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;"><span style="background-color: #40e0d0;">getRow()：</span></span></span></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
bool  getRow(hbaseRet &amp;result,
              const std::string &amp;tableName,
              const std::string &amp;rowKey,
              const std::string &amp;columnName);</pre>
<p>
	<span style="font-size: 14px;"><span style="font-family: 宋体;"><span style="color: #000000;">这是从Hbase中读取一条记录的函数，参数tableName为Hbase表名，即你要从哪个Hbase表中读取记录；参数rowKey为你要查询的记录的key；参数columnName为你要查询的记录的&ldquo;column family:qualifier&rdquo;组合;参数result为返回的Hbase的数据，它包含记录的value和记录的时间戳：</span></span></span></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
typedef struct hbaseRet {
  std::string rowValue;
  time_t ts; 

  hbaseRet() {
    ts = 0;
  }

} hbaseRet;</pre>
<p>
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a><br />
	<span style="font-size: 14px;"><span style="font-family: 宋体;"> <span style="color: #000000;">至于操作的结果对不对，可以在Hbase shell中用get, scan等命令来验证，具体方法请看Hbase shell的help。另外，最好再写一些unit test来测试。<br />
	如果你要为CHbaseOperate类添加功能，可以参考Hbase.h文件中的函数定义。如你所见，CHbaseOperate类主要也是调用了里面的函数，只不过这个类可以让一些不太熟悉Hbase概念的人可以更方便地操作Hbase罢了。</span></span></span></p>
<p>	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
	<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
	转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
	感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
	<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>

			<!--[syntaxhighlighter]-->
			<!--代码高亮，请勿编辑-->
			<script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shCore.js"></script><script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shBrushShell.js"></script>
<script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shBrushCpp.js"></script>

			<link type="text/css" rel="stylesheet" href="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/styles/shCoreCk.css" />
			<link type="text/css" rel="stylesheet" href="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/styles/shThemeCk.css" />
			<script type="text/javascript">
			SyntaxHighlighter.defaults['class-name']	= '';
			SyntaxHighlighter.defaults['smart-tabs']	= true;
			SyntaxHighlighter.defaults['tab-size']		= 2;
			SyntaxHighlighter.defaults['gutter']		= true;
			SyntaxHighlighter.defaults['quick-code']	= true;
			SyntaxHighlighter.defaults['collapse'] 		= false;
			SyntaxHighlighter.defaults['auto-links']	= true;
			SyntaxHighlighter.defaults['toolbar']		= true;
			SyntaxHighlighter.all();
			</script>
			<!--[/syntaxhighlighter]-->]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bd%bf%e7%94%a8c%ef%bc%88%e9%80%9a%e8%bf%87thrift%ef%bc%89%e8%ae%bf%e9%97%aehbase/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>[原创] log4cxx在Linux下的安装、使用</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b-log4cxx%e5%9c%a8linux%e4%b8%8b%e7%9a%84%e5%ae%89%e8%a3%85%e3%80%81%e4%bd%bf%e7%94%a8/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b-log4cxx%e5%9c%a8linux%e4%b8%8b%e7%9a%84%e5%ae%89%e8%a3%85%e3%80%81%e4%bd%bf%e7%94%a8/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Tue, 09 Aug 2011 06:26:05 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[-lexpat]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[apr]]></category>
		<category><![CDATA[apr-util]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[http://logging.apache.org/log4cxx/]]></category>
		<category><![CDATA[log4c]]></category>
		<category><![CDATA[log4cxx]]></category>
		<category><![CDATA[log4j]]></category>
		<category><![CDATA[properties文件]]></category>
		<category><![CDATA[RedHat]]></category>
		<category><![CDATA[RHEL]]></category>
		<category><![CDATA[undefined reference]]></category>
		<category><![CDATA[使用]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[格式]]></category>
		<category><![CDATA[编译]]></category>
		<category><![CDATA[配置文件]]></category>
		<category><![CDATA[问题]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=3211</guid>

					<description><![CDATA[<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">简单地说，log4cxx就是一个记录日志的C++库（程序运行的时候要保存一些日志到文件，以供将来查看），它是从著名的Java日志库log4j移植而来的，并且它是Apache的一个项目，质量有保证，不用犹豫了，就用它吧！</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">补一句：Apache声称log4cxx的速度快、灵活性好，但是，速度快是第一位的，灵活性是第二位的（&#34;<span style="color:#800080;">Log4cxx claims to be fast and flexible: speed first, flexibility second.</span>&#34;），所以，担心日志记录性能的同学更可以选择log4cxx啦。</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">但是，这玩意的安装、编译稍微有点麻烦，如果遇到了问题，没耐心的人可能就没兴趣折腾了，我在这里把自己遇到的问题记一下。</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">系统环境：RHEL 5.3，64位</span></span></span></p>
<p>
	&#160;</p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span id="more-3211"></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">首先去log4cxx的官方网站下载源码安装包：<a href="http://logging.apache.org/log4cxx/" target="_blank" rel="noopener noreferrer">http://logging.apache.org/log4cxx/</a>，点击左边的&#8220;Download&#8221;进入下载页面，当前（2011年8月9日）的最新版本是0.10.0，你可以下载 .tar.gz 压缩包，解压出来即可。</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">然后就可以直接configure，make，make install了吗？不行，因为log4cxx官方提供的源码安装包不是一个all-in-one的包，它还依赖于Apache的另外两个库：Apache Portable Runtime（APR）和Apache Portable Runtime Utility（APR-Util），你可以在这个链接找到它们：<a href="http://apr.apache.org/" target="_blank" rel="noopener noreferrer">http://apr.apache.org/</a>。</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">（1）安装</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">安装顺序不能变。首先要安装APR，下载到源码安装包后，解压出来，然后：</span></span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
./configure --prefix=/usr/local/apr
make
make install
</pre>
<p><span style="font-size: 14px; ">这里把APR安装到了 /usr/local/apr 目录下，注意，千万不要直接./configure，因为那样会把APR的文件安装到若干目录下，非常不利于维护。</span>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b-log4cxx%e5%9c%a8linux%e4%b8%8b%e7%9a%84%e5%ae%89%e8%a3%85%e3%80%81%e4%bd%bf%e7%94%a8/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">简单地说，log4cxx就是一个记录日志的C++库（程序运行的时候要保存一些日志到文件，以供将来查看），它是从著名的Java日志库log4j移植而来的，并且它是Apache的一个项目，质量有保证，不用犹豫了，就用它吧！</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">补一句：Apache声称log4cxx的速度快、灵活性好，但是，速度快是第一位的，灵活性是第二位的（&quot;<span style="color:#800080;">Log4cxx claims to be fast and flexible: speed first, flexibility second.</span>&quot;），所以，担心日志记录性能的同学更可以选择log4cxx啦。</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">但是，这玩意的安装、编译稍微有点麻烦，如果遇到了问题，没耐心的人可能就没兴趣折腾了，我在这里把自己遇到的问题记一下。</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">系统环境：RHEL 5.3，64位</span></span></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span id="more-3211"></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">首先去log4cxx的官方网站下载源码安装包：<a href="http://logging.apache.org/log4cxx/" target="_blank" rel="noopener noreferrer">http://logging.apache.org/log4cxx/</a>，点击左边的&ldquo;Download&rdquo;进入下载页面，当前（2011年8月9日）的最新版本是0.10.0，你可以下载 .tar.gz 压缩包，解压出来即可。</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">然后就可以直接configure，make，make install了吗？不行，因为log4cxx官方提供的源码安装包不是一个all-in-one的包，它还依赖于Apache的另外两个库：Apache Portable Runtime（APR）和Apache Portable Runtime Utility（APR-Util），你可以在这个链接找到它们：<a href="http://apr.apache.org/" target="_blank" rel="noopener noreferrer">http://apr.apache.org/</a>。</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">（1）安装</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">安装顺序不能变。首先要安装APR，下载到源码安装包后，解压出来，然后：</span></span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
./configure --prefix=/usr/local/apr
make
make install
</pre>
<p><span style="font-size: 14px; ">这里把APR安装到了 /usr/local/apr 目录下，注意，千万不要直接./configure，因为那样会把APR的文件安装到若干目录下，非常不利于维护。</span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">再安装APR-Util，和上面一样，解压出来源码安装包，然后：</span></span></span></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make
make install
</pre>
<p><span style="font-size: 14px; ">这里，通过&nbsp;--with-apr 参数指定了前一步安装的APR的目录，同时也将APR-Util的安装目录设置在了/usr/local/apr-util 目录下。</span></p>
<p style="display: inline !important; font-size: 14px;">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span" color="#000000">最后，就是安装log4cxx了，但是在安装之前，还要再注意一点：configure的时候要指定APR和APR-Util的安装路径：</font></span></span></p>
<p></p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
./configure --prefix=/usr/local/log4cxx --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
mv libtool libtool.bak
ln -s /usr/bin/libtool libtool
make 
make install
</pre>
<p><span style="font-size: 14px; ">注意，中间有两条匪夷所思的命令（mv 和 ln -s），如果不执行的话，会报错（我不太记得是在configure的时候还是make的时候报的错了）：</span></p>
<blockquote>
<p>
		<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">/usr/lib/libexpat.so: could not read symbols: File in wrong format</font><br />
		</span></span></span></p>
</blockquote>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;"><font class="Apple-style-span">这些问题的解决办法是从网上搜来的，官方的指南做得不给力啊。</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;"><font class="Apple-style-span">这样就把log4cxx安装上了，然后你需要将log4cxx整合进你的程序中，我是把 log4cxx、APR、APR-Util 的三个静态库文件全部放置到我的工程目录下的某个子目录下，然后在Makefile中指定从这个目录下去寻找库文件。三个静态库名如下：liblog4cxx.a，libapr-1.a，libaprutil-1.a。</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;"><font class="Apple-style-span">此外，我还将 log4cxx、APR、APR-Util 的所有头文件（.h）放置到了工程目录下。并在自己的程序中include工程目录下的这些文件。</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;"><font class="Apple-style-span">然后就是在Makefile中添加上与log4cxx相关的一切东西，包括头文件路径，库文件路径等。如果你编译的时候看到与log4cxx相关的&ldquo;undefined reference ...&rdquo;的错误，那么肯定是没有找到相关的库文件或头文件，这里需要提醒你的是要添加的几个库文件参数：-llog4cxx，-lapr-1，-laprutil-1。</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;">你把上面的步骤都做好了，这个时候，你再编译你的程序，可能又会遇到以下错误（好吧，的确有点折磨人）：</span></span></span></p>
<p style="display: inline !important; font-size: 14px;">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">./lib/log4cxx/libaprutil-1.a(apr_xml.o): In function `apr_xml_parser_geterror&#39;:</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">/home/log4cxx/apr-util-1.3.12/xml/apr_xml.c:478: undefined reference to `XML_ErrorString&#39;</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">./lib/log4cxx/libaprutil-1.a(apr_xml.o): In function `do_parse&#39;:</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">/home/log4cxx/apr-util-1.3.12/xml/apr_xml.c:418: undefined reference to `XML_Parse&#39;</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">/home/log4cxx/apr-util-1.3.12/xml/apr_xml.c:422: undefined reference to `XML_GetErrorCode&#39;</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">./lib/log4cxx/libaprutil-1.a(apr_xml.o): In function `cleanup_parser&#39;:</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">/home/log4cxx/apr-util-1.3.12/xml/apr_xml.c:344: undefined reference to `XML_ParserFree&#39;</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">./lib/log4cxx/libaprutil-1.a(apr_xml.o): In function `apr_xml_parser_create&#39;:</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">/home/log4cxx/apr-util-1.3.12/xml/apr_xml.c:381: undefined reference to `XML_ParserCreate&#39;</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">/home/log4cxx/apr-util-1.3.12/xml/apr_xml.c:390: undefined reference to `XML_SetUserData&#39;</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">/home/log4cxx/apr-util-1.3.12/xml/apr_xml.c:391: undefined reference to `XML_SetElementHandler&#39;</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">/home/log4cxx/apr-util-1.3.12/xml/apr_xml.c:392: undefined reference to `XML_SetCharacterDataHandler&#39;</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">/home/log4cxx/apr-util-1.3.12/xml/apr_xml.c:404: undefined reference to `XML_SetDefaultHandler&#39;</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">collect2: ld returned 1 exit status</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span">make: *** [cpsAPI] Error 1</font><br />
	</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;"><font class="Apple-style-span">这些乱七八糟的东西是怎么回事？据网上的一些文章说，这是 libaprutil 的一个bug，它不会自动链接到它的依赖项，从而导致了那些错误。要解决这个问题，你在编译的时候添加 <span style="color:#f00;">-lexpat</span> 参数即可&mdash;&mdash;无论你是在Makefile中，还是在命令行直接用g++命令编译程序，都必须要带上这个参数，否则就会得到上面的那一堆错误（真让人恼火啊）。</font></span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;"><font class="Apple-style-span">这样，总算全部搞定了，程序可以编译通过了，下面，就是如何使用log4cxx来写日志的问题了，简单地说一下。在你需要写日志的类的文件中（例如MyClass.cpp），include两个log4cxx头文件：<span style="color:#00f;">log4cxx.h</span>和<span style="color:#00f;">propertyconfigurator.h</span>，然后在类的外部添加：</font></span></span></span></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
static log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger(&quot;MyClass.cpp&quot;));
</pre>
<p><span style="font-size: 14px; ">然后在需要写日志之前，先加载log4cxx的配置文件（其实也可以不使用配置文件的，这里假设你要使用自定义的配置文件）：</span></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
log4cxx::PropertyConfigurator::configure(&quot;./log4cxx.properties&quot;);
</pre>
<p><span style="font-size: 14px; "><span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">这里指定了log4cxx.properties文件作为log4cxx的配置文件（文件名不一定是要叫log4cxx.properties），</font></span></span> </span></p>
<p style="display: inline !important; ">
	<span style="font-size: 14px; "><span style="font-size:14px;"><font class="Apple-style-span">在这个文件中定义了各种参数，例如日志文件会写到哪里去，日志的格式等等。具体的格式可以很复杂、功能很强大，这里无法给出一个详细的说明，后面会给出一个简单的文件示例。</font></span></span></p>
<p>
	<span style="font-size: 14px; "><span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#000;"><font class="Apple-style-span">然后就可以写日志了，例如：</font></span></span></span></span></p>
<p></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
LOG4CXX_INFO(logger, &quot;Test info message.&quot;);
LOG4CXX_ERROR(logger, &quot;Test error message.&quot;);
</pre>
<p><span style="font-size: 14px; color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" style="font-size: 14px; " target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p style="display: inline !important; ">
	<span style="font-size: 14px; "><span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">运行程序，看看日志是否写进去了？写进去的话就说明成功了。</font></span></span></span></p>
<p style="display: inline !important; ">
	<span style="font-size: 14px; "><span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">上面所说的log4cxx.properties文件，给一个例子如下：</font></span></span></span></p>
<p></p>
<pre class="brush:plain;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
log4j.rootLogger=debug, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller&#39;s file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p (%F:%L) %c - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=./app.log
log4j.appender.R.MaxFileSize=200KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p (%F:%L) %c - %m%n
</pre>
<p><span style="font-size: 14px; ">更多log4cxx的详细用法，可以参考log4cxx的一些官方例子：</span><a href="http://logging.apache.org/log4cxx/index.html" style="font-size: 14px; " target="_blank" rel="noopener noreferrer">http://logging.apache.org/log4cxx/index.html</a><br />
<span style="font-size: 14px; color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" style="font-size: 14px; " target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a><br />
<span style="font-size: 14px; ">附：【使用log4cxx遇到的一些问题记录】<br />
（1）<span style="color:#0000ff;">IO Exception : status code =28</span><br />
这个错误可能是由于磁盘空间满了造成的，log4cxx无法将日志写入磁盘上，请看<a href="http://www.mail-archive.com/log4cxx-user@logging.apache.org/msg02811.html" target="_blank" rel="noopener noreferrer">这个链接</a>。</span></p>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
	<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>

			<!--[syntaxhighlighter]-->
			<!--代码高亮，请勿编辑-->
			<script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shCore.js"></script><script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shBrushShell.js"></script>
<script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shBrushCpp.js"></script>
<script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shBrushPlain.js"></script>

			<link type="text/css" rel="stylesheet" href="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/styles/shCoreCk.css" />
			<link type="text/css" rel="stylesheet" href="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/styles/shThemeCk.css" />
			<script type="text/javascript">
			SyntaxHighlighter.defaults['class-name']	= '';
			SyntaxHighlighter.defaults['smart-tabs']	= true;
			SyntaxHighlighter.defaults['tab-size']		= 2;
			SyntaxHighlighter.defaults['gutter']		= true;
			SyntaxHighlighter.defaults['quick-code']	= true;
			SyntaxHighlighter.defaults['collapse'] 		= false;
			SyntaxHighlighter.defaults['auto-links']	= true;
			SyntaxHighlighter.defaults['toolbar']		= true;
			SyntaxHighlighter.all();
			</script>
			<!--[/syntaxhighlighter]-->]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b-log4cxx%e5%9c%a8linux%e4%b8%8b%e7%9a%84%e5%ae%89%e8%a3%85%e3%80%81%e4%bd%bf%e7%94%a8/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>[原创] 在RHEL上安装Thrift（支持C++）的若干问题</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8rhel%e4%b8%8a%e5%ae%89%e8%a3%85thrift%ef%bc%88%e6%94%af%e6%8c%81c%ef%bc%89%e7%9a%84%e8%8b%a5%e5%b9%b2%e9%97%ae%e9%a2%98/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8rhel%e4%b8%8a%e5%ae%89%e8%a3%85thrift%ef%bc%88%e6%94%af%e6%8c%81c%ef%bc%89%e7%9a%84%e8%8b%a5%e5%b9%b2%e9%97%ae%e9%a2%98/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Wed, 15 Dec 2010 10:10:33 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Hbase]]></category>
		<category><![CDATA[libevent]]></category>
		<category><![CDATA[libThrift]]></category>
		<category><![CDATA[libThriftnb]]></category>
		<category><![CDATA[Python.h]]></category>
		<category><![CDATA[RedHat]]></category>
		<category><![CDATA[RHEL]]></category>
		<category><![CDATA[Thrift]]></category>
		<category><![CDATA[安装]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=918</guid>

					<description><![CDATA[<p>
	<span style="font-size:14px;"><span style="font-family:arial,helvetica,sans-serif;">本文针对的读者：要用Thrift开发C++应用程序的人。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:arial,helvetica,sans-serif;">环境：</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">RHEL 5.3（内核2.6.18-128.el5），32位</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">gcc 4.1.2</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">Boost 1.35.0</span></span></p>
<p>
<span id="more-918"></span></p>
<p>
	&#160;</p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="color:#f00;">（1）</span>什么是Thrift？</span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">先转一段网上的定义：</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">Thrift是一个跨语言服务部署框架，最初由Facebook于2007年开发，后于2008年进入Apache孵化器(Apache Incubator)。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">类似于SOAP，COM 和CORBA，Thrift通过定义一个中间定义语言和Thrift代码生成工具，生成指定语言的代码。目前，Thrift支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml的代码生成。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">简单分析其机理，Thrift就是实现C/S模式，通过代码生成工具将接口定义文件生成服务器端和客户端代码（可以为不同语言），从而实现服务端和客户端跨语言的支持。</span></span></p>
<div>
	&#160;</div>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;"><span style="color:#f00;">（2）</span>从源码安装Thrift的时候，也像通常的软件安装过程一样，通过configure &#8594; make &#8594; make install 的过程就可以完成。但安装过程比较烦人，我遇到了一个又一个的问题，总的来说还是比较繁琐的，特别记下来：</span></span></p>
<p>
	&#160;</p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">Thrift在configure的时候提示找不到php-config的话，需要手动指定其路径（如果没装PHP则需安装）。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">PHP 5.3.4安装的过程中，configure的时候出现error，提示找不到libxml2，于是我安装了libxml2-devel-2.6.26-2.1.2.7.i386.rpm。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">你还需要预先安装libevent库，我安装的是libevent-2.0.9-rc版本。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><strong style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(46, 46, 46); border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; color: rgb(255, 255, 255); font-weight: normal; line-height: 20px; ">文章来源：http://www.codelast.com/</span></span></span></strong></span>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8rhel%e4%b8%8a%e5%ae%89%e8%a3%85thrift%ef%bc%88%e6%94%af%e6%8c%81c%ef%bc%89%e7%9a%84%e8%8b%a5%e5%b9%b2%e9%97%ae%e9%a2%98/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
	<span style="font-size:14px;"><span style="font-family:arial,helvetica,sans-serif;">本文针对的读者：要用Thrift开发C++应用程序的人。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:arial,helvetica,sans-serif;">环境：</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">RHEL 5.3（内核2.6.18-128.el5），32位</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">gcc 4.1.2</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">Boost 1.35.0</span></span></p>
<p>
<span id="more-918"></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="color:#f00;">（1）</span>什么是Thrift？</span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">先转一段网上的定义：</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">Thrift是一个跨语言服务部署框架，最初由Facebook于2007年开发，后于2008年进入Apache孵化器(Apache Incubator)。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">类似于SOAP，COM 和CORBA，Thrift通过定义一个中间定义语言和Thrift代码生成工具，生成指定语言的代码。目前，Thrift支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml的代码生成。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">简单分析其机理，Thrift就是实现C/S模式，通过代码生成工具将接口定义文件生成服务器端和客户端代码（可以为不同语言），从而实现服务端和客户端跨语言的支持。</span></span></p>
<div>
	&nbsp;</div>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;"><span style="color:#f00;">（2）</span>从源码安装Thrift的时候，也像通常的软件安装过程一样，通过configure &rarr; make &rarr; make install 的过程就可以完成。但安装过程比较烦人，我遇到了一个又一个的问题，总的来说还是比较繁琐的，特别记下来：</span></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">Thrift在configure的时候提示找不到php-config的话，需要手动指定其路径（如果没装PHP则需安装）。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">PHP 5.3.4安装的过程中，configure的时候出现error，提示找不到libxml2，于是我安装了libxml2-devel-2.6.26-2.1.2.7.i386.rpm。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">你还需要预先安装libevent库，我安装的是libevent-2.0.9-rc版本。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><strong style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(46, 46, 46); border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; color: rgb(255, 255, 255); font-weight: normal; line-height: 20px; ">文章来源：http://www.codelast.com/</span></span></span></strong> </span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">如果你没有安装Boost就执行Thrift的configure，则会看到下面的提示：</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="color:#f00;"><span style="font-size:14px;">Building C++ Library ......... : no</span></span></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">此时，如果你make，也得不到Thrift的C++库。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">以默认参数安装了Boost之后（我安装的是1.35.0版本），configure的时候就会看到下面的提示：</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="color:#f00;"><span style="font-size:14px;">Building C++ Library ......... : yes</span></span></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">然后重新开始make。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;"><strong style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(46, 46, 46); border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; color: rgb(255, 255, 255); font-weight: normal; line-height: 20px; ">文章来源：http://www.codelast.com/</span></span></span></strong> </span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">到了某一步，如果提示下面的错误：</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="color:#f00;"><span style="font-size:14px;">src/protocol/fastbinary.c:20:20: error: Python.h: No such file or directory</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="color:#00f;"><span style="font-size:14px;">（中间一堆的错误，此处省略）</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="color:#f00;"><span style="font-size:14px;">error: command &#39;gcc&#39; failed with exit status 1</span></span></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">这是怎么回事呢？打开 lib/py/src/protocol/fastbinary.c 文件，看看第一行未注释的代码：</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="color:#00f;"><span style="font-size:14px;">#include &lt;Python.h&gt;</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">说明在系统路径中要能找到Python.h文件，而这个文件，是在你安装了python开发包之后才有的，所以，去安装然后再make吧。</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">我安装的包：<span style="color:#800080;">python-devel-2.4.3-24.el5.i386.rpm</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;"><strong style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(46, 46, 46); border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; color: rgb(255, 255, 255); font-weight: normal; line-height: 20px; ">文章来源：http://www.codelast.com/</span></span></span></strong> </span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">在成功make了之后，可以看到输出的提示：</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="color:#f00;"><span style="font-size:14px;">Build complete.</span></span></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">然后再make install，就可以在 /usr/local/lib/ 下（依系统不同，目录也不一定是这个）找到Thrift的库文件啦：</span></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">-rw-r--r-- &nbsp;1 root root 5762970 Dec 15 17:41<span style="color:#00f;"> libThrift.a</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">-rwxr-xr-x &nbsp;1 root root &nbsp; &nbsp; 949 Dec 15 17:41<span style="color:#00f;"> libThrift.la</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">-rw-r--r-- &nbsp;1 root root &nbsp;468526 Dec 15 17:41<span style="color:#00f;"> libThriftnb.a</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">-rwxr-xr-x &nbsp;1 root root &nbsp; &nbsp; 963 Dec 15 17:41 <span style="color:#00f;">libThriftnb.la</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">lrwxrwxrwx &nbsp;1 root root &nbsp; &nbsp; &nbsp;20 Dec 15 17:41<span style="color:#00f;"> libThriftnb.so -&gt; libThriftnb.so.0.0.0</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">lrwxrwxrwx &nbsp;1 root root &nbsp; &nbsp; &nbsp;20 Dec 15 17:41 <span style="color:#00f;">libThriftnb.so.0 -&gt; libThriftnb.so.0.0.0</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">-rwxr-xr-x &nbsp;1 root root &nbsp;339359 Dec 15 17:41 <span style="color:#00f;">libThriftnb.so.0.0.0</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">lrwxrwxrwx &nbsp;1 root root &nbsp; &nbsp; &nbsp;18 Dec 15 17:41<span style="color:#00f;"> libThrift.so -&gt; libThrift.so.0.0.0</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">lrwxrwxrwx &nbsp;1 root root &nbsp; &nbsp; &nbsp;18 Dec 15 17:41 <span style="color:#00f;">libThrift.so.0 -&gt; libThrift.so.0.0.0</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">-rwxr-xr-x &nbsp;1 root root 3308490 Dec 15 17:41<span style="color:#00f;"> libThrift.so.0.0.0</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">-rw-r--r-- &nbsp;1 root root &nbsp;184672 Dec 15 17:41<span style="color:#00f;"> libThriftz.a</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">-rwxr-xr-x &nbsp;1 root root &nbsp; &nbsp; 956 Dec 15 17:41 <span style="color:#00f;">libThriftz.la</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">lrwxrwxrwx &nbsp;1 root root &nbsp; &nbsp; &nbsp;19 Dec 15 17:41<span style="color:#00f;"> libThriftz.so -&gt; libThriftz.so.0.0.0</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">lrwxrwxrwx &nbsp;1 root root &nbsp; &nbsp; &nbsp;19 Dec 15 17:41<span style="color:#00f;"> libThriftz.so.0 -&gt; libThriftz.so.0.0.0</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">-rwxr-xr-x &nbsp;1 root root &nbsp;145732 Dec 15 17:41 <span style="color:#00f;">libThriftz.so.0.0.0</span></span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;"><strong style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(46, 46, 46); border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; border-style: initial; border-color: initial; color: rgb(255, 255, 255); font-weight: normal; line-height: 20px; ">文章来源：http://www.codelast.com/</span></span></span></strong> </span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">然后就可以开始你的Thrift C++开发之旅了！</span></span></p>
<p>
	<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
	<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
	转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
	感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
	<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8rhel%e4%b8%8a%e5%ae%89%e8%a3%85thrift%ef%bc%88%e6%94%af%e6%8c%81c%ef%bc%89%e7%9a%84%e8%8b%a5%e5%b9%b2%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>[原创] 从零开始一步步教你：用C++开发一个简单的hadoop分布式计算应用程序</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%b8%80%e6%ad%a5%e6%ad%a5%e6%95%99%e4%bd%a0%ef%bc%9a%e7%94%a8c%e5%bc%80%e5%8f%91%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84hadoop%e5%88%86/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%b8%80%e6%ad%a5%e6%ad%a5%e6%95%99%e4%bd%a0%ef%bc%9a%e7%94%a8c%e5%bc%80%e5%8f%91%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84hadoop%e5%88%86/#respond</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sat, 20 Nov 2010 15:03:19 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[hadoop]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=825</guid>

					<description><![CDATA[<p>
	<span _fck_bookmark="1" style="display: none; ">&#160;</span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">假设你有上百G的数据，你要统计出这些数据中，含有某些你感兴趣的内容的数据的有多少条，你会怎么做？在硬件条件允许的情况下，用hadoop并行计算是一个不错的选择。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">为了使本文得以清晰地说明，我们不妨假设如下的情况：</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span id="more-825"></span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="color:#000000;"><span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">我们有100G的数据，分别保存在5个文件中，它们位于 /data/ 目录下。这5个数据文件的内容均为相同的格式，即，文件的内容大致如下：</span></font></span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><strong style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(46, 46, 46); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">ABCDSDFKJDKF kkk 2890876</span></span></strong></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><strong style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(46, 46, 46); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">SDKFJIEORUEW nnn 1231238</span></span></strong></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><strong style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(46, 46, 46); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">LSFKDFSSDRDE bbb 9234999</span></span></strong></font></span></span><br />
	<!--more--><br />
	<span style="font-size: 14px; ">说明：每一行内容中，首先是一个12字节的字符串，然后是一个3字节的字符串，然后是一个7个数字组成的字符串。字符串之间是用空格分隔的。</span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">我们的问题是：在这100G的数据中，请统计出第二项字符串为&#8220;kkk&#8221;和&#8220;nnn&#8221;的数据分别有多少条？</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">如果用一个非分布式的应用程序来计算这个问题，如果计算机硬件配置不够强劲的话，那么估计得算到天荒地老了。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">而用hadoop来并行计算，一切都是那么简单。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">下面，我们就来看看，如何用C++开发一个hadoop上的应用程序，来完成我们的任务。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">尽管hadoop平台是用Java写的，但是它仍然支持用C++来开发应用程序，这里不讨论优劣对比，只是基于这样一个事实：有些人觉得用C++写更熟悉，所以我们才用C++写。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">先说明：本文基于hadoop&#160;0.20.2版本。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">（1）首先我们需要知道map-reduce的基本原理，这里不说了。其次我们需要知道，在用C++</span>编写hadoop应用程序时，需要包含三个头文件：</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">#include &#34;Pipes.hh&#34;</span></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">#include &#34;TemplateFactory.hh&#34;</span></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">#include &#34;StringUtils.hh&#34;</span></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">这三个文件在hadoop安装包的 &#8220;c++\Linux-amd64-64\include\&#8221; 或 &#8220;c++\Linux-i386-32\include\&#8221; 子目录下（根据你的操作系统是64位或32位，分别对应不同的目录）。</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">既然有头文件，就需要有对应的实现文件，或者动态/静态库，这里我用的是静态库 libhadooppipes.a 和&#160;libhadooputils.a 。静态库是在Makefile中指定的，后面再说。这里特别提醒一下大家：如果你的hadoop集群不是只有一台服务器，那么如果你编译时使用了任何动态库的话，在运行的时候就要保证在别的hadoop服务器上也能找到相应的动态库，否则就会在hadoop JobTracker的详细信息中看到找不到动态库的错误提示。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%b8%80%e6%ad%a5%e6%ad%a5%e6%95%99%e4%bd%a0%ef%bc%9a%e7%94%a8c%e5%bc%80%e5%8f%91%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84hadoop%e5%88%86/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
	<span _fck_bookmark="1" style="display: none; ">&nbsp;</span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">假设你有上百G的数据，你要统计出这些数据中，含有某些你感兴趣的内容的数据的有多少条，你会怎么做？在硬件条件允许的情况下，用hadoop并行计算是一个不错的选择。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">为了使本文得以清晰地说明，我们不妨假设如下的情况：</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span id="more-825"></span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="color:#000000;"><span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">我们有100G的数据，分别保存在5个文件中，它们位于 /data/ 目录下。这5个数据文件的内容均为相同的格式，即，文件的内容大致如下：</span></font></span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><strong style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(46, 46, 46); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">ABCDSDFKJDKF kkk 2890876</span></span></strong></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><strong style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(46, 46, 46); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">SDKFJIEORUEW nnn 1231238</span></span></strong></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><strong style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(46, 46, 46); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">LSFKDFSSDRDE bbb 9234999</span></span></strong></font></span></span><br />
	<!--more--><br />
	<span style="font-size: 14px; ">说明：每一行内容中，首先是一个12字节的字符串，然后是一个3字节的字符串，然后是一个7个数字组成的字符串。字符串之间是用空格分隔的。</span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">我们的问题是：在这100G的数据中，请统计出第二项字符串为&ldquo;kkk&rdquo;和&ldquo;nnn&rdquo;的数据分别有多少条？</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">如果用一个非分布式的应用程序来计算这个问题，如果计算机硬件配置不够强劲的话，那么估计得算到天荒地老了。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">而用hadoop来并行计算，一切都是那么简单。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">下面，我们就来看看，如何用C++开发一个hadoop上的应用程序，来完成我们的任务。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">尽管hadoop平台是用Java写的，但是它仍然支持用C++来开发应用程序，这里不讨论优劣对比，只是基于这样一个事实：有些人觉得用C++写更熟悉，所以我们才用C++写。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">先说明：本文基于hadoop&nbsp;0.20.2版本。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">（1）首先我们需要知道map-reduce的基本原理，这里不说了。其次我们需要知道，在用C++</span>编写hadoop应用程序时，需要包含三个头文件：</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">#include &quot;Pipes.hh&quot;</span></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">#include &quot;TemplateFactory.hh&quot;</span></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">#include &quot;StringUtils.hh&quot;</span></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">这三个文件在hadoop安装包的 &ldquo;c++\Linux-amd64-64\include\&rdquo; 或 &ldquo;c++\Linux-i386-32\include\&rdquo; 子目录下（根据你的操作系统是64位或32位，分别对应不同的目录）。</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">既然有头文件，就需要有对应的实现文件，或者动态/静态库，这里我用的是静态库 libhadooppipes.a 和&nbsp;libhadooputils.a 。静态库是在Makefile中指定的，后面再说。这里特别提醒一下大家：如果你的hadoop集群不是只有一台服务器，那么如果你编译时使用了任何动态库的话，在运行的时候就要保证在别的hadoop服务器上也能找到相应的动态库，否则就会在hadoop JobTracker的详细信息中看到找不到动态库的错误提示。</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">（2）下面来看看程序：</span></font></span></span></p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
#include&quot;Pipes.hh&quot;
#include&quot;TemplateFactory.hh&quot;
#include&quot;StringUtils.hh&quot;

class DataCountMap:public HadoopPipes::Mapper {
public:
  DataCountMap(HadoopPipes::TaskContext&amp;context){}
  void map(HadoopPipes::MapContext&amp;context) {
    std::vector&lt;std::string&gt;words=HadoopUtils::splitString(context.getInputValue(),&quot; &quot;);    // 这里是分割字符串，如前文所述，每一行数据中的各项是以空格来分割的。分割的结果保存到了一个std::vector中
    if(&quot;kkk&quot;==words[1]) {
      context.emit(&quot;kkk&quot;,&quot;1&quot;);
    } else if(&quot;nnn&quot;==words[1]) {
      context.emit(&quot;nnn&quot;,&quot;1&quot;);
    }
  }
};

class DataCountReduce:public HadoopPipes::Reducer {
public:
  DataCountReduce(HadoopPipes::TaskContext&amp;context){}
  void reduce(HadoopPipes::ReduceContext&amp;context)
  {
    int sum=0;
    while(context.nextValue()) {
      sum++;
    }
    context.emit(context.getInputKey(),HadoopUtils::toString(sum));
  }
};

int main(int argc,char*argv[])
{
  return HadoopPipes::runTask(HadoopPipes::TemplateFactory&lt;DataCountMap, DataCountReduce&gt;());
}
</pre>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">上面的程序挺简单的，只要你知道了map-reduce的基本原理。</font></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">一个map类，一个reduce类，一个执行任务的main函数。</font></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">map类对每一行数据进行拆分，当找到我们感兴趣的&ldquo;kkk&rdquo;或&ldquo;nnn&rdquo;时，就生成一条输出的记录（emit函数的作用）；recude类对map的数据进行汇总，这里只是简单地计数，所以每次+1。</font></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">（3）有了代码，我们接着就要编写相应的Makefile了。我的Makefile如下：</font></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">HADOOP_INSTALL = /usr/local/hadoop</font></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">INCLUDE_PATH = $(HADOOP_INSTALL)/src/c++/</font></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	&nbsp;</p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">CC &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= g++</font></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">CXXFLAGS = -Wall -g \</font></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-I${INCLUDE_PATH}pipes/api/hadoop \</font></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-I${INCLUDE_PATH}utils/api/hadoop</font></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">LDFLAGS = -ljvm -lhadooppipes -lhadooputils -lpthread</font></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	&nbsp;</p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">OBJECTS=dz_count.o</font></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); "><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">dz_count: $(OBJECTS)</font></span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;"><font class="Apple-style-span"><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">$(CC) $(CXXFLAGS) -o $@ $(OBJECTS) $(LDFLAGS)</font></font></span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">&nbsp;</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><font class="Apple-style-span" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">其中，</font>HADOOP_INSTALL是你的hadoop安装路径，其余的&nbsp;INCLUDE_PATH&nbsp;等请对照你的目录做相应更改，最后生成的可执行程序名为dz_count。这里没有考虑release，因为仅作简单的说明用。</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">（4）有了代码和Makefile，就可以编译了。编译得到可执行程序dz_count。将其上传到hdfs中：</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); ">hadoop fs -put dz_count /my_dir/<br />
	</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">其中 &ldquo;/my_dir/&rdquo; 是你在hdfs中的目录。</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">（5）下面就可以运行我们的hadoop程序了：</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); ">hadoop pipes -D hadoop.pipes.java.recordreader=true -D hadoop.pipes.java.recordwriter=true -input /data/ -output /my_dir/output -program /my_dir/dz_count<br />
	</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">其中，<span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); ">-input /data/&nbsp;</span>表明你的输入数据（即你的源数据）所处的hdfs目录为&nbsp;/data/，-output /my_dir/output&nbsp;表明你的输出文件目录为&nbsp;/my_dir/output，&ldquo;output&rdquo; 这一级目录必须不存在（如果存在会报错），程序运行时会生成它。-program /my_dir/dz_count&nbsp;表明你要运行的程序为&nbsp;/my_dir/&nbsp;目录下的&nbsp;dz_count&nbsp;程序。</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">回车之后程序就开始执行，随后你可以在命令行下看到它的状态在更新，或者在hadoop JobTracker中也可以观察到程序的运行状态。</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">（6）等程序执行完后，如果任务没有失败的话，我们可以看到，你前面指定的hdfs输出目录&nbsp;/my_dir/output&nbsp;里生成了一个文件（假设其名为&ldquo;part-00000&rdquo;），我们就可以查看执行结果了：</font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 0, 255); ">hadoop fs -cat /my_dir/output/part-00000</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">输出结果形为：</span></font></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#a52a2a;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">kkk &nbsp; 178099387</span></font></span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#a52a2a;"><font class="Apple-style-span"><span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">nnn &nbsp; 678219805</span></font></span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">表明第二项为&ldquo;kkk&rdquo;的数据行共有178099387条，而&ldquo;nnn&rdquo;则为678219805条。</span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">顺便再说一点废话：</span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">（1）如何中止一个hadoop任务？当你在命令行下提交了一个hadoop job后，就算你按Ctrl+C，也不能中止掉那个job，因为它已经被Jobtracker接管了。这时，你要用如下命令中止它：</span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#00f;">hadoop job -kill </span><span style="color:#f00;">Job_ID</span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">其中，Job_ID就是你提交的job的ID，可以在Jobtracker中查看到。</span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">（2）一些基本概念：</span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">map-reduce过程中，在map时，hadoop会将输入的数据按一定的大小（例如100M，这个值是可以配置的）分为若干块来处理，一个块对应一个map类，也就是说，一个块只会执行map类的构造函数一次。而每一行记录则对应一个map()方法，也就是说，一行记录就会执行一次map()方法。因此，如果你有什么信息需要输出（例如std::cout）的话，就要注意了：如果在map()方法中输出，则当输入数据量很大时，可能就会输出太多的信息，如果可以在map的构造函数中输出的话，则输出的信息会少得多。</span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">在reduce时，对map输出的同一个key，有一个reduce类，也就是说，无论你的同一个key有多少个value，在reduce的时候只要是同一个key，就会出现在同一个reduce类里，在这个类里的reduce方法中，你用 while (context.nextValue()) 循环可以遍历所有的value，这样就可以处理同一个key的N个value了。<br />
	正因为在默认情况下，相同key的记录会落到同一个reducer中，所以，当你的key的数量比你设置的reducer的数量要少的时候，就导致了某些reducer分配不到任何数据，最终输出的某些文件（part-r-xxxxx）是空文件。如果你设置的reducer数量要少于key的数量（这是最常见的情况），那么就会有多个key落入同一个reducer中被处理，但是，每一次reduce()方法被调用时，其中将只包含一个key，同一个reducer里的多个key就会导致reduce()方法被多次调用。</span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">这样，我们就完成了一个完整的C++ hadoop分布式应用程序的编写。</font></span></span></p>
<p>	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
	<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
	转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
	感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
	<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>

			<!--[syntaxhighlighter]-->
			<!--代码高亮，请勿编辑-->
			<script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shCore.js"></script><script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shBrushCpp.js"></script>

			<link type="text/css" rel="stylesheet" href="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/styles/shCoreCk.css" />
			<link type="text/css" rel="stylesheet" href="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/styles/shThemeCk.css" />
			<script type="text/javascript">
			SyntaxHighlighter.defaults['class-name']	= '';
			SyntaxHighlighter.defaults['smart-tabs']	= true;
			SyntaxHighlighter.defaults['tab-size']		= 2;
			SyntaxHighlighter.defaults['gutter']		= true;
			SyntaxHighlighter.defaults['quick-code']	= true;
			SyntaxHighlighter.defaults['collapse'] 		= false;
			SyntaxHighlighter.defaults['auto-links']	= true;
			SyntaxHighlighter.defaults['toolbar']		= true;
			SyntaxHighlighter.all();
			</script>
			<!--[/syntaxhighlighter]-->]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%b8%80%e6%ad%a5%e6%ad%a5%e6%95%99%e4%bd%a0%ef%bc%9a%e7%94%a8c%e5%bc%80%e5%8f%91%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84hadoop%e5%88%86/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
