1. 程式人生 > >大資料hadoop分散式系統

大資料hadoop分散式系統

一、背景介紹

     進入2012年,大資料(big data)一詞越來越多地被提及,人們用它來描述和定義資訊爆炸時代產生的海量資料,並命名與之相關的技術發展與創新。它已經上過《紐約時報》《華爾街日報》的專欄封面,進入美國白宮官網的新聞,現身在國內一些網際網路主題的講座沙龍中,甚至被嗅覺靈敏的國金證券、國泰君安、銀河證券等寫進了投資推薦報告。
    資料正在迅速膨脹並變大,它決定著企業的未來發展,雖然很多企業可能並沒有意識到資料爆炸性增長帶來問題的隱患,但是隨著時間的推移,人們將越來越多的意識到資料對企業的重要性。
    正如《紐約時報》2012年2月的一篇專欄中所稱,“大資料”時代已經降臨,在商業、經濟及其他領域中,決策將日益基於資料和分析而作出,而並非基於經驗和直覺。
哈佛大學社會學教授加里·金說:“這是一場革命,龐大的資料資源使得各個領域開始了量化程序,無論學術界、商界還是政府,所有領域都將開始這種程序。

    現在的社會是一個高速發展的社會,科技發達,資訊流通,人們之間的交流越來越密切,生活也越來越方便,大資料就是這個高科技時代的產物。隨著雲時代的來臨,大資料(Big data)也吸引了越來越多的關注。大資料(Big data)通常用來形容一個公司創造的大量非結構化和半結構化資料,這些資料在下載到關係型資料庫用於分析時會花費過多時間和金錢。大資料分析常和雲端計算聯絡到一起,因為實時的大型資料集分析需要像MapReduce一樣的框架來向數十、數百或甚至數千的電腦分配工作。在現今的社會,大資料的應用越來越彰顯他的優勢,它佔領的領域也越來越大,電子商務、O2O、物流配送等,各種利用大資料進行發展的領域正在協助企業不斷地發展新業務,創新運營模式。有了大資料這個概念,對於消費者行為的判斷,產品銷售量的預測,精確的營銷範圍以及存貨的補給已經得到全面的改善與優化。“大資料”在網際網路行業指的是這樣一種現象:網際網路公司在日常運營中生成、累積的使用者網路行為資料。這些資料的規模是如此龐大,以至於不能用G或T來衡量。
    大資料到底有多大?一組名為“網際網路上一天”的資料告訴我們,一天之中,網際網路產生的全部內容可以刻滿1.68億張DVD;發出的郵件有2940億封之多(相當於美國兩年的紙質信件數量);發出的社群帖子達200萬個(相當於《時代》雜誌770年的文字量);賣出的手機為37.8萬臺,高於全球每天出生的嬰兒數量37.1萬……
截止到2012年,資料量已經從TB(1024GB=1TB)級別躍升到PB(1024TB=1PB)、EB(1024PB=1EB)乃至ZB(1024EB=1ZB)級別。國際資料公司(IDC)的研究結果表明,2008年全球產生的資料量為0.49ZB,2009年的資料量為0.8ZB,2010年增長為1.2ZB,2011年的數量更是高達1.82ZB,相當於全球每人產生200GB以上的資料。而到2012年為止,人類生產的所有印刷材料的資料量是200PB,全人類歷史上說過的所有話的資料量大約是5EB。IBM的研究稱,整個人類文明所獲得的全部資料中,有90%是過去兩年內產生的。而到了2020年,全世界所產生的資料規模將達到今天的44倍。每一天,全世界會上傳超過5億張圖片,每分鐘就有20小時時長的視訊被分享。然而,即使是人們每天創造的全部資訊——包括語音通話、電子郵件和資訊在內的各種通訊,以及上傳的全部圖片、視訊與音樂,其資訊量也無法匹及每一天所創造出的關於人們自身的數字資訊量。
   這樣的趨勢會持續下去。我們現在還處於所謂“物聯網”的最初級階段,而隨著技術成熟,我們的裝置、交通工具和迅速發展的“可穿戴”科技將能互相連線與溝通。科技的進步已經使創造、捕捉和管理資訊的成本降至2005年的六分之一,而從2005年起,用在硬體、軟體、人才及服務之上的商業投資也增長了整整50%,達到了4000億美元。

二、Hadoop是什麼?

Hadoop是一個開發和執行處理大規模資料的軟體平臺,是Appach的一個用java語言實現開源軟體框架,實現在大量計算機組成的叢集中對海量資料進行分散式計算.

Hadoop框架中最核心設計就是:HDFS和MapReduce.HDFS提供了海量資料的儲存,MapReduce提供了對資料的計算.

HDFS:Hadoop Distributed File System,Hadoop的分散式檔案系統.大檔案被分成預設64M一塊的資料塊分佈儲存在叢集機器中.

MapReduce:Hadoop為每一個input split建立一個task呼叫Map計算,在此task中依次處理此split中的一個個記錄(record),map會將結果以key--value的形式輸出,hadoop負責按key值將map的輸出整理後作為Reduce的輸入,Reduce Task的輸出為整個job的輸出,儲存在HDFS上.

