大資料簡介,概念部分
概念部分,建議之前沒有任何大資料相關知識的朋友閱讀
大資料概論
什麼是大資料
大資料(Big Data)是指無法在一定時間範圍內用常規軟體工具進行捕捉、管理和處理的資料集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的資訊資產
粗略解讀以下
- 常規軟體工具:例如 JavaEE、Mysql(500-1000w資料)即使構建 Mysql 叢集,叢集中節點的數量也不是無限增加的。
- 海量、高增長率:資料本身基數大,每天新加入的資料也多
- 多樣化:除了文字資料外,還有圖片、視訊等資料
主要解決海量資料的儲存和海量資料的分析計算問題
大資料的特點
- 大量:根據 IDC “數字宇宙” 報告 預計到2020年,全球資料使用量將達到35.2ZB
- 高速:在海量的資料面前,處理資料的效率就是企業的生命
- 多樣
- 結構化資料:資料庫、文字為主
- 非結構化資料:網路日誌、音訊、視訊、圖片、地理位置資訊
- 低價值密度:價值密度的高低與資料總量的大小成反比,快速對有價值資料“提純”
大資料應用場景
- 物流倉儲:大資料分析系統助力商家精細化運營、提升銷量、節約成本
- 零售:分析使用者消費習慣,為使用者購買商品提供方便,從而提升商品銷量
- 國外案例:紙尿褲+啤酒,分析過往的商超訂單發現紙尿褲+啤酒同時出現的概率很高,因此將這兩樣物品放在一起,刺激更多的人消費
- 旅遊:深度結合大資料能力與旅遊行業需求,共建旅遊產業智慧管理、智慧服務和智慧營銷的未來
- 商品廣告推薦:給使用者推薦可能喜歡的商品(千人千面)
- 保險、金融、房地產:資料探勘、風險預測
大資料發展前景
十八大:實施國家大資料發展戰略
十九大:推動網際網路、大資料、人工智慧和實體經濟深度融合
Hadoop
簡介
Hadoop 是 Apache 基金會開發的分散式系統基礎架構,主要解決海量資料的儲存和分析計算問題。與大資料所研究的方向一樣。廣義上來說,Hadoop通常指的是 Hadoop 的生態圈。我理解就和 Javaer 常說的 Spring Cloud 一樣,並不特指一個技術,而是一些攜手解決一個複雜問題的集合
創始人 Doug Cutting ,借鑑谷歌三篇論文
GFS ---> HDFS 解決了資料儲存的問題
Map-Reduce ---> MR 解決了資料分析計算的問題
BigTable ---> HBase NoSQL資料庫
三大發行版本
Apache
最原始,最基礎版本,適合入門學習
Cloudera
CDH版本、2008年成立,2009年Doug Cutting 加盟。 主要在大型網際網路企業中使用,免費使用,付費維護
Hortonworks
2011年成立,文件較好,市場份額小
優勢
- 高可靠性:底層維護多個資料副本(default 3)
- 高擴充套件性:在叢集間分配任務資料,可方便的擴充套件數以千計的節點
- 高效性:在MapReduce的思想下,Hadoop是並行工作的
- 高容錯性:能夠自動將失敗的任務重新分配
組成
2.x 時代的 Hadoop 將資料的計算分析和資源排程進行解耦,獨立出來 Yarn 專門負責 CPU、記憶體、硬碟、網路等資源的排程
HDFS 架構概述
- NameNode(nn) 儲存檔案的後設資料,如檔名,目錄結構,檔案屬性(生成時間,副本數,檔案許可權)以及每個檔案的塊列表和塊所在的 DataNode 等
- DataNode(dn) 在本地檔案系統儲存檔案塊資料,以及塊資料的校驗和
- Secondary NameNode(2nn) 監控HDFS狀態的輔助後臺程式,每隔一段時間獲取HDFS後設資料的快照
YARN 架構概述
MapReduce 架構概述
MapReduce 將計算過程分為兩個階段:Map 和 Reduce
- Map 階段並行處理資料
- Reduce 階段對 Map 結果進行彙總
大資料技術生態體系
安裝
建議在新的虛擬機器完成,方便後續克隆、搭建叢集
安裝 hadoop 之前建議設定 linux IP 為靜態 IP、必須安裝 Java 以及配置環境變數、建議關閉防火牆(自己測試的時候)
虛擬機器網路配置
我自己的網路配置 vim /etc/sysconfig/network-scripts/ifcfg-ens33
, 網路採用 NAT 方式。一般 NAT模式對應的虛擬網路卡是 vmnet8,
主機中 vmnet8 對應的虛擬網路卡 ipv4 地址需要設定靜態 IP, 並且該 IP 與虛擬機器網路編輯器中 vmnet8 的 子網IP 、 以及下面配置中 IPADDR,GATEWAY,DNS1 前三段要一致。且第四段不能一樣。如圖所示
- 主機虛擬網路卡配置
- 虛擬機器網路編輯器
- 虛擬機器網路配置檔案
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="5f66ee29-f43f-4761-abec-bd0656e25e09"
DEVICE="ens33"
ONBOOT="yes"
IPV6_PRIVACY="no"
IPADDR="192.168.100.104"
GATEWAY="192.168.100.2"
DNS1="192.168.100.2"
我安裝的版本是 2.10.1
下載上面的壓縮包在 linux 伺服器,解壓後放在 /opt/module 目錄下
配置環境變數
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
重新整理 profile 檔案
source /etc/profile
測試安裝結果
# hadoop
Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]
CLASSNAME run the class named CLASSNAME
or
where COMMAND is one of:
fs run a generic filesystem user client
version print the version
jar <jar> run a jar file
note: please use "yarn jar" to launch
YARN applications, not this command.
checknative [-a|-h] check native hadoop and compression libraries availability
distcp <srcurl> <desturl> copy file or directories recursively
archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
classpath prints the class path needed to get the
Hadoop jar and the required libraries
credential interact with credential providers
daemonlog get/set the log level for each daemon
trace view and modify Hadoop tracing settings
Most commands print help when invoked w/o parameters.
執行模式
-
本地模式,單節點 Java 程式,一般用於除錯
-
偽分散式模式,適合計算機效能不是非常強勁的朋友使用(16GB記憶體以下)
-
分散式
本地模式
如果你的 Hadoop 包是從官方下載的正式包,預設情況下。Hadoop 配置的都是本地執行模式
官方 Grep 案例
http://hadoop.apache.org/docs/r2.10.1/hadoop-project-dist/hadoop-common/SingleCluster.html
$ mkdir input
$ cp etc/hadoop/*.xml input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar grep input output 'dfs[a-z.]+'
$ cat output/*
出現下面的內容,則本地模式執行成功
1 dfsadmin
正如我們看到的那樣
官方 WordCount 案例
-
建立輸入目錄(源目錄) wcinput , 新建文字檔案 wc.txt
# mkdir wcinput # cd wcinput/ # touch wc.input # vim wc.input lvbanqihao ake libai libai hanxin wuya hanxin zhangsan direnjie guanyu guanyu zhangfei chengjisihan jing
-
執行 examples 中的 wordcount 功能
# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount wcinput/ wcoutput
-
檢視結果
# cat wcoutput/* ake 1 chengjisihan 1 direnjie 1 guanyu 2 hanxin 2 jing 1 libai 2 lvbanqihao 1 wuya 1 zhangfei 1 zhangsan 1
偽分散式模式
修改 ${HADOOP_HOME}/etc/hadoop 下的配置檔案。含義見註釋,
HDFS的配置和操作
配置
core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://linux101:9000</value>
</property>
<!-- 指定Hadoop執行時產生檔案的儲存目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop/data/tmp</value>
</property>
hdfs-site.xml
<!-- 指定HDFS副本的數量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
hadoop-env.sh
修改 JAVA_HOME 路徑為 JDK 路徑
- 通過
echo $JAVA_HOME
命令顯示已配置的 JAVA_HOME 路徑。複製 - vim 開啟 hadoop-env.sh 修改
啟動叢集
- 格式化 NameNode
僅在第一次啟動需要(格式化NameNode,會產生新的叢集id,導致NameNode和DataNode的叢集id不一致,叢集找不到已往資料。所以,格式NameNode時,一定要先刪除data資料和log日誌,然後再格式化NameNode)
bin/hdfs namenode -format
- 啟動 NameNode
sbin/hadoop-daemon.sh start namenode
- 啟動 DataNode
sbin/hadoop-daemon.sh start datanode
檢視叢集
- 首先通過 JDK 的 jps 命令檢視 NameNode 和 DataNode 程式是否啟動
- 接著訪問該伺服器的 50070 埠(確保防火牆已經關閉,並且主機和虛擬機器可以互相訪問)
- 檢視日誌檔案 ${HADOOP_HOME}/logs
操作叢集
在HDFS檔案系統上建立一個input資料夾
bin/hdfs dfs -mkdir -p /user/keats/input
將測試檔案內容上傳到檔案系統上
bin/hdfs dfs -put wcinput/wc.input /user/keats/input/
檢視上傳的檔案是否正確
bin/hdfs dfs -ls /user/keats/input/
bin/hdfs dfs -cat /user/keats/ input/wc.input
執行 MapReduce 程式
bin/hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/keats/input/ /user/keats/output
檢視輸出結果
bin/hdfs dfs -cat /user/keats/output/*
將測試檔案內容下載到本地
hdfs dfs -get /user/keats/output/part-r-00000 ./wcoutput/
刪除輸出結果
hdfs dfs -rm -r /user/keats/output
YARN的操作和配置
配置
配置 JAVA_HOME
${HADOOP_HOME}/etc/hadoop/
- yarn-env.sh
- mapred-env.sh
配置 yarn-site.xml
<!-- Reducer獲取資料的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>linux101</value>
</property>
配置: (對mapred-site.xml.template重新命名為) mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
<!-- 指定MR執行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
啟動叢集
-
啟動前必須保證NameNode和DataNode已經啟動
-
啟動ResourceManager
sbin/yarn-daemon.sh start resourcemanager
-
啟動NodeManager
sbin/yarn-daemon.sh start nodemanager
配置歷史伺服器
為了檢視程式的歷史執行情況,需要配置一下歷史伺服器。具體配置步驟如下
- 配置 mapred-site.xml
<!-- 歷史伺服器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>linux101:10020</value>
</property>
<!-- 歷史伺服器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>linux101:19888</value>
</property>
- 啟動歷史伺服器
sbin/mr-jobhistory-daemon.sh start historyserver
-
jps 檢視歷史伺服器是否啟動
-
檢視JobHistory http://linux101:19888/jobhistory
配置日誌的聚集
日誌聚集概念:應用執行完成以後,將程式執行日誌資訊上傳到HDFS系統上。
日誌聚集功能好處:可以方便的檢視到程式執行詳情,方便開發除錯。
注意:開啟日誌聚集功能,需要重新啟動NodeManager 、ResourceManager和HistoryManager
配置 yarn-site.xml
<!-- 日誌聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日誌保留時間設定7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
重啟 NodeManager 、ResourceManager和HistoryManager
沒有 restart 命令,只能先關後開 或者自己寫個指令碼
關閉
sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemon.sh stop nodemanager
sbin/mr-jobhistory-daemon.sh stop historyserver
關閉完成後,執行 jps 進行驗證
開啟
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
sbin/mr-jobhistory-daemon.sh start historyserver
測試
刪除HDFS上已經存在的輸出檔案
bin/hdfs dfs -rm -R /user/keats/output
執行 wordcount
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /user/keats/input /user/keats/output
檢視日誌 http://linux101:19888/jobhistory
配置檔案說明
Hadoop配置檔案分兩類:預設配置檔案和自定義配置檔案,只有使用者想修改某一預設配置值時,才需要修改自定義配置檔案,更改相應屬性值
預設配置檔案
要獲取的預設檔案 | 檔案存放在Hadoop的jar包中的位置 |
---|---|
[core-default.xml] | hadoop-common-2.7.2.jar/ core-default.xml |
[hdfs-default.xml] | hadoop-hdfs-2.7.2.jar/ hdfs-default.xml |
[yarn-default.xml] | hadoop-yarn-common-2.7.2.jar/ yarn-default.xml |
[mapred-default.xml] | hadoop-mapreduce-client-core-2.7.2.jar/ mapred-default.xml |
自定義配置檔案
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四個配置檔案存放在$HADOOP_HOME/etc/hadoop這個路徑上,使用者可以根據專案需求重新進行修改配置
**完全分散式
克隆虛擬機器
一般都通過克隆虛擬機器的方式來模擬多臺物理機,去模擬完全分散式。(錢多任性的土豪除外)
-
首先確保被克隆虛擬機器以及配置靜態IP、安裝 JDK、關閉防火牆、配置好了 hosts 檔案
-
需要克隆 3 臺虛擬機器
-
ip 對應著 102、103、104
-
更改主機名, centos7 使用這個命令:
hostnamectl set-hostname linux103
-
另外 vmware15 + centos7 在修改 IP 並重啟後, mac 地址會自動變化,這個不用手動修改(視訊中 centos6 老師是手動改的)
全部搞定後,主機通過 moba 是可以通過虛擬機器主機名連線任何一個虛擬機器的(主機的 hosts 檔案也需要配置)
安裝 JDK(scp 命令學習)
scp(secure copy)安全拷貝
這塊其實按照我剛才的克隆操作,jdk 已經安裝配置好。但是視訊中老師是克隆的空虛擬機器。我想大概是主要為了教大家 scp (secure copy) 命令
scp -r [username@hostname1:]/x/xxx [username@hostname2:]/x/xxx
表示安全的從 hostname1 遞迴拷貝檔案到 hostname2 伺服器。
其中 [username@hostname1:] 表示可以省略,省略的時候表示當前伺服器本地的資料夾/檔案。username 表示遠端主機的使用者名稱,hostname 表示遠端主機的主機名
rsync 遠端同步工具
與 scp 不同的地方有兩處
一是該工具僅同步差異的檔案。相同的檔案不做操作
二是該工具只能操作本機和另外一臺機器之間的同步,不能操作兩個其他伺服器
注意:如果本機檔案路徑對應的是一個檔案,而外部機器對應的是一個不存在的資料夾。則該檔案內容會被拷貝成資料夾名稱的檔案
rsync -rvl /x/xxx [username@hostname2:]/x/xxx
選項 | 功能 |
---|---|
-r | 遞迴 |
-v | 顯示覆制過程 |
-l | 拷貝符號連線 |
xsync叢集分發指令碼
學會了 rsync 命令之後,就可以進行叢集中兩個伺服器之間的檔案同步了,但是對於正式環境中動輒幾十成百上千臺伺服器來說,手敲命令同步檔案肯定不現實。因此需要寫一個分發命令的指令碼
該指令碼會讀取輸入指令碼後的第一個引數(要分發的檔案所在目錄)
在當前使用者目錄下,如果是 root 則在 root 目錄下建立 bin 資料夾,然後建立 xsync 檔案,內容如下
#!/bin/bash
#1 獲取輸入引數個數,如果沒有引數,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 獲取檔名稱
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 獲取上級目錄到絕對路徑
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 獲取當前使用者名稱稱
user=`whoami`
#5 迴圈
for((host=103; host<105; host++)); do
echo ------------------- linux$host --------------
rsync -rvl $pdir/$fname $user@linux$host:$pdir
done
修改指令碼具有可執行許可權 chmod +x xsync
叢集配置
叢集部署規劃
- NameNode 和 SecondaryNameNode 佔用的記憶體是相當的。比較耗記憶體。因此需要分開
- ResourceManager 也比較耗記憶體
linux102 | linux103 | linux104 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
配置叢集
核心配置檔案 core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://linux102:9000</value>
</property>
<!-- 指定Hadoop執行時產生檔案的儲存目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop/data/tmp</value>
</property>
HDFS配置檔案
配置hadoop-env.sh
vi hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8
配置hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop輔助名稱節點主機配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>linux104:50090</value>
</property>
YARN配置檔案
配置yarn-env.sh
vi yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8
配置yarn-site.xml
<!-- Reducer獲取資料的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>linux103</value>
</property>
MapReduce配置檔案
配置mapred-env.sh
vi mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8
配置mapred-site.xml
在該檔案中增加如下配置
<!-- 指定MR執行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
在叢集上分發配置好的Hadoop配置檔案
xsync /opt/module/hadoop/
檢視檔案分發情況
cat /opt/module/hadoop/etc/hadoop/core-site.xml
叢集單點啟動
如果叢集是第一次啟動,需要格式化NameNode . 如果格式化遇到問題,需要重新排查問題後,重新格式化
因為我的虛擬機器在複製之前,做過偽分散式的測試。殘留了 data logs 目錄,需要刪除三個虛擬機器上的 data/ logs/ 目錄,如果你是按照我的步驟走的,也需要統統刪除後,再執行格式化操作
hadoop namenode -format
之後啟動三個節點的 102 節點的 namenode 和 三個節點的 datanode, 開啟 linux102:50070 檢視是否啟動成功
配置ssh登入
生成公鑰和私鑰,進入當前使用者根目錄下的 .ssh 目錄,我使用的 root 使用者
ssh-keygen -t rsa
將公鑰拷貝到要免密登入的目標機器上
ssh-copy-id linux102
ssh-copy-id linux103
ssh-copy-id linux104
對於當前機器(例如 Linux102)通過 ssh 訪問自己時,也是需要密碼的。想要無祕訪問也需要將自己的公鑰追加到自己的認證檔案後面
ssh資料夾下(~/.ssh)的檔案功能解釋
known_hosts | 記錄ssh訪問過計算機的公鑰(public key) |
---|---|
id_rsa | 生成的私鑰 |
id_rsa.pub | 生成的公鑰 |
authorized_keys | 存放授權過得無密登入伺服器公鑰 |
群起叢集
配置slaves
cd /opt/module/hadoop/etc/hadoop/
vim slaves
配置所有 datanode 伺服器,不允許有空格
linux102
linux103
linux104
分發給 103 102
xsync slaves
啟動叢集
sbin/start-dfs.sh
關閉叢集
sbin/stop-dfs.sh
啟動YARN
老師視訊裡提到必須使用 103 節點起,我實測 2.10.1 版本是可以在 102 伺服器起的,不知是 sh 檔案更新還是 root 賬戶的原因
sbin/start-yarn.sh
Web端測試 SecondaryNameNode
瀏覽器中輸入:http://linux104:50090/status.html
測試叢集
上傳小檔案
hdfs dfs -put wcinput/wc.input /
上傳大檔案
hdfs dfs -put /opt/software/hadoop-2.10.1.tar.gz /
大檔案佔了多個 block,如果下載的話多個塊又會被合併下載下來
實際檔案儲存在 ${HADOOP_HOME}/data/tmp 路徑下的子子子子子子目錄中,感興趣的讀者可以進去看看
/opt/module/hadoop/data/tmp/dfs/data/current/BP-1473062949-192.168.100.102-1608214270058/current/finalized/subdir0/subdir0
叢集時間同步
時間伺服器配置
-
檢查 ntp 是否安裝
rpm -qa|grep ntp
機器都是克隆的,查下 102 就可ntp-4.2.6p5-10.el6.centos.x86_64 fontpackages-filesystem-1.41-1.1.el6.noarch ntpdate-4.2.6p5-10.el6.centos.x86_64
-
修改 ntp 配置檔案
-
授權區域網網段上的所有機器可以從這臺機器上查詢和同步時間
vim /etc/ntp.conf
-
當該節點丟失網路連線,依然可以採用本地時間作為時間伺服器為叢集中的其他節點提供時間同步
# 開啟這段註釋,將 IP 第三段改成自己虛擬機器區域網第三段 restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap # 新增下面的內容:當該節點丟失網路連線,依然可以採用本地時間作為時間伺服器為叢集中的其他節點提供時間同步 server 127.127.1.0 fudge 127.127.1.0 stratum 10
-
-
修改 /etc/sysconfig/ntpd 檔案,讓硬體時間與系統時間一起同步
vim /etc/sysconfig/ntpd 增加內容 SYNC_HWCLOCK=yes
-
重啟 ntpd 服務
service ntpd status
檢視狀態 start 啟動 -
設定 ntpd 開機自啟
chkconfig ntpd on
其他伺服器配置
1天1次
0 0 * * 1-7 /usr/sbin/ntpdate linux102
修改伺服器時間
date -s "2017-9-11 11:11:11"
經過10分鐘等待,看時間是否同步(建議測試修改 cron 表示式,使同步間隔縮小)
date