大資料 Hadoop介紹、配置與使用

Notzuonotdied發表於2018-09-15

前言

Hadoop是Apache軟體基金會旗下的一個開源分散式計算平臺。

介紹

Hadoop是Apache軟體基金會旗下的一個開源分散式計算平臺。以Hadoop分散式檔案系統HDFS(Hadoop Distributed File System,)和MapReduce(Google MapReduce的開源實現)為核心的Hadoop為使用者提供了系統底層細節透明的分散式基礎架構。HDFS的高容錯性、高伸縮性等優點允許使用者將Hadoop部署在低廉的硬體上,形成分散式系統;MapReduce分散式程式設計模型允許使用者在不瞭解分散式系統底層細節的情況下開發並行應用程式。所以使用者可以利用Hadoop輕鬆地組織計算機資源,從而搭建自己的分散式計算平臺,並且可以充分利用叢集的計算和儲存能力,完成海量資料的處理。

Hadoop的優勢

  • 高可靠性。Hadoop按位儲存和處理資料的能力值得人們信賴。
  • 高擴充套件性。Hadoop是在可用的計算機集簇間分配資料完成計算任務的,這些集簇可以方便地擴充套件到數以千計的節點中。
  • 高效性。Hadoop能夠在節點之間動態地移動資料,以保證各個節點的動態平衡,因此其處理速度非常快。
  • 高容錯性。Hadoop能夠自動儲存資料的多份副本,並且能夠自動將失敗的任務重新分配。

Hadoop的重要元件

HDFSMapReduceHadoop的兩大核心。

元件 說明
HDFS 分散式檔案系統
MapReduce 分散式運算程式開發框架。MapReduce是一種程式設計模型,用於大規模資料集(大於1TB)的並行運算。對映Map、化簡Reduce的概念和它們的主要思想都是從函數語言程式設計語言中借鑑而來的。
Hive 基於大資料技術(檔案系統+運算框架)的SQL資料倉儲工具。它提供了一些用於對Hadoop檔案中的資料集進行資料整理、特殊查詢和分析儲存的工具。
HBase 基於Hadoop的分散式海量資料庫。HBase是一個分散式的、面向列的開源資料庫,該技術來源於Google論文《Bigtable:一個結構化資料的分散式儲存系統》。HBase主要用於需要隨機訪問、實時讀寫的大資料Big Data
ZooKeeper 分散式協調服務基礎元件。ZooKeeper是一個為分散式應用所設計的開源協調服務。它主要為使用者提供同步、配置管理、分組和命名等服務,減輕分散式應用程式所承擔的協調任務。
Mahout 基於mapreduce/spark/flink等分散式運算框架的機器學習演算法庫
Oozie 工作流排程框架
Sqoop 資料匯入匯出工具
Flume 日誌資料採集框架
Pig Pig是一個對大型資料集進行分析、評估的平臺。Pig最突出的優勢是它的結構能夠經受住高度並行化的檢驗,這個特性使得它能夠處理大型的資料集。

HDFS

介紹

HDFS採用了主從Master/Slave結構模型,一個HDFS叢集是由一個NameNode和若干個DataNode組成的。其中NameNode作為主伺服器,管理檔案系統的名稱空間和客戶端對檔案的訪問操作;叢集中的DataNode管理儲存的資料。HDFS允許使用者以檔案的形式儲存資料。從內部來看,檔案被分成若干個資料塊,而且這若干個資料塊存放在一組DataNode上。NameNode執行檔案系統的名稱空間操作,比如開啟、關閉、重新命名檔案或目錄等,它也負責資料塊到具體DataNode的對映。DataNode負責處理檔案系統客戶端的檔案讀寫請求,並在NameNode統一排程下進行資料塊的建立、刪除和複製工作。

NameNode是所有HDFS後設資料的管理者,使用者需要儲存的資料不會經過NameNode,而是直接流向儲存資料的DataNode

HBase

