C++ Hadoop實戰備忘
看到這麼火,咱也來湊把熱鬧,瞧瞧到底是什麼神奇的技術。
實戰過程,還是很波折。
畢竟,對這些hadoop的命令不是很熟。
所幸,天不負有心人,終於跑通了第一個示例。
對我而言,這個的意義,不亞於輸出了開天闢地的“hello world”。
配置過程中出錯時,不要洩氣,一般是由於路徑配置不對引起,可與本文件對比查錯。
作業系統:Ubuntu 10.04 LTS
JDK:jdk-6u18-linux-i586.bin
Hadoop:hadoop-0.21.0
說明:hadoop版本一定要與本文件匹配,新版本目錄格式已做修改。
1、安裝jdk1.6.0_18
1)在usr下面新建一個資料夾Java,然後將jdk複製過來.
sudo mkdir /usr/Java
sudo cp jdk的路徑 /usr/Java
2)進入到Java目錄下,改變檔案許可權為可執行
cd /usr/Java
sudo chmod u+x jdk-6u18-linux-i586.bin
3)執行安裝
(現象為Unpacking....加一連串解壓資訊)
sudo ./jdk-6u18-linux-i586.bin
2、安裝hadoop0.21.0
1)將hadoop0.21.0.tar.gz複製到usr下面的local資料夾內
sudo cp hadoop的路徑 /usr/local
2)進入到local目錄下,解壓hadoop-0.21.0.tar.gz
cd /usr/local
sudo tar -xzf hadoop-0.21.0.tar.gz
3)為了方便管理,將解壓後的資料夾名改為hadoop
sudo mv hadoop-0.21.0 hadoop
3、建立一個名為hadoop的使用者和使用者組
1)建立一個名為hadoop的使用者組
sudo addgroup hadoop
2)建立一個名為hadoop的使用者,歸到hadoop使用者組下
sudo adduser --ingroup hadoop hadoop
3)用gedit開啟etc下的sudoers檔案
sudo gedit /etc/sudoers
4)在 root ALL=(ALL) ALL 下面新增如下一行,然後儲存關閉gedit
hadoop ALL=(ALL) ALL
4、配置環境變數
1)用gedit開啟etc下的profile檔案
sudo gedit /etc/profile
2)在檔案最後加入如下幾行
export CLASSPATH=.:/usr/Java/jdk1.6.0_23/lib:/usr/Java/jdk1.6.0_18/jre/lib:$CLASSPATH
export PATH=.:/usr/Java/jdk1.6.0_23/bin:/usr/Java/jdk1.6.0_18/jre/bin:/usr/local/hadoop/bin:$PATH
3)儲存後關閉gedit,並重啟機器
sudo reboot
4)重啟後用hadoop使用者登入,驗證配置是否成功
java -version(驗證java配置是否成功)
5、建立ssh-key
1)確保網路通暢,然後裝載ssh服務
sudo apt-get install openssh-server
2)建立ssh-key,為rsa
ssh-keygen -t rsa --P
3)將此ssh-key新增到信任列表中,並啟用此ssh-key
cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys
sudo /etc/init.d/ssh reload
4)重啟系統
6、配置hadoop
1)進入到hadoop目錄下,配置conf目錄下的hadoop-env.sh中的JAVA_HOME
cd /usr/local/hadoop
sudo gedit conf/hadoop-env.sh
(開啟後在文件的上部某行有“#export JAVA_HOME=...”字樣的地方,去掉“#”,然後在等號後面填寫你的jdk路徑,完全按此文件來的話應改為 "export JAVA_HOME=/usr/Java/jdk1.6.0_23" )
2)配置conf目錄下的core-site.xml
sudo gedit conf/core-site.xml
配置檔案內容core-site.xml。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
</configuration>
3)配置conf目錄下的mapred-site.xmlsudo gedit conf/mapred-site.xml
配置檔案內容mapred-site.xml。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
4)格式化namenode (首次執行必需的)
cd /usr/local/hadoop
hadoop namenode -format
5)啟動hadoop
sudo chown -hR hadoop /usr/local/hadoop
bin/start-all.sh
說明:若啟動異常,可重啟後重試。
6)驗證hadoop是否正常啟動
jps
以本機為例,輸出
2776 SecondaryNameNode
10848 Jps
2322 NameNode
2886 JobTracker
2539 DataNode
3102 TaskTracker
步驟二、執行C++ MapReduce程式
1、建立wordcount.cpp
cd /home/hadoop/tmp
mkdir wordcount
cd wordcount
sudo gedit wordcount.cpp
#include<algorithm>
#include<limits>
#include<string>
#include"stdint.h"
#include"hadoop/Pipes.hh"
#include"hadoop/TemplateFactory.hh"
#include"hadoop/StringUtils.hh"
using namespace std;
class WordCountMapper:public HadoopPipes::Mapper
{
public:
WordCountMapper(HadoopPipes::TaskContext& context){}
void map(HadoopPipes::MapContext& context)
{
string line =context.getInputValue();
vector<string>word = HadoopUtils::splitString(line, " ");
for (unsigned int i=0; i<word.size(); i++)
{
context.emit(word[i],HadoopUtils::toString(1));
}
}
};
class WordCountReducer:public HadoopPipes::Reducer
{
public:
WordCountReducer(HadoopPipes::TaskContext& context){}
void reduce(HadoopPipes::ReduceContext& context)
{
int count = 0;
while (context.nextValue())
{
count +=HadoopUtils::toInt(context.getInputValue());
}
context.emit(context.getInputKey(),HadoopUtils::toString(count));
}
};
int main(int argc, char **argv)
{
return HadoopPipes::runTask(HadoopPipes::TemplateFactory<WordCountMapper,WordCountReducer>());
}
2、建立Makefile編譯檔案
sudo gedit Makefile
CC = g++
HADOOP_INSTALL = /usr/local/hadoop
PLATFORM = Linux-i386-32
CPPFLAGS = -m32 -I$(HADOOP_INSTALL)/c++/$(PLATFORM)/include
LIBS = -L$(HADOOP_INSTALL)/c++/$(PLATFORM)/lib -lhadooppipes -lhadooputils -lpthread
wordcount: wordcount.cpp
$(CC) $(CPPFLAGS) $< -Wall $(LIBS) -g -O2 -o [email protected]
3、執行編譯檔案
make
4、上傳執行程式到hdfs
hadoop fs -mkdir bin
hadoop fs -put wordcount bin
5、準備測試檔案
sudo gedit myfile.txt
檔案內容:1 2 3 4 5 6 7 8 9 10 11 12 13。
6、上傳測試檔案
hadoop fs -mkdir input
hadoop fs -put myfile.txt input
7、編寫配置檔案
sudo gedit job_config.xml
<?xml version="1.0"?>
<configuration>
<property>
<name>mapred.job.name</name>
<value>WordCount</value>
</property>
<property>
<name>mapred.reduce.tasks</name>
<value>10</value>
</property>
<property>
<name>mapred.task.timeout</name>
<value>180000</value>
</property>
<property>
<name>hadoop.pipes.executable</name>
<value>/user/hadoop/bin/wordcount</value>
<description> Executable path is given as"path#executable-name"
sothat the executable will havea symlink in working directory.
This can be used for gdbdebugging etc.
</description>
</property>
<property>
<name>mapred.create.symlink</name>
<value>yes</value>
</property>
<property>
<name>hadoop.pipes.java.recordreader</name>
<value>true</value>
</property>
<property>
<name>hadoop.pipes.java.recordwriter</name>
<value>true</value>
</property>
</configuration>
8、執行任務
hadoop fs -rmr output
hadoop pipes -conf job_config.xml -input input/myfile.txt -output output -program bin/wordcount
9、檢視結果
hadoop fs -ls output
hadoop fs -cat output/part-00000
hadoop fs -cat output/part-00001
結果格式如下
1 1
12 1
13 1
2 1
3 1
4 1
5 1
相關推薦
C++ Hadoop實戰備忘
前言:hadoop用於解決大資料處理問題。 看到這麼火,咱也來湊把熱鬧,瞧瞧到底是什麼神奇的技術。 實戰過程,還是很波折。 畢竟,對這些hadoop的命令不是很熟。 所幸,天不負有心人,終於跑通了第一個示例。 對我而言,這個的意義,不亞於輸出了開天闢地的“hello wor
C# 用實例來理解IComparable和IComparer
大於 sum summary spa 必須 理解 實例 eap bject 通過Array的Sort方法來理解的 Sort方法要 通過對象去繼承IComparable接口來實現排序(當然也有其它辦法),我想入門這可能就是對這句話有點不理解,在下面會有註釋 using
一起talk C栗子吧(第三十四回:C語言實例--巧用溢出計算最值)
gcc 空間 代碼 讓我 計算 max value 其他 存儲 點擊 各位看官們。大家好,上一回中咱們說的是巧用移位的樣例,這一回咱們說的樣例是:巧用溢出計算最值。 閑話休提,言歸正轉。讓我們一起talk C栗子吧! 大家都知
一起talk C栗子吧(第一百一十九回:C語言實例--線程死鎖三)
取數 string value reading sel 一個 second key 而且 各位看官們。大家好,上一回中咱們說的是線程死鎖的樣例,這一回咱們繼續說該樣例。閑話休提,言歸正轉。讓我們一起talk C栗子吧! 看官們,由於篇幅的原因我們
一起talk C栗子吧(第一百二十三回:C語言實例--顯示變量和函數的地址)
調試 ora 部分 example 多線程 ear red 語言 help 各位看官們,大家好,上一回中咱們說的是多線程的樣例。這一回咱們說的樣例是:顯示變量和函數的地址。閑話休提,言歸正轉。讓我們一起talk C栗子吧! 在編敲代碼時,有時候須
一起talk C栗子吧(第九十六回:C語言實例--使用共享內存進行進程間通信二)
class mar net 表示 func clas ber 數字 標記 各位看官們。大家好,上一回中咱們說的是使用共享內存進行進程間通信的樣例,這一回咱們接著上一回內容繼續說使用共享內存進行進程間通信。閑話休提,言歸正轉。讓我們一起talk C栗子
一起talk C栗子吧(第一百二十四回:C語言實例--內置宏)
parent tracking 通過 end variable view ddc 工作效率 語法 各位看官們,大家好,上一回中咱們說的是顯示變量和函數地址的樣例,這一回咱們說的樣例是:內置宏。閑話休提,言歸正轉。讓我們一起talk C栗子吧! 看官
一起talk C栗子吧(第八十四回:C語言實例--使用信號進行進程間通信一)
split article 語言 方法 pin 第一個 ping num ont 各位看官們,大家好,上一回中咱們說的是進程間通信的樣例。這一回咱們說的樣例是:使用信號進行進程間通信。閑話休提,言歸正轉。讓我們一起talk C栗子吧! 我們在上一
一起talk C栗子吧(第一百三十一回:C語言實例--C程序內存布局三)
view tracking 變化 content easy 內存 ask tex 延伸 各位看官們,大家好。上一回中咱們說的是C程序內存布局的樣例,這一回咱們繼續說該樣例。閑話休提,言歸正轉。讓我們一起talk C栗子吧。 看官們,關於C程序內
C語言實訓——撲克牌洗牌程序
撲克牌洗牌 highlight 函數 程序 switch return true In cas 說明此程序本來是21點撲克程序的一個被調函數,在這裏我單獨將它拿出來作為一個小程序。 #include<stdio.h> #include&
C語言實例解析精粹學習筆記——18
static abcd str 工作 結果 size put cls 字符 《C語言實例解析精粹》中編譯環境采用的是Turbo C 2.0。但是這個編譯器年代久遠,較新的編譯器對書中的某些例子支持不好,在學習的時候同時做一些筆記。 實例18:將一個無符號整數轉換為任意d進制
C語言實例解析精粹學習筆記——19
sca sta tran int nbsp unsigned define col 表示 實例19:判斷正整數n的d進制表示形式是否是回文數(順著看和倒著看相同的數)。 主要思路: 一種方法:將正整數n數轉換成d進制的數,逐個比較首尾對應數字,判斷是否為回文數。 另一種方法
C語言實例解析精粹學習筆記——29
r+ 函數 復制 printf bsp 不同 getch 多余 個數 題目: 將字符行內單字之間的空格平均分配插入到單字之間,以實現字符行排版。也就是輸入一個英文句子,單詞之間的空格數目不同,將這些空格數平均分配到單詞之間,重新輸出。 代碼如下(是原書中配套
C語言實例解析精粹學習筆記——32
組合 pri 結構體指針 name ber ESS tdi 筆記 string 實例32: 編制一個包含姓名、地址、郵編和電話的通訊錄輸入和輸出函數。 思路解析: 1、用結構體來完成姓名、地址、郵編和電話的組合。 2、結構體指針的使用。 3、malloc的使
C語言實訓報告——學生宿舍資訊管理系統
功能描述 該學生宿舍資訊管理系統主要實現的功能有:建立學生宿舍資訊,顯示學生宿舍資訊,查詢學生宿舍資訊,修改學生宿舍資訊,刪除學生宿舍資訊,儲存學生宿舍資訊,讀取學生宿舍資訊。其系統功能模組圖如下: 完整程式碼如下: #include<stdio.h> #include
idea執行mapreduce報錯 Could not locate Hadoop executable: C:\hadoop-3.1.1\bin\winutils.exe
window執行mapreduce報錯 Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate Hadoop executable: C:\ha
關於C++中實參形參的傳遞問題
這裡說的傳遞當然是指 實參是如何傳遞給形參的啦 還挺複雜的~~~~~~~~⊙﹏⊙b汗,這裡講述了4種引數傳遞的情況和注意事項: 1.非引用形參 這是最普通,也是最簡單的形參傳遞了。 引數傳遞,即是使用實參副本(注意啊,是副本,不是實參本身)來初始化形參; 因此,在函式體
Linux下靠譜的獲取本機IP的C程式碼實
這裡寫程式碼片http://blog.csdn.net/langeldep/article/details/8306603 正在做一個網路程式設計的任務,多臺裝置向伺服器傳送圖片,傳送圖片的時候同時告訴伺服器自己的IP。伺服器根據IP來區分不同的裝置,將圖片存
C# Hadoop
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Hadoop; using Mic
C# Hadoop學習筆記(一)—環境安裝
一、安裝環境 1,前期準備:官網下載“NuGet Package Manager”,按自己已有的VS環境下載對應版本; 3,安裝。 4,通過HDInsight,安裝Windows Azure,目前是預覽版本。 二、測試DEMO using System; using