1. 程式人生 > >hadoop初遇爬坑

hadoop初遇爬坑

下載

在下面的地址下載位元組需要的版本,如果是windows下建議先下載hadoop windows工具包看一下現在支援哪些版本,然後選擇對應的hadoop版本。

hadoop下載 hadoop windows工具包

下載完之後解壓:

hadoop-winutil

					hadoop windows工具包可選版本

hadoop-util-bin

					hadoop windows工具包bin目錄

hadoop

					hadoop根目錄

hadoop-bin

					hadoop bin目錄

使用hadoop工具包的bin目錄覆蓋hadoop的bin目錄,注意對應版本,一般大版本對上基本就沒有問題。覆蓋之前最好先備份

配置檔案

core-site.xml

<configuration>
    <property>       
        <name>fs.defaultFS</name>       
        <value>hdfs://localhost:9000</value>   
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/G:/datacenter/data30/tmp</value>
    </property>
</configuration>

主要配置的是hdfs這個檔案系統的訪問介面和臨時目錄。

hdfs-site.xml

<configuration>
    <property>       
        <name>dfs.replication</name>       
        <value>1</value>   
    </property>   
    <property>       
        <name>dfs.namenode.name.dir</name>       
        <value>/G:/datacenter/data30/namenode</value>   
    </property>   
    <property>       
        <name>dfs.datanode.data.dir</name>     
        <value>/G:/datacenter/data30/datanode</value>   
    </property>
</configuration>

配置hdfs系統的namenode目錄和datanode目錄。

mapred-site.xml

<configuration>   
    <property>       
        <name>mapreduce.framework.name</name>       
        <value>yarn</value>   
    </property>
</configuration>

yarn-site.xml

<configuration>   
    <property>       
        <name>yarn.nodemanager.aux-services</name>       
        <value>mapreduce_shuffle</value>   
    </property>   
    <property>       
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>   
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>   
    </property>
</configuration>

這裡的yarn不是打包工具,而是一個資源排程器,YARN只提供運算資源的排程,使用者程式向YARN申請資源,YARN就負責分配資源。

YARN中的主管角色叫ResourceManager,YARN中具體提供運算資源的角色叫NodeManager。

啟動

把winutil的bin目錄拷貝到hadoop的bin目錄下,直接執行替換操作,建議替換之前先備份。然後把hadoop.dll動態連結檔案拷貝一份到C:\Windows\System32目錄下。

替換完成之後先配置一下環境變數,假設已經配置了JAVA的環境變數,就只需要配置HADOOP_HOME,指向hadoop的解壓目錄就可以了,然後path中加上hadoop的bin和sbin目錄。

記得前面建立的目錄,現在要先格式化hadoop:

hadoop namenode -format
hdfs namenode -format

上面2個命令任意一個,推薦下面一個,格式化成功之後,前面配置的namenode目錄下會出現一個current資料夾。

現在就可以執行start-all.cmd指令碼了,當然也可以先執行start-hdfs.xml,然後執行start-yarn.xml指令碼。

start-hdfs.xml啟動的是namenode和datanode,start-yarn.xml啟動的是resourcemanager和nodemanager。

啟動好之後執行一下jps命令,可能看到下面的內容:

JobTracker
SecondaryNameNode
NodeManager
ResourceManager
NameNode
DataNode

因為是單機,不是叢集所以可能只有下面4個:

NodeManager
ResourceManager
NameNode
DataNode

可以訪問: http://localhost:50070 來檢視hdfs的web介面。

hadoop3.0開始訪問: http://localhost:9870

也可以通過下面的配置修改(core-site.xml):

<property>
  <name>dfs.namenode.http-address</name>
  <value>127.0.0.1:50070</value>
</property>

hdfs-web

可以訪問: http://localhost:8088 來檢視yarn的web介面,為了先用起來這裡先不詳細介紹,後面會補充一點內容。

yarn-web

hdfs命令與Java介面

hdfs基本命令

hadoop fs -rm -r /dir #刪除
hadoop fs -ls -R /dir #列表
hadoop fs -mkdir /dir #建立目錄
hadoop fs -put in.txt /tmp #上傳
hadoop fs -get /tmp/in.txt out.txt #下載

我們可以看到hadoop fs命令和操作linux的命令基本一致,上面需要注意一點的就是檔案上傳和下載了。上傳檔案指定的目錄一定要存在。

例如,上面的上傳命令就會把當前目錄下的in.txt檔案上傳到hdfs的/tmp目錄下,使用列表命令就可以看到hdfs有一個/tmp/in.txt檔案。

下載命令也一樣,指定hdfs的路徑,後一個是本地的路徑。

hdfs Java介面