角色 職責
主伺服器 管理整個叢集的所有域,監控每臺伺服器的執行情況。
域伺服器 接受來自伺服器的分配域,處理客戶端的域讀寫請求並回寫對映檔案等。
客戶端 查詢使用者域所在的域伺服器地址資訊。

MapReduce

介紹

MapReduce是一種並行程式設計模式,利用這種模式軟體開發者可以輕鬆地編寫出分散式並行程式。

MapReduce框架是由一個單獨執行在主節點的JobTracker和執行在每個叢集從節點的TaskTracker共同組成的。主節點負責排程構成一個作業的所有任務,這些任務分佈在不同的從節點上。主節點監控它們的執行情況,並且重新執行之前失敗的任務;從節點僅負責由主節點指派的任務。當一個Job被提交時,JobTracker接收到提交作業和其配置資訊之後,就會將配置資訊等分發給從節點,同時排程任務並監控TaskTracker的執行。

HDFS and MapReduce

HDFSMapReduce共同組成了Hadoop分散式系統體系結構的核心。HDFS在叢集上實現了分散式檔案系統,MapReduce在叢集上實現了分散式計算和任務處理。HDFSMapReduce任務處理過程中提供了對檔案操作和儲存等的支援,MapReduceHDFS的基礎上實現了任務的分發、跟蹤、執行等工作,並收集結果,二者相互作用,完成了Hadoop分散式叢集的主要任務。

Hadoop應用

  1. 資料服務基礎平臺
  2. 使用者畫像
  3. 網站點選流日誌資料探勘

Hadoop配置

直接從搭建環境開始吧~O(∩_∩)O哈哈~

免密登入訪問

參見【大資料 zookeeper】——免密登入配置部分。

配置Java環境

參見【Linux安裝常用軟體】——Ctrl+F搜尋JDK關鍵字,按照對應教程配置環境。

同步時間

  • 先下載同步工具:yum install -y ntpdate
  • 同步網路時間:ntpdate time.nist.gov
  • 調整硬體時間:hwclock -w
    • 執行成功後, 檢視系統硬體時間(不出意外的話,現在date和hwclock現實的時間均為internet時間)。

配置Hadoop

好啦,準備工作完成了,我們要開始搭建環境了。O(∩_∩)O哈!

下載Hadoop

配置環境

  • 解壓Hadooptar -zxvf hadoop-2.6.5.tar.gz
  • 移動到optmv hadoop-2.6.5/ /opt/
  • 改名:mv hadoop-2.6.5 hadoop

Hadoop配置

目錄結構說明

資料夾 說明
bin Hadoop的一些操作命令。
etc 配置檔案。
include 語言本地庫。
lib 本地庫。
libexec
sbin 系統管理啟動的命令。
share 文件和相關的jar包。

官方文件,建議一看:Apache Hadoop Document

hadoop-env.sh

./etc/hadoop/中,找到hadoop-env.sh,使用vim hadoop-env.sh開啟,修改export JAVA_HOME={JAVA_HOME}export JAVA_HOME=/opt/jdk1.8.0_161(注意,根據實際的JDK路徑配置哈~)

這裡寫圖片描述

core-site.xml

<configuration></configuration>中增加以下內容:

  • fs.defaultFS指定Hadoop所使用的檔案系統schema(URI)HDFS的老大NameNode的地址。
    • 說明:node0需要在/etc/hosts中配置。
    • 增加一個IP地址別名,後面配置使用
      • vim /ect/hosts
      • 說明:IP地址 別名
      • 192.168.80.8 node0
      • 192.168.80.9 node1
      • 192.168.80.10 node2
      • 192.168.80.11 node3
  • hadoop.tmp.dir指定hadoop執行時產生檔案的儲存目錄。
    • /opt/hadoopData目錄需要自行建立
<configuration>
    <!-- 指定 HADOOP 所使用的檔案系統 schema ( URI ), 
    HDFS 的老大( NameNode )的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://node0:9000</value>
    </property>
    <!-- 指定 hadoop 執行時產生檔案的儲存目錄 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/hadoopData</value>
    </property>
