在互聯網技術發展到現今階段,大量平常、工做等事務產生的數據都已經信息化,人類產生的數據量相比之前有了爆炸式的增加,之前的傳統的數據處理技術已經沒法勝任,需求催生技術,一套用來處理海量數據的軟件工具應運而生,這就是大數據!java
換個角度說,大數據是:node
一、有海量的數據linux
二、有對海量數據進行挖掘的需求web
三、有對海量數據進行挖掘的軟件工具(hadoop、spark、storm、flink、tez、impala......)算法
電商推薦系統:基於海量的瀏覽行爲、購物行爲數據,進行大量的算法模型的運算,得出各種推薦結論,以供電商網站頁面來爲用戶進行商品推薦express
精準廣告推送系統:基於海量的互聯網用戶的各種數據,統計分析,進行用戶畫像(獲得用戶的各類屬性標籤),而後能夠爲廣告主進行有針對性的精準的廣告投放編程
hadoop中有3個核心組件:windows
分佈式文件系統:HDFS —— 實現將文件分佈式存儲在不少的服務器上centos
分佈式運算編程框架:MAPREDUCE —— 實如今不少機器上分佈式並行運算瀏覽器
分佈式資源調度平臺:YARN —— 幫用戶調度大量的mapreduce程序,併合理分配運算資源
hdfs:分佈式文件系統
hdfs有着文件系統共同的特徵:
一、有目錄結構,頂層目錄是: /
二、系統中存放的就是文件
三、系統能夠提供對文件的:建立、刪除、修改、查看、移動等功能
hdfs跟普通的單機文件系統有區別:
一、單機文件系統中存放的文件,是在一臺機器的操做系統中
二、hdfs的文件系統會橫跨N多的機器
三、單機文件系統中存放的文件,是在一臺機器的磁盤上
四、hdfs文件系統中存放的文件,是落在n多機器的本地單機文件系統中(hdfs是一個基於linux本地文件系統之上的文件系統)
hdfs的工做機制:
一、客戶把一個文件存入hdfs,其實hdfs會把這個文件切塊後,分散存儲在N臺linux機器系統中(負責存儲文件塊的角色:data node)<準確來講:切塊的行爲是由客戶端決定的>
二、一旦文件被切塊存儲,那麼,hdfs中就必須有一個機制,來記錄用戶的每個文件的切塊信息,及每一塊的具體存儲機器(負責記錄塊信息的角色是:name node)
三、爲了保證數據的安全性,hdfs能夠將每個文件塊在集羣中存放多個副本(到底存幾個副本,是由當時存入該文件的客戶端指定的)
綜述:一個hdfs系統,由一臺運行了namenode的服務器,和N臺運行了datanode的服務器組成!
1、首先須要準備N臺linux服務器
學習階段,用虛擬機便可!
先準備4臺虛擬機:1個namenode節點 + 3 個datanode 節點
2、修改各臺機器的主機名和ip地址
主機名:hdp-01 對應的ip地址:192.168.33.61
主機名:hdp-02 對應的ip地址:192.168.33.62
主機名:hdp-03 對應的ip地址:192.168.33.63
主機名:hdp-04 對應的ip地址:192.168.33.64
3、從windows中用CRT軟件進行遠程鏈接
在windows中將各臺linux機器的主機名配置到的windows的本地域名映射文件中:
c:/windows/system32/drivers/etc/hosts
192.168.33.61 hdp-01 192.168.33.62 hdp-02 192.168.33.63 hdp-03 192.168.33.64 hdp-04 |
用crt鏈接上後,修改一下crt的顯示配置(字號,編碼集改成UTF-8):
4、配置linux服務器的基礎軟件環境
l 防火牆
關閉防火牆:service iptables stop
關閉防火牆自啓: chkconfig iptables off
l 安裝jdk:(hadoop體系中的各軟件都是java開發的)
1) 利用alt+p 打開sftp窗口,而後將jdk壓縮包拖入sftp窗口
2) 而後在linux中將jdk壓縮包解壓到/root/apps 下
3) 配置環境變量:JAVA_HOME PATH
vi /etc/profile 在文件的最後,加入:
export JAVA_HOME=/root/apps/jdk1.8.0_60 export PATH=$PATH:$JAVA_HOME/bin |
4) 修改完成後,記得 source /etc/profile使配置生效
5) 檢驗:在任意目錄下輸入命令: java -version 看是否成功執行
6) 將安裝好的jdk目錄用scp命令拷貝到其餘機器
7) 將/etc/profile配置文件也用scp命令拷貝到其餘機器並分別執行source命令
l 集羣內主機的域名映射配置
在hdp-01上,vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.33.61 hdp-01 192.168.33.62 hdp-02 192.168.33.63 hdp-03 192.168.33.64 hdp-04 |
而後,將hosts文件拷貝到集羣中的全部其餘機器上
scp /etc/hosts hdp-02:/etc/
scp /etc/hosts hdp-03:/etc/
scp /etc/hosts hdp-04:/etc/
補充 提示: |
若是在執行scp命令的時候,提示沒有scp命令,則能夠配置一個本地yum源來安裝 一、先在虛擬機中配置cdrom爲一個centos的安裝鏡像iso文件 二、在linux系統中將光驅掛在到文件系統中(某個目錄) 三、mkdir /mnt/cdrom 四、mount -t iso9660 -o loop /dev/cdrom /mnt/cdrom 五、檢驗掛載是否成功: ls /mnt/cdrom 六、三、配置yum的倉庫地址配置文件 七、yum的倉庫地址配置文件目錄: /etc/yum.repos.d 八、先將自帶的倉庫地址配置文件批量改名:
九、而後,拷貝一個出來進行修改
十、修改完配置文件後,再安裝scp命令: 十一、yum install openssh-clients -y |
l 5、安裝hdfs集羣
一、上傳hadoop安裝包到hdp-01
二、修改配置文件
要點提示 |
核心配置參數: 1) 指定hadoop的默認文件系統爲:hdfs 2) 指定hdfs的namenode節點爲哪臺機器 3) 指定namenode軟件存儲元數據的本地目錄 4) 指定datanode軟件存放文件塊的本地目錄 |
hadoop的配置文件在:/root/apps/hadoop安裝目錄/etc/hadoop/
1) 修改hadoop-env.sh
export JAVA_HOME=/root/apps/jdk1.8.0_60
2) 修改core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hdp-01:9000</value> </property> </configuration> |
3) 修改hdfs-site.xml
<configuration> <property> <name>dfs.namenode.name.dir</name> <value>/root/dfs/name</value> </property>
<property> <name>dfs.datanode.data.dir</name> <value>/root/dfs/data</value> </property>
</configuration> |
4) 拷貝整個hadoop安裝目錄到其餘機器
scp -r /root/apps/hadoop-2.8.0 hdp-02:/root/apps/
scp -r /root/apps/hadoop-2.8.0 hdp-03:/root/apps/
scp -r /root/apps/hadoop-2.8.0 hdp-04:/root/apps/
5) 啓動HDFS
所謂的啓動HDFS,就是在對的機器上啓動對的軟件
要點 提示: |
要運行hadoop的命令,須要在linux環境中配置HADOOP_HOME和PATH環境變量 vi /etc/profile
|
首先,初始化namenode的元數據目錄
要在hdp-01上執行hadoop的一個命令來初始化namenode的元數據存儲目錄
hadoop namenode -format
l 建立一個全新的元數據存儲目錄
l 生成記錄元數據的文件fsimage
l 生成集羣的相關標識:如:集羣id——clusterID
而後,啓動namenode進程(在hdp-01上)
hadoop-daemon.sh start namenode
啓動完後,首先用jps查看一下namenode的進程是否存在
而後,在windows中用瀏覽器訪問namenode提供的web端口:50070
http://hdp-01:50070
而後,啓動衆datanode們(在任意地方)
hadoop-daemon.sh start datanode
6) 用自動批量啓動腳原本啓動HDFS
1) 先配置hdp-01到集羣中全部機器(包含本身)的免密登錄
2) 配完免密後,能夠執行一次 ssh 0.0.0.0
3) 修改hadoop安裝目錄中/etc/hadoop/slaves(把須要啓動datanode進程的節點列入)
hdp-01 hdp-02 hdp-03 hdp-04 |
4) 在hdp-01上用腳本:start-dfs.sh 來自動啓動整個集羣
5) 若是要中止,則用腳本:stop-dfs.sh
hdfs的客戶端有多種形式:
一、網頁形式
二、命令行形式
三、客戶端在哪裏運行,沒有約束,只要運行客戶端的機器可以跟hdfs集羣聯網
文件的切塊大小和存儲的副本數量,都是由客戶端決定!
所謂的由客戶端決定,是經過配置參數來定的
hdfs的客戶端會讀如下兩個參數,來決定切塊大小、副本數量:
切塊大小的參數: dfs.blocksize
副本數量的參數: dfs.replication
上面兩個參數應該配置在客戶端機器的hadoop目錄中的hdfs-site.xml中配置
<property> <name>dfs.blocksize</name> <value>64m</value> </property>
<property> <name>dfs.replication</name> <value>2</value> </property>
|
0、查看hdfs中的目錄信息
hadoop fs -ls /hdfs路徑
一、上傳文件到hdfs中
hadoop fs -put /本地文件 /aaa
hadoop fs -copyFromLocal /本地文件 /hdfs路徑 ## copyFromLocal等價於 put
hadoop fs -moveFromLocal /本地文件 /hdfs路徑 ## 跟copyFromLocal的區別是:從本地移動到hdfs中
二、下載文件到客戶端本地磁盤
hadoop fs -get /hdfs中的路徑 /本地磁盤目錄
hadoop fs -copyToLocal /hdfs中的路徑 /本地磁盤路徑 ## 跟get等價
hadoop fs -moveToLocal /hdfs路徑 /本地路徑 ## 從hdfs中移動到本地
三、在hdfs中建立文件夾
hadoop fs -mkdir -p /aaa/xxx
四、移動hdfs中的文件(改名)
hadoop fs -mv /hdfs的路徑 /hdfs的另外一個路徑
五、刪除hdfs中的文件或文件夾
hadoop fs -rm -r /aaa
六、修改文件的權限
hadoop fs -chown user:group /aaa
hadoop fs -chmod 700 /aaa
七、追加內容到已存在的文件
hadoop fs -appendToFile /本地文件 /hdfs中的文件
八、顯示文本文件的內容
hadoop fs -cat /hdfs中的文件
hadoop fs -tail /hdfs中的文件
補充:hdfs命令行客戶端的全部命令列表
Usage: hadoop fs [generic options] [-appendToFile <localsrc> ... <dst>] [-cat [-ignoreCrc] <src> ...] [-checksum <src> ...] [-chgrp [-R] GROUP PATH...] [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] [-chown [-R] [OWNER][:[GROUP]] PATH...] [-copyFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>] [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] <path> ...] [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>] [-createSnapshot <snapshotDir> [<snapshotName>]] [-deleteSnapshot <snapshotDir><snapshotName>] [-df [-h] [<path> ...]] [-du [-s] [-h] [-x] <path> ...] [-expunge] [-find <path> ... <expression> ...] [-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-getfacl [-R] <path>] [-getfattr [-R] {-n name | -d} [-e en] <path>] [-getmerge [-nl] [-skip-empty-file] <src><localdst>] [-help [cmd ...]] [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...]] [-mkdir [-p] <path> ...] [-moveFromLocal <localsrc> ... <dst>] [-moveToLocal <src><localdst>] [-mv <src> ... <dst>] [-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>] [-renameSnapshot <snapshotDir><oldName><newName>] [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...] [-rmdir [--ignore-fail-on-non-empty] <dir> ...] [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec><path>]] [-setfattr {-n name [-v value] | -x name} <path>] [-setrep [-R] [-w] <rep><path> ...] [-stat [format] <path> ...] [-tail [-f] <file>] [-test -[defsz] <path>] [-text [-ignoreCrc] <src> ...] [-touchz <path> ...] [-truncate [-w] <length><path> ...] [-usage [cmd ...]] |
HDFS客戶端編程應用場景:數據採集
在windows開發環境中作一些準備工做:
一、在windows的某個路徑中解壓一份windows版本的hadoop安裝包
二、將解壓出的hadoop目錄配置到windows的環境變量中:HADOOP_HOME
一、將hdfs客戶端開發所需的jar導入工程(jar包可在hadoop安裝包中找到common/hdfs)
二、寫代碼
要點:要對hdfs中的文件進行操做,代碼中首先須要得到一個hdfs的客戶端對象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hdp-01:9000"),conf,"root");
三、利用fs對象的方法進行文件操做
好比:
上傳文件—— fs.copyFromLocalFile(new Path("本地路徑"),new Path("hdfs的路徑"));
下載文件——fs.copyToLocalFile(new Path("hdfs的路徑"),new Path("本地路徑"))
在業務系統的服務器上,業務程序會不斷生成業務日誌(好比網站的頁面訪問日誌)
業務日誌是用log4j生成的,會不斷地切出日誌文件
須要按期(好比每小時)從業務服務器上的日誌目錄中,探測須要採集的日誌文件(access.log不能採),發往HDFS
注意點:業務服務器可能有多臺(hdfs上的文件名不能直接用日誌服務器上的文件名)
當天採集到的日誌要放在hdfs的當天目錄中
採集完成的日誌文件,須要移動到到日誌服務器的一個備份目錄中
按期檢查(一小時檢查一次)備份目錄,將備份時長超出24小時的日誌文件清除
Timer timer = new Timer()
timer.schedual()
一、什麼是元數據?
hdfs的目錄結構及每個文件的塊信息(塊的id,塊的副本數量,塊的存放位置<datanode>)
二、元數據由誰負責管理?
namenode
三、namenode把元數據記錄在哪裏?
namenode的實時的完整的元數據存儲在內存中;
namenode還會在磁盤中(dfs.namenode.name.dir)存儲內存元數據在某個時間點上的鏡像文件;
namenode會把引發元數據變化的客戶端操做記錄在edits日誌文件中;
secondarynamenode會按期從namenode上下載fsimage鏡像和新生成的edits日誌,而後加載fsimage鏡像到內存中,而後順序解析edits文件,對內存中的元數據對象進行修改(整合) 整合完成後,將內存元數據序列化成一個新的fsimage,並將這個fsimage鏡像文件上傳給namenode
|
上述過程叫作:checkpoint操做 提示:secondary namenode每次作checkpoint操做時,都須要從namenode上下載上次的fsimage鏡像文件嗎? 第一次checkpoint須要下載,之後就不用下載了,由於本身的機器上就已經有了。 |
補充:secondary namenode啓動位置的配置
默認值 |
<property> <name>dfs.namenode.secondary.http-address</name> <value>0.0.0.0:50090</value> </property> |
把默認值改爲你想要的機器主機名便可
secondarynamenode保存元數據文件的目錄配置:
默認值 |
<property> <name>dfs.namenode.checkpoint.dir</name> <value>file://${hadoop.tmp.dir}/dfs/namesecondary</value> </property> |
改爲本身想要的路徑便可:/root/dfs/namesecondary
小案例:
統計HDFS的/wordcount/input/a.txt文件中的每一個單詞出現的次數——wordcount
明白了一點:能夠在任何地方運行程序,訪問HDFS上的文件並進行統計運算,而且能夠把統計的結果寫回HDFS的結果文件中;
可是,進一步思考:若是文件又多又大,用上面那個程序有什麼弊端?
慢!由於只有一臺機器在進行運算處理!
如何變得更快?
核心思想:讓咱們的運算程序並行在多臺機器上執行!
mapreduce程序應該是在不少機器上並行啓動,並且先執行map task,當衆多的maptask都處理完本身的數據後,還須要啓動衆多的reduce task,這個過程若是用用戶本身手動調度不太現實,須要一個自動化的調度平臺——hadoop中就爲運行mapreduce之類的分佈式運算程序開發了一個自動化調度平臺——YARN
yarn集羣中有兩個角色:
主節點:Resource Manager 1臺
從節點:Node Manager N臺
Resource Manager通常安裝在一臺專門的機器上
Node Manager應該與HDFS中的data node重疊在一塊兒
修改配置文件:
yarn-site.xml
<property> <name>yarn.resourcemanager.hostname</name> <value>hdp-04</value> </property>
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> |
而後複製到每一臺機器上
而後在hdp-04上,修改hadoop的slaves文件,列入要啓動nodemanager的機器
而後將hdp-04到全部機器的免密登錄配置好
而後,就能夠用腳本啓動yarn集羣:
sbin/start-yarn.sh
中止:
sbin/stop-yarn.sh
啓動完成後,能夠在windows上用瀏覽器訪問resourcemanager的web端口:
看resource mananger是否定出了全部的node manager節點
首先,爲你的mapreduce程序開發一個提交job到yarn的客戶端類(模板代碼):
l 描述你的mapreduce程序運行時所須要的一些信息(好比用哪一個mapper、reducer、map和reduce輸出的kv類型、jar包所在路徑、reduce task的數量、輸入輸出數據的路徑)
l 將信息和整個工程的jar包一塊兒交給yarn
而後,將整個工程(yarn客戶端類+ mapreduce全部jar和自定義類)打成jar包
而後,將jar包上傳到hadoop集羣中的任意一臺機器上
最後,運行jar包中的(YARN客戶端類)
[root@hdp-04 ~]# hadoop jar wc.jar cn.edu360.hadoop.mr.wc.JobSubmitter