1. 程式人生 > >C++ Hadoop實戰備忘

C++ Hadoop實戰備忘

前言: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.xml
      sudo 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