</configuration>

hdfs-site.xml

  • node0配置請看本文章的core-site.xml跳轉中的內容。
<configuration>
    <!-- 指定 HDFS 副本的數量 -->
    <property>
       <name>dfs.replication</name>
       <value>1</value>
    </property>

    <property>
       <name>dfs.secondary.http.address</name>
       <value>node0:50090</value>
    </property>
</configuration>

slaves

說明:這個是用於配置DataNode結點的,在本教程中,我配置了三個DataNode,所以我的檔案內容如下:

  • node1、node2、node3配置請看本文章的core-site.xml跳轉中的內容。
node1
node2
node3

分發到其他結點

使用scp指令分發到其他幾個結點。

  • node1、node2、node3配置請看本文章的core-site.xml跳轉中的內容。
scp -r /opt/hadoop/ root@node1:/opt/
scp -r /opt/hadoop/ root@node2:/opt/
scp -r /opt/hadoop/ root@node3:/opt/

Hadoop使用

啟動

  • 啟動方式./sbin/start-all.sh

這裡寫圖片描述

  • 如果yarn啟動不了,就需要先關閉所有結點./sbin/stop-all.sh,再NameNode上執行./sbin/start-dfs.sh,在其中一個DataNode上執行./sbin/start-yarn.sh

NameNodejps結果:

6163 NameNode
6308 SecondaryNameNode
6510 Jps

DataNodejps結果:

3763 ResourceManager
3859 NodeManager
3381 DataNode
3903 Jps
  • 可以在瀏覽器上訪問:http://node0:50070視覺化展示具體資訊。
    • 注意:node0配置請看本文章的core-site.xml跳轉中的內容。

這裡寫圖片描述

  • 可以使用jps【JDK自帶的一個指令,位於./bin/jps】檢視當前啟動的java程式。

啟動成功的jps輸出資訊如下:

  • NameNode結點JPS資訊
1747 Jps
1292 SecondaryNameNode
1149 NameNode
  • DataNode結點JPS資訊
1376 Jps
1057 DataNode

Hadoop之HDFS

  • 上傳jdk-8u161-linux-x64.tar.gz到根目錄下:
    • hadoop fs -put jdk-8u161-linux-x64.tar.gz /
  • 開啟http://node0:50070/explorer.html#/,在輸入框中輸入/,可以檢視根目錄下的內容

這裡寫圖片描述

  • 也可以去文章前面配置的儲存路徑/opt/hadoopData檢視。
    • yum -y install tree
    • cd /opt/hadoopData
    • tree

DataNode node1裡面tree出來的結果。

[root@node1 hadoopData]# tree
.
├── dfs
│   └── data
│       ├── current
│       │   ├── BP-1656524081-192.168.80.8-1536912218458
│       │   │   ├── current
│       │   │   │   ├── dfsUsed
│       │   │   │   ├── finalized
│       │   │   │   │   └── subdir0
│       │   │   │   │       └── subdir0
│       │   │   │   │           ├── blk_1073741825
│       │   │   │   │           └── blk_1073741825_1001.meta
│       │   │   │   ├── rbw
│       │   │   │   └── VERSION
│       │   │   ├── dncp_block_verification.log.curr
│       │   │   ├── dncp_block_verification.log.prev
│       │   │   └── tmp
│       │   └── VERSION
│       └── in_use.lock
└── nm-local-dir
    ├── filecache
    ├── nmPrivate
    └── usercache

14 directories, 8 files

DataNode node3裡面tree出來的結果。