這裡使用maven地方方式,先新增依賴:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>${hadoop.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>${hadoop.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>${hadoop.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-mapreduce-client-core</artifactId>
    <version>${hadoop.version}</version>
</dependency>

這裡的${hadoop.version}選擇對應hadoop的版本就可以了。

下面是一個hdfs操作的簡單示例:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class HDFSUtilTest {

    private static final String PATH = "hdfs://localhost:9000/";

    private static final String DIR = "/dir";

    private static final String FILE = "/dir/hello2";

    public static final String IN = "G:\\tmp\\in2.txt";


    /**
     * 刪除資料夾 hadoop fs -rmr /dir
     * @throws IOException
     */
    @Test
    public void remove() throws IOException, URISyntaxException {
        FileSystem fileSystem = getFileSystem();
        Path path = new Path(DIR);
        fileSystem.delete(path, true);
    }

    /**
     * 瀏覽資料夾 hadoop fs -lsr path
     * @throws IOException
     * @throws URISyntaxException
     */
    @Test
    public void list() throws IOException, URISyntaxException {
        FileSystem fileSystem = getFileSystem();
        Path root = new Path("/");
        FileStatus[] listStatus = fileSystem.listStatus(root);
        for (FileStatus fileStatus : listStatus) {
            String isDir = fileStatus.isDirectory() ? "資料夾" : "檔案";
            String permission = fileStatus.getPermission().toString();
            int replication = fileStatus.getReplication();
            long len = fileStatus.getLen();
            String path = fileStatus.getPath().toString();
            System.out.println(isDir + "\t" + permission + "\t" + replication
                    + "\t" + len + "\t" + path);
        }
    }

    /**
     * 下載檔案 hadoop fs -get src des
     * @throws IOException
     * @throws URISyntaxException
     */
    @Test
    public void getData() throws IOException, URISyntaxException {
        FileSystem fileSystem = getFileSystem();
//        String file = "/out/_SUCCESS";
        String file = "/out/part-r-00000";
        Path path = new Path(file);
        FSDataInputStream inputStream = fileSystem.open(path);
        IOUtils.copyBytes(inputStream, System.out, 1024, true);
    }

    /**
     * 上傳檔案 hadoop fs -put src des
     * @throws IOException
     * @throws URISyntaxException
     */
    @Test
    public void putData() throws IOException, URISyntaxException {
        FileSystem fileSystem = getFileSystem();
        Path path = new Path(FILE);
        FSDataOutputStream out = fileSystem.create(path);
        FileInputStream in = new FileInputStream(IN);
        IOUtils.copyBytes(in, out, 1024, true);
    }

    /**
     * 建立資料夾 hadoop fs -mkdir /dir
     * @throws IOException
     * @throws URISyntaxException
     */
    @Test
    public void mkDir() throws IOException, URISyntaxException {
        FileSystem fileSystem = getFileSystem();
        Path path = new Path(DIR);
        fileSystem.mkdirs(path);
    }

    private static FileSystem getFileSystem() throws IOException, URISyntaxException {
        URI uri = new URI(PATH);
        Configuration conf = new Configuration();
        FileSystem fileSystem = FileSystem.get(uri, conf);
        return fileSystem;
    }

}

hadoop mapreduce

下面是一個經典的hadoop mapreduce入門級示例。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

import java.io.IOException;
import java.util.StringTokenizer;

public class WordCount {

    public static class TokenizerMapper extends Mapper<Object, Text,Text, IntWritable>{

        private final static IntWritable one = new IntWritable(1);

        private Text word = new Text();

        @Override
        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            StringTokenizer stringTokenizer = new StringTokenizer(value.toString());
            while (stringTokenizer.hasMoreTokens()){
                word.set(stringTokenizer.nextToken());
                context.write(word,one);
            }
        }
    }

    public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
        private IntWritable result = new IntWritable();

        @Override
        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for(IntWritable num : values){
                sum += num.get();
            }
            result.set(sum);
            context.write(key,result);
        }
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration configuration = new Configuration();
        configuration.set("fs.default.name", "hdfs://localhost:9000");
        String[] remainingArgs = new GenericOptionsParser(configuration, args).getRemainingArgs();
        if(remainingArgs.length < 2){
            System.out.println("args error");
            System.exit(2);
        }
        Job job = Job.getInstance(configuration, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(remainingArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(remainingArgs[1]));
        System.exit(job.waitForCompletion(true) ? 0:1);
    }
}

導包的時候會發現有mapreduce包和mapred包,暫時還沒有了解這2個包有什麼區別。

main接收2個引數,第一個引數是要處理檔案的目錄,第二個是處理結果的輸出目錄。

就是把第一個引數指定的目錄下的檔案使用TokenizerMapper這個類的map方法,就是使用StringTokenizer分詞,然後使用IntSumReducer的reduce方法執行了一個彙總操作。

注意:這個mapreduce操作都在hdfs上進行的,所以可以先通過命令將要分析的檔案上傳到hdfs上。

另外指定目錄的時候是不是以/開頭的很重要,如果不是以/開頭就會在前面拼接上系統屬性user.dir的值。例如,指定的路徑是"in/data.txt",實際上會轉換為/home/username/in/data.txt這個路徑,如果是"/in/data.txt",那麼就是路徑本身。

YARN

Scheduler

Scheduler是排程器,根據應用程式的資源需求進行資源分配,不參與應用程式具體的執行和監控等工作資源分配的單位就是Container,排程器是一個可插拔的元件,使用者可以根據自己的需求實 現自己的排程器。YARN 本身為我們提供了多種直接可用的排程器,比如 FIFO,Fair Scheduler 和Capacity Scheduler等。

ResourceManager

ResourceManager 是基於應用程式對叢集資源的需求進行排程的 YARN 叢集主控節點,負責 協調和管理整個叢集(所有 NodeManager)的資源,響應使用者提交的不同型別應用程式的 解析,排程,監控等工作。ResourceManager 會為每一個 Application 啟動一個 MRAppMaster,並且MRAppMaster分散在各個NodeManager節點。

ResourceManager的職責:

  1. 處理客戶端請求
  2. 啟動或監控 MRAppMaster
  3. 監控 NodeManager
  4. 資源的分配與排程

NodeManager

NodeManager是YARN叢集當中真正資源的提供者,是真正執行應用程式的容器的提供者, 監控應用程式的資源使用情況,並通過心跳向叢集資源排程器 ResourceManager 進行彙報以更新自己的健康狀態。同時其也會監督Container的生命週期管理,監控每個 Container 的資源使用情況,追蹤節點健康狀況,管理日 志和不同應用程式用到的附屬服務。

NodeManager的職責:

  1. 管理單個節點上的資源
  2. 處理來自 ResourceManager 的命令
  3. 處理來自 MRAppMaster 的命令

MRAppMaster

MRAppMaster 對應一個應用程式,職責是:向資源排程器申請執行任務的資源容器,執行 任務,監控整個任務的執行,跟蹤整個任務的狀態,處理任務失敗以異常情況

Container

Container 容器是一個抽象出來的邏輯資源單位。容器是由 ResourceManager Scheduler 服務 動態分配的資源構成,它包括了該節點上的一定量 CPU,記憶體,磁碟,網路等資訊,MapReduce 程式的所有 Task 都是在一個容器裡執行完成的,容器的大小是可以動態調整的

ASM

應用程式管理器 ASM 負責管理整個系統中所有應用程式,包括應用程式提交、與排程器協 商資源以啟動 MRAppMaster、監控MRAppMaster執行狀態並在失敗時重新啟動它等。

文件

相關推薦

hadoop

下載 在下面的地址下載位元組需要的版本,如果是windows下建議先下載hadoop windows工具包看一下現在支援哪些版本,

小白帶你解決Windows上安裝Hadoop

一、坑一 Error: JAVA_HOME is incorrectly set. Please update D:\javatemps\hadoop-2.7.2\conf\hadoop-env.cmd 提升我的java環境搭建錯誤,可是剛剛執行如此命令還可以:

Hadoop入門的

2018-01-07 02:19:05,166 INFO org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: STARTUP_MSG: /************************************************

第一次網站嘗試

run 兩個 訪問百度 eat text utf-8 float a標簽 ssi 記錄自己做的網站所遇到的問題和Get到的新知識。 首先是網頁自動刷新問題:在Head標簽下: <head runat="server"> <%--<meta

前端日記(1),你在入vue專案開發過程中可能會掉進的

這篇文章是記錄我在vue專案開發中遇到的各種巨坑,希望看了能對你有一些幫助,這篇文章會長期更新 1.Vue中使用sass 首先通過以下程式碼安裝sass的依賴: npm i sass-loader node-sass - s 然後在webepack.base.conf.js目錄下配置

【大資料】Hadoop上陣(安裝真是

剛剛裝完了偽分散式的Hadoop,來寫一下感謝,並記錄一下遇到的bug。 我是按著我們學校的發的大資料教程敲的,但是遇到一大堆bug,估計是選錯hadoop版本了,書上寫的用hadoop-2.7.3而我用的是hadoop-2.7.5,反正總結一下吧 首先用的是Ubuntu系統(也就是Linu

sass的兩個小問題

並且 有變 開發工具 utf-8 sass com nbsp 編程 html 關於sass大家都知道是一種css的開發工具,原本的css沒有變量 參數一類的東西,所以比較死 效率較慢。 sass就是在css裏面加入了一些編程的元素如變量等,讓css能夠

C#:一個簡單的小程序(圓形周長,面積計算器)

編碼 雙精度 崩潰 輸入 面向對象 窗口 語句 readline 面向對象的語言 作為一個面向對象的語言,與用戶的交互很關鍵! 在此,我們可以先分析一下我們這個小程序要與用戶交互的內容:1.命名很重要,讓用戶看見這個程序就知道這個程序的作用。 2.當用戶打開這個程序時,提示

C#:健康計算器

最小值 () 標準 最大 兩個 選擇 bsp min 用戶 上次寫了一個簡單的圓形的周長和面積計算器,這個我們來寫一個對大家都很重要的健康計算器,畢竟健康是福嘛,有了健康,什麽都會有!所以我們都要保持健康! 編程開始: Console.Write("請輸入你的性別(男或

vue-cli 中遇見的問題,記錄日常!

ges code spa jpg mage 插件 圖片 alt res 本片文章我將會記錄使用vue-cli 以及一些相關插件遇見的問題和解決方案,另外本文章將會持續更新,本著互聯網分享精神,希望我所記錄的日常能對大家有所幫助。 1、在img和html文件處於同級階段,im

vue項目實戰小記002

rms lan min ret msg 實例 div clas exp 1.如何使用vuex來保存數據(需要傳參的情況下) 實例說明:登錄->緩存用戶信息->跳轉到首頁->從state獲取用戶信息顯示在頁面上 step1: 新建store.js作為初始化v

Hadoop體驗:快速搭建Hadoop偽分布式環境

hadoop 偽分布式 大數據 0.前言 本文旨在使用一個全新安裝好的Linux系統從0開始進行Hadoop偽分布式環境的搭建,以達到快速搭建的目的,從而體驗Hadoop的魅力所在,為後面的繼續學習提供基礎環境。 對使用的系統環境作如下說明:操作系統:CentOS 6.5 64位主機I

關於小程序支付功能的

one result union 實例化 article .com 裏的 分用 color 代碼大部分用的http://www.wxapp-union.com/article-2516-1.html提供的。 但是,此代碼在使用org.apache.httpcomponent

【京東賬戶】——Mysql/PHP/Ajax之頁頭頁尾加載

type () str 頭文件 環境 ade div sql 引入 一、引言 實現京東的賬戶項目,有一個小功能,頁頭頁尾加載。要用到的是Apach環境,Mysql、PHP以及Ajax。 二、實現 原理: 用php文件分別寫一個的頁頭和一個頁尾,放在前後兩個div裏。

vue的挖坑和之css背景圖樣式終極解決方法

link tro round 源文件 nbsp -i css樣式 -h pat 原問題 #wrapper{ width:100%; height:100%; position:fixed;

css挖坑之div高寬相等

屬性 brush png display 解決方法 了解 技術 pan eight 目標效果 對於這麽一個頭像,外面是一個圓角的div裏面是一個img,對於外面的div我要使他高度等於寬度。 發現問題 開始的時候設置寬度為100%然後高度為100%,這樣子對於寬度

【2048小遊戲】——CSS/原生js之純CSS模態對話框&遊戲結束

函數 一半 窗口 內容 href 標準 tex true 存儲空間 引言:2048小遊戲的結束界面,使用純CSS制作模態對話框,一般做模態對話框都會使用BootStrap自帶的模態對話框組件方便使用,但在制作要運行在移動端的小項目時,就不能使用BootStrap,因為文件太

Centos6.9安裝Node.js+npm

org node.js node libs .tar.xz linu eva 報錯 .tar.gz Node.js選擇 1.下載 wget https://nodejs.org/dist/v8.4.0/node-v8.4.0-linux-x86.tar.gz 2.解壓

angular4之之路(2)angular腳手引入第三方類庫

scrip 1-1 sta 引入 logs .json 類比 ima 第三方 如何在angular4腳手架中引入第三方類庫呢比如jquery、swiper、bootstrap。。。。。。 例如引入jquery:(其他類庫類比jquery即可) 第一步:在我們的項目目錄下

react之路(一)--報錯output.path不是絕對路徑

bpa file 文件 開始 put pac 這就是 文件頭部 之前   之前,一直在糾結是學習angular好,學習vue好,還是學習react好,網上一搜索,也是各種對比,各種互噴,看過之後更糾結。就跟小時候一樣糾結長大了是上清華好,還是上北大好,最後證明我想多了。總之