Hadoop的叢集主要由 NameNode,DataNode,Secondary NameNode,JobTracker,TaskTracker組成.

NameNode中記錄了檔案是如何被拆分成block以及這些block都儲存到了那些DateNode節點.

NameNode同時儲存了檔案系統執行的狀態資訊. 

DataNode中儲存的是被拆分的blocks.

Secondary NameNode幫助NameNode收集檔案系統執行的狀態資訊.

JobTracker當有任務提交到Hadoop叢集的時候負責Job的執行,負責排程多個TaskTracker.

TaskTracker負責某一個map或者reduce任務.

1.hdfs分散式檔案系統

Hadoop分散式檔案系統(HDFS)被設計成適合執行在通用硬體(commodity hardware)上的分散式檔案系統。它和現有的分散式檔案系統有很多共同點。但同時,它和其他的分散式檔案系統的區別也是很明顯的。HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的資料訪問,非常適合大規模資料集上的應用。

hdfs的優點

  • 高容錯性 
 資料自動儲存多個副本  副本丟失後,自動恢復 
  • 適合批處理 
移動計算而非資料   資料位置暴露給計算框架 
  •  適合大資料處理 
 GB、TB、甚至PB級資料   百萬規模以上的檔案數量   10K+節點規模
  • 流式檔案訪問 
 一次性寫入,多次讀取   保證資料一致性 
  •  可構建在廉價機器上 
 通過多副本提高可靠性   提供了容錯和恢復機制

2.mapreduce大規模資料集的並行運算

MapReduce是一種程式設計模型,用於大規模資料集(大於1TB)的並行運算。概念"Map(對映)"和"Reduce(歸約)",是它們的主要思想,都是從函數語言程式設計語言裡借來的,還有從向量程式語言裡借來的特性。它極大地方便了程式設計人員在不會分散式並行程式設計的情況下,將自己的程式執行在分散式系統上。 當前的軟體實現是指定一個Map(對映)函式,用來把一組鍵值對對映成一組新的鍵值對,指定併發的Reduce(歸約)函式,用來保證所有對映的鍵值對中的每一個共享相同的鍵組。

三、安裝環境

實驗需要3臺虛擬機器,一主兩從式,一臺主機master當協調節點處理多個slave節點,使用者能訪問master節點來管理整個hadoop叢集

硬體:3臺虛擬機器

記憶體:至少512MB

硬碟:至少20G

作業系統:rhel6.4 64 最小化安裝

主機名 IP 描述
hadoop-master 10.0.200.200

namenoderesourcemanager

hadoop-slave1 10.0.200.201

datanodenodemanager

hadoop-slave2 10.0.200.202

datanodenodemanager

1.安裝openssh

在每臺虛擬機器上安裝openssh,最小化虛擬機器預設沒有安裝,自行配置yum安裝openssh3臺虛擬機器之間需要相互ssh登入

[[email protected] ~]#yum install openssh* -y

2. 配置主機名和IP

為了方便管理,規範性命名,使用連續網段的IP的靜態IP

[[email protected] ~]#vi /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=hadoop-master


[[email protected] ~]#vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
NAME="System eth0"
HWADDR=B8:97:5A:00:4E:54
IPADDR=10.0.200.200
NETMASK=255.255.0.0
GATEWAY=10.0.2.253
DNS1=114.114.114.114

配置/etc/hosts,把/etc/hosts的IP資訊分發到所有主機上

[[email protected] ~]# vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.0.200.200      hadoop-master
10.0.200.201      hadoop-slave1
10.0.200.202      hadoop-slave2

3.安裝JDK

安裝JDK參考百度,本實驗使用 jdk1.8.0_31版本,由於hadoop使用java語言編寫,所有執行hadoop的機器都要安裝jdk

安裝JDK如下效果

[[email protected] ~]# java -version
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)

4.ssh無密登入

在所有機器上建立hadoop使用者,統一密碼hadoop,在master上建立hadoop使用者的公鑰,改名authorized_keys分發到所有機器上,授予600許可權

[[email protected] ~]#useradd hadoop
[[email protected] ~]#passwd hadoop
[[email protected] ~]#su - hadoop
[[email protected] ~]$ssh-keygen -t rsa 
[[email protected] ~]$ cd .ssh
[[email protected] .ssh]$ mv id_rsa.pub authorized_key
[[email protected] .shh]$ chmod 600 authorized_key
[[email protected] .ssh]$ scp authorized_keys hadoop-slave1:~/.ssh/
[[email protected] .ssh]$ scp authorized_keys hadoop-slave2:~/.ssh/



可以看到在master上可以無密登入到slave1上,在後面數百臺機器上執行hadoop叢集就會機

5.hadoop安裝和配置

在主節點上操作,解壓hadoop-2.6.0.tar.gz到hadoop使用者家目錄,編輯hadoop的配置檔案,用hadoop使用者操作
hadoop官網下載 http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.6.0/
[[email protected] ~]# su - hadoop
[[email protected] ~]$ tar zxvf hadoop-2.6.0.tar.gz
[[email protected] ~]$ cd hadoop-2.6.0/etc/hadoop/