[root@node3 hadoopData]# tree 
.
├── dfs
│   └── data
│       ├── current
│       │   ├── BP-1656524081-192.168.80.8-1536912218458
│       │   │   ├── current
│       │   │   │   ├── dfsUsed
│       │   │   │   ├── finalized
│       │   │   │   │   └── subdir0
│       │   │   │   │       └── subdir0
│       │   │   │   │           ├── blk_1073741826
│       │   │   │   │           └── blk_1073741826_1002.meta
│       │   │   │   ├── rbw
│       │   │   │   └── VERSION
│       │   │   ├── dncp_block_verification.log.curr
│       │   │   ├── dncp_block_verification.log.prev
│       │   │   └── tmp
│       │   └── VERSION
│       └── in_use.lock
└── nm-local-dir
    ├── filecache
    ├── nmPrivate
    └── usercache

14 directories, 8 files

存放原理

  • node1情況:
[root@node1 subdir0]# ls -lh
total 130M
-rw-r--r-- 1 root root 128M Sep 14 05:23 blk_1073741825
-rw-r--r-- 1 root root 1.1M Sep 14 05:23 blk_1073741825_1001.meta
  • node3情況:
[root@node3 subdir0]# ls -lh
total 54M
-rw-r--r-- 1 root root  53M Sep 14 05:23 blk_1073741826
-rw-r--r-- 1 root root 424K Sep 14 05:23 blk_1073741826_1002.meta
  • 上傳檔案大小
[root@node0 ~]# ls -lh
total 181M
-rw-r--r--  1 root root 181M Sep 15 07:16 jdk-8u161-linux-x64.tar.gz

我們可以看出128M+53M=181M128M+53M=181M,拆分出來的塊的大小相加剛好等於原來的大小。我們也可以驗證一下,將分佈在node1node3的兩個meta塊直接用cat命令合併,再嘗試解壓即可。

  • node1meta放到node0/root/下。
    • scp blk_1073741825 root@node0:/root/
  • node3meta放到node0/root/下。
    • scp blk_1073741826 root@node0:/root/
  • node0中進行合併
    • 注意:塊是連續的,所以要按照編號拼接。
    • cat blk_1073741825 > jdk.tar.gz
    • cat blk_1073741826 >> jdk.tar.gz
    • ls -lh jdk.tar.gz
      • -rw-r--r-- 1 root root 181M Sep 15 07:22 jdk.tar.gz
    • tar -zxvf jdk.tar.gz,解壓成功,O(∩_∩)O哈哈~
  • 在HDFS的儲存中,所有的檔案都是按照塊的形式進行分隔的(塊的大小是可以配置的。)

Hadoop指令

  • 檢視根目錄下的內容
    • hadoop fs -ls 路徑
  • 上傳檔案
    • hadoop fs -put 檔案 路徑
  • 檢視檔案內容
    • hadoop fs -cat 儲存的檔案的路徑及名稱
    • hadoop fs -cat /a.txt
  • 下載檔案
    • hadoop fs -get 儲存的檔案的路徑及名稱 下載到指定路徑
    • hadoop fs -get /jdk-8u161-linux-x64.tar.gz /tmp
  • HDFS中建立資料夾
    • hadoop fs -mkdir -p /hello/world

Hadoop示例

  • 建立資料資料夾
    • hadoop fs -mkdir -p /data/input
  • 建立資料夾
    • hadoop fs -mkdir -p /data/input
  • 上傳檔案
    • hadoop fs -put novel.txt /data/input
  • 執行jar
    • cd /opt/hadoop/share/hadoop/mapreduce/
    • hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /data/input /data/output

執行結果

  • 執行成功將會輸出以下資訊:
