大資料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的優點
- 高容錯性
- 適合批處理
- 適合大資料處理
- 流式檔案訪問
- 可構建在廉價機器上
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 |
namenode,resourcemanager |
hadoop-slave1 | 10.0.200.201 |
datanode,nodemanager |
hadoop-slave2 | 10.0.200.202 |
datanode,nodemanager |
1.安裝openssh
在每臺虛擬機器上安裝openssh,最小化虛擬機器預設沒有安裝,自行配置yum安裝openssh。3臺虛擬機器之間需要相互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