修改hadoop-env.sh和yarn-env.sh檔案的JAVA_HOME來指定JDK的路徑

[[email protected] ~]$ vi hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_31
[[email protected] ~]$ vi yarn-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_31

編輯從節點列表檔案slaves

[[email protected] etc]$vi slaves
hadoop-slvaes1
hadoop-slaves2
編輯core-site.xml,指定主節點的地址和埠
[[email protected] etc]$ vi core-site.xml
<configuration>

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://master:9000</value>
 </property>

</configuration>

複製mapred-site.xml.template為mapred-site.xml,指定mapreduce工作方式
[[email protected] etc]$vi mapred-site.xml
<configuration>
<property>
   <name>mapreduce.framework.name</name>
   <value>yarn</value>
 </property>
</configuration>

編輯yarn-site.xml,指定yran的主節點和埠

[[email protected] etc]$vi yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->

<property>
   <name>yarn.nodemanager.aux-services</name>
   <value>mapreduce_shuffle</value>
  </property>
 
  <property>
   <name>yarn.resourcemanager.hostname</name>
   <value>master</value>
  </property>

</configuration>


將hadoop-2.6.0資料夾分發到其他2臺虛擬機器上
[[email protected] ~]$scp -r hadoop-2.6.0 hadoop-slaves1:~
[[email protected] ~]$scp -r hadoop-2.6.0 hadoop-slaves2:~

六、執行測試

格式化分散式檔案系統
[[email protected] ~]$ hadoop-2.6.0/bin/hadoop namenode -format
[[email protected] ~]$ hadoop-2.6.0/sbin/start-all.sh


開啟瀏覽器http://10.0.200.200:8088
如果成功應該看到如下效果


開啟瀏覽器http://10.0.200.200:50070
如果成功可以看到如下效果


執行mapreduce測試

[[email protected] ~]$ hadoop jar hadoop-2.6.0/share/hadoop/mapreduce/hadoop- mapreduce-examples-2.6.0.jar pi 1 1000000000
</pre><pre name="code" class="plain">Number of Maps  = 1
Samples per Map = 1000000000
16/08/20 22:59:09 WARN util.NativeCodeLoader: Unable to load native-hadoop librar                                                                                       y for your platform... using builtin-java classes where applicable
Wrote input for Map #0
Starting Job
16/08/20 22:59:13 INFO client.RMProxy: Connecting to ResourceManager at hadoop-ma                                                                                       ster/192.168.100.50:8032
16/08/20 22:59:15 INFO input.FileInputFormat: Total input paths to process : 1
16/08/20 22:59:16 INFO mapreduce.JobSubmitter: number of splits:1
16/08/20 22:59:17 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_147                                                                                       1704622640_0001
16/08/20 22:59:19 INFO impl.YarnClientImpl: Submitted application application_147                                                                                       1704622640_0001
16/08/20 22:59:20 INFO mapreduce.Job: The url to track the job: http://hadoop-mas                                                                                       ter:8088/proxy/application_1471704622640_0001/
16/08/20 22:59:20 INFO mapreduce.Job: Running job: job_1471704622640_0001
16/08/20 22:59:42 INFO mapreduce.Job: Job job_1471704622640_0001 running in uber                                                                                        mode : false
16/08/20 22:59:42 INFO mapreduce.Job:  map 0% reduce 0%
16/08/20 23:00:07 INFO mapreduce.Job:  map 67% reduce 0%
16/08/20 23:00:46 INFO mapreduce.Job:  map 100% reduce 0%
16/08/20 23:01:20 INFO mapreduce.Job:  map 100% reduce 100%
16/08/20 23:01:24 INFO mapreduce.Job: Job job_1471704622640_0001 completed successfully
16/08/20 23:01:24 INFO mapreduce.Job: Counters: 49
        File System Counters
                FILE: Number of bytes read=28
                FILE: Number of bytes written=211893
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=270
                HDFS: Number of bytes written=215
                HDFS: Number of read operations=7
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=3
        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)=58521
                Total time spent by all reduces in occupied slots (ms)=31620
                Total time spent by all map tasks (ms)=58521
                Total time spent by all reduce tasks (ms)=31620
                Total vcore-seconds taken by all map tasks=58521
                Total vcore-seconds taken by all reduce tasks=31620
                Total megabyte-seconds taken by all map tasks=59925504
                Total megabyte-seconds taken by all reduce tasks=32378880
        Map-Reduce Framework
                Map input records=1
                Map output records=2
                Map output bytes=18
                Map output materialized bytes=28
                Input split bytes=152
                Combine input records=0
                Combine output records=0
                Reduce input groups=2
                Reduce shuffle bytes=28
                Reduce input records=2
                Reduce output records=0
                Spilled Records=4
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=519
                CPU time spent (ms)=50240
                Physical memory (bytes) snapshot=263278592
                Virtual memory (bytes) snapshot=4123402240
                Total committed heap usage (bytes)=132087808
        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=118
        File Output Format Counters
                Bytes Written=97
Job Finished in 131.664 seconds
Estimated value of Pi is 3.14159272000000000000