18/09/15 08:33:59 INFO client.RMProxy: Connecting to ResourceManager at node1/192.168.80.9:8032
18/09/15 08:34:02 INFO input.FileInputFormat: Total input paths to process : 1
18/09/15 08:34:03 INFO mapreduce.JobSubmitter: number of splits:1
18/09/15 08:34:04 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1537014830845_0001
18/09/15 08:34:05 INFO impl.YarnClientImpl: Submitted application application_1537014830845_0001
18/09/15 08:34:05 INFO mapreduce.Job: The url to track the job: http://node1:8088/proxy/application_1537014830845_0001/
18/09/15 08:34:05 INFO mapreduce.Job: Running job: job_1537014830845_0001
18/09/15 08:34:30 INFO mapreduce.Job: Job job_1537014830845_0001 running in uber mode : false
18/09/15 08:34:30 INFO mapreduce.Job:  map 0% reduce 0%
18/09/15 08:34:50 INFO mapreduce.Job:  map 100% reduce 0%
18/09/15 08:35:04 INFO mapreduce.Job:  map 100% reduce 100%
18/09/15 08:35:05 INFO mapreduce.Job: Job job_1537014830845_0001 completed successfully
18/09/15 08:35:05 INFO mapreduce.Job: Counters: 49
	File System Counters
		FILE: Number of bytes read=5172
		FILE: Number of bytes written=224841
		FILE: Number of read operations=0
		FILE: Number of large read operations=0
		FILE: Number of write operations=0
		HDFS: Number of bytes read=5209
		HDFS: Number of bytes written=5118
		HDFS: Number of read operations=6
		HDFS: Number of large read operations=0
		HDFS: Number of write operations=2
	Job Counters 
		Launched map tasks=1
		Launched reduce tasks=1
		Data-local map tasks=1
		Total time spent by all maps in occupied slots (ms)=17907
		Total time spent by all reduces in occupied slots (ms)=10738
		Total time spent by all map tasks (ms)=17907
		Total time spent by all reduce tasks (ms)=10738
		Total vcore-milliseconds taken by all map tasks=17907
		Total vcore-milliseconds taken by all reduce tasks=10738
		Total megabyte-milliseconds taken by all map tasks=18336768
		Total megabyte-milliseconds taken by all reduce tasks=10995712
	Map-Reduce Framework
		Map input records=6
		Map output records=6
		Map output bytes=5142
		Map output materialized bytes=5172
		Input split bytes=103
		Combine input records=6
		Combine output records=6
		Reduce input groups=6
		Reduce shuffle bytes=5172
		Reduce input records=6
		Reduce output records=6
		Spilled Records=12
		Shuffled Maps =1
		Failed Shuffles=0
		Merged Map outputs=1
		GC time elapsed (ms)=223
		CPU time spent (ms)=2260
		Physical memory (bytes) snapshot=235151360
		Virtual memory (bytes) snapshot=4155752448
		Total committed heap usage (bytes)=136302592
	Shuffle Errors
		BAD_ID=0
		CONNECTION=0
		IO_ERROR=0
		WRONG_LENGTH=0
		WRONG_MAP=0
		WRONG_REDUCE=0
	File Input Format Counters 
		Bytes Read=5106
	File Output Format Counters 
		Bytes Written=5118
  • ResourceManage啟動失敗將會出現以下錯誤:
18/09/15 08:29:09 INFO client.RMProxy: Connecting to ResourceManager at node1/192.168.80.9:8032
18/09/15 08:29:11 INFO ipc.Client: Retrying connect to server: node1/192.168.80.9:8032. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
  • 解決方案:
    • NameNode結點上./sbin/stop-all.sh
    • 然後在NameNode上啟動./sbin/start-dfs.sh
    • 在任意一個DataNode上啟動./sbin/start-yarn.sh

啟動成功的jps輸出資訊如下:

  • NameNode結點JPS資訊
1747 Jps
1292 SecondaryNameNode
1149 NameNode
  • DataNode結點JPS資訊
1376 Jps
1057 DataNode

執行結果檢視

  • 使用命令檢視輸出的內容
    • hadoop fs -ls /data/output/
[root@node0 mapreduce]# hadoop fs -ls /data/output/
Found 2 items
-rw-r--r--   1 root supergroup          0 2018-09-15 12:16 /data/output/_SUCCESS
-rw-r--r--   1 root supergroup       1481 2018-09-15 12:16 /data/output/part-r-00000
  • 檢視文字內容
    • hadoop fs -cat /data/output/part-r-00000
Always	1
Dream	1
Have	1
...省略

附錄

相關文章