傳統模式已經知足不了大數據的增加
1)存儲問題
- 傳統數據庫:存儲億級別的數據,須要高性能的服務器;而且解決不了本質問題;只能存結構化數據
- 大數據存儲:經過分佈式存儲,將數據存到一臺機器的同時,還能夠備份到其餘機器上,這樣當某臺機器掛掉了或磁盤壞掉了,在其餘機器上能夠拿到該數據,數據不會丟失(可備份)
- 磁盤不夠掛磁盤,機器不夠加機器(可橫行擴展)
2)分析數據問題
- 傳統數據庫: 當數據庫存儲億級別的數據後,查詢效率也降低的很快,查詢不能秒級返回
- 大數據分析:分佈式計算。也能夠橫行擴展
MapReduce:(批處理)屢次與磁盤進行交互,運行比較慢
運算的數據是有範圍的,運算完一次,就表明該批次處理完成
實時計算: (流處理)對時間的要求很高,基本能夠快速處理完成
實時計算的數據,沒有範圍的,會根據某個時間的範圍進行計算。spark streaming ,storm, flink
1.2 什麼是hadoop?
Hadoop項目是以可靠、可擴展和分佈式計算爲目的而發展的開源軟件
Hadoop 是Apache的頂級項目
Apache:APACHE軟件基金會,支持Apache的開源軟件社區項目,爲公衆提供好的軟件產品
大數據的主要特色(4V)
- 數據容量大(Volume)。從TB級別,躍升到PB級別
- 數據類型繁多(Variety)。包括網絡日誌、音頻、視頻、圖片、地理位置信息等,這些多類型的數據對數據的處理能力提出了更高要求
- 商業價值高(Value)。客戶羣體細分,提供定製化服務;發掘新的需求同時提升投資的回報率;下降服務成本
- 處理速度快(Velocity)。這是大數據區分於傳統數據挖掘的最顯著特徵。預計到2020年,全球數據使用量將達到35.2ZB。在如此海量的數據面前,處理數據的效率就是企業的生命
hadoop的歷史起源
創始人: Doug Cutting 和 Mike Cafarella
2002開始,兩位創始人開發開源搜索引擎解決方案: Nutch
2004年受Google Lab 開發的 Map/Reduce 和 Google File System(GFS) 的啓發,NDFS( Nutch Distributed File System )引入Nutch
2006年 在Yahoo!工做的Doug Cutting將這套大數據處理軟件命名爲Hadoop
hadoop核心組件
用於解決兩個核心問題:存儲和計算
核心組件
1)Hadoop Common:
一組分佈式文件系統和通用I/O的組件與接口(序列化、Java RPC和持久化數據結構)
2)Hadoop Distributed FileSystem(Hadoop分佈式文件系統HDFS)
分佈式存儲, 有備份, 可擴展
3)Hadoop MapReduce(分佈式計算框架)
分佈式計算,多臺機器同時計算一部分,獲得部分結果,再將部分結果彙總,獲得整體的結果(可擴展)
4)Hadoop YARN(分佈式資源管理器)
MapReduce任務計算的時候,運行在yarn上,yarn提供資源
hadoop的框架演變
Hadoop1.0 的 MapReduce(MR1):集資源管理和任務調用、計算功能綁在一塊兒,擴展性較差,不支持多計算框架html
Hadoop2.0 的Yarn(MRv2):將資源管理和任務調用兩個功能分開,提升擴展性,並支持多計算框架
hadoop生態圈
1)HDFS(Hadoop分佈式文件系統)
HDFS是一種數據分佈式保存機制,數據被保存在計算機集羣上。數據寫入一次,讀取屢次。HDFS 爲hive、HBase等工具提供了基礎
2)MapReduce(分佈式計算框架)
MapReduce是一種分佈式計算模型,用以進行大數據量的計算,是一種離線計算框架
這個 MapReduce 的計算過程簡而言之,就是將大數據集分解爲成若干個小數據集,每一個(或若干個)數據集分別由集羣中的一個結點(通常就是一臺主機)進行處理並生成中間結果,而後將每一個結點的中間結果進行合併, 造成最終結果
3)HBASE(分佈式列存數據庫)
HBase是一個創建在HDFS之上,面向列的NoSQL數據庫,用於快速讀/寫大量數據。HBase使用Zookeeper進行管理,確保全部組件都正常運行
4)Sqoop(數據ETL/同步工具)
Sqoop是SQL-to-Hadoop的縮寫,主要用於傳統數據庫和Hadoop之間傳輸數據
5)flume(分佈式日誌收集系統)
Flume是一個分佈式、可靠、和高可用的海量日誌聚合的系統,如日誌數據從各類網站服務器上聚集起來存儲到HDFS,HBase等集中存儲器中
6)Storm(流示計算、實時計算)
Storm是一個免費開源、分佈式、高容錯的實時計算系統。Storm令持續不斷的流計算變得容易,彌補了Hadoop批處理所不能知足的實時要求。Storm常常用於在實時分析、在線機器學習、持續計算、分佈式遠程調用和ETL等領域
7)Zookeeper(分佈式協做服務)
Hadoop的許多組件依賴於Zookeeper,它運行在計算機集羣上面,用於管理Hadoop操做
做用:解決分佈式環境下的數據管理問題:統一命名,狀態同步,集羣管理,配置同步等
8)Pig(ad-hoc腳本)
Pig定義了一種數據流語言—Pig Latin,它是MapReduce編程的複雜性的抽象,Pig平臺包括運行環境和用於分析Hadoop數據集的腳本語言(Pig Latin)
其編譯器將Pig Latin 翻譯成MapReduce 程序序列將腳本轉換爲MapReduce任務在Hadoop上執行。一般用於進行離線分析
9)Hive(數據倉庫)
Hive定義了一種相似SQL的查詢語言(HQL),將SQL轉化爲MapReduce任務在Hadoop上執行。一般用於離線分析
HQL用於運行存儲在Hadoop上的查詢語句,Hive讓不熟悉MapReduce開發人員也能編寫數據查詢語句,而後這些語句被翻譯爲Hadoop上面的MapReduce任務
10)Spark(內存計算模型)
Spark提供了一個更快、更通用的數據處理平臺。和Hadoop相比,Spark可讓你的程序在內存中運行時速度提高100倍,或者在磁盤上運行時速度提高10倍。
11)Oozie(工做流調度器)
Oozi能夠把多個Map/Reduce做業組合到一個邏輯工做單元中,從而完成更大型的任務
12)Mahout(數據挖掘算法庫)
Mahout的主要目標是建立一些可擴展的機器學習領域經典算法的實現,旨在幫助開發人員更加方便快捷地建立智能應用程序
13)Hadoop YARN(分佈式資源管理器)
YARN是下一代MapReduce,即MRv2,是在第一代MapReduce基礎上演變而來的,主要是爲了解決原始Hadoop擴展性較差,不支持多計算框架而提出的
其核心思想:
將MR1中JobTracker的資源管理和做業調用兩個功能分開,分別由ResourceManager和ApplicationMaster進程來實現
1)ResourceManager:負責整個集羣的資源管理和調度
2)ApplicationMaster:負責應用程序相關事務,好比任務調度、任務監控和容錯等
14)Tez(DAG計算模型)
一個運行在YARN之上支持DAG(有向無環圖)做業的計算框架
Tez的目的就是幫助Hadoop處理這些MapReduce處理不了的用例場景,如機器學習
什麼是集羣,集羣和服務的關係。
集羣規劃:
一個主節點:nn1.hadoop,
一個從節點:nn2.hadoop,
三個工做節點:s1.hadoop、s2.hadoop、s3.hadoop
網絡規劃:
nn1.hadoop 192.168.174.160
nn2.hadoop 192.168.174.161
s1.hadoop 192.168.174.162
s2.hadoop 192.168.174.163
s3.hadoop 192.168.174.164
在企業裏還應有操做機(跳板機)
2 基礎環境搭建
配置網絡
1 // 查看網卡配置文件是否一致
2 vim /etc/sysconfig/network-scripts/ifcfg-ens33
3
4 // 文件配置以下:
5 TYPE="Ethernet"
6 BOOTPROTO=static
7 DEFROUTE="yes"
8 IPV4_FAILURE_FATAL="no"
9 IPV6INIT="yes"
10 IPV6_AUTOCONF="yes"
11 IPV6_DEFROUTE="yes"
12 IPV6_FAILURE_FATAL="no"
13 NAME="eno16777736"
14 UUID="cb7a79a9-8114-482b-93f0-fce73bcef88b"
15 DEVICE="eno16777736"
16 ONBOOT="yes"
17 IPADDR=192.168.142.200
18 PREFIX=24
19 GATEWAY=192.168.142.2
20 DNS1=192.168.142.2
21 DNS2=8.8.8.8
22
23 // 重啓網絡
24 systemctl restart network.service 或 service network restart
25 // ping 百度,測試網絡是否正常
26 ping www.baidu.com
1)安裝sz rz工具,用於之後用rz sz上傳下載文件
2)下載 repo 文件
4)備份並替換系統的repo文件
1 mv Centos-7.repo /etc/yum.repos.d/
2 cd /etc/yum.repos.d/
3 mv CentOS-Base.repo CentOS-Base.repo.bak
4 mv Centos-7.repo CentOS-Base.repo
5)執行yum源更新命令
yum clean all
# 服務器的包信息下載到本地電腦緩存起來
yum makecache
yum update -y
配置完畢。java
1 yum install -y openssh-server vim gcc gcc-c++ glibc-headers bzip2-devel lzo-devel curl wget openssh-clients zlib-devel autoconf automake cmake libtool openssl-devel fuse-devel snappy-devel telnet unzip zip net-tools.x86_64 firewalld systemd
2.3 關閉防火牆
查看防火牆狀態:firewall-cmd --state
關閉防火牆:systemctl stop firewalld.service
禁止防火牆開機啓動: systemctl disable firewalld.service
查看服務是否開機啓動: systemctl is-enabled firewalld.service
2.4 關閉SELinux
查看關閉狀態
/usr/sbin/sestatus -v
關閉方法
vim /etc/selinux/config
把文件裏的SELINUX=disabled
重啓服務器
reboot
啓動以後用
/usr/sbin/sestatus -v 查看selinux的修改狀態
2.5 安裝JDK
1)JDK 下載地址
地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
2)安裝JDK
用 rz 命令將安裝文件上傳Linux 系統
rpm -ivh jdk-8u144-linux-x64.rpm
3)配置JDK 環境變量
修改系統環境變量文件 /etc/profile,在文件尾部追加如下內容
1 export JAVA_HOME=/usr/java/jdk1.8.0_144
2 export JRE_HOME=$JAVA_HOME/jre
3 export PATH=$PATH:$JAVA_HOME/bin
4 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export
設置或顯示環境變量
用export修飾一個變量,A腳本中調用B腳本,B腳本也能拿到這個變量
4)使修改生效,並配置JDK
1 #使修改生效
2 source /etc/profile
3 #查看系統變量值
4 env | grep PATH
5 #檢查JDK 配置狀況
6 env | grep JAVA_HOME
2.6 修改主安裝經常使用軟件主機名
1 hostnamectl set-hostname nn1.hadoop
2 #修改完後用hostname可查看當前主機名
3 hostname
2.7 建立hadoop 用戶並設置 hadoop 用戶密碼
1 #建立hadoop用戶
2 useradd hadoop
3
4 #給hadoop用戶設置密碼
5 hadoop000
配置SSH密鑰的目的:使得多臺機器間能夠免密登陸。
實現原理:
使用ssh-keygen在linux01 上生成private和public密鑰,將生成的public密鑰拷貝到遠程機器linux02 上後,就可使用ssh命令無需密碼登陸到另一臺機器linux02上。若是想互相登陸,則要把公鑰私鑰都拷貝到遠程機器linux02 上。
實現步驟:
1 #切換到hadoop用戶
2 su – hadoop
3 #建立.ssh目錄
4 mkdir ~/.ssh
5 #生成ssh公私鑰
6 ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
7 #輸出公鑰文件內容而且從新輸入到~/.ssh/authorized_keys文件中
8 cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
9 #給~/.ssh文件加上700權限
10 chmod 700 ~/.ssh
11 #給~/.ssh/authorized_keys加上600權限
12 chmod 600 ~/.ssh/authorized_keys
2.9 禁止非 whell 組用戶切換到root,配置免密切換root
一般狀況下,通常用戶經過執行「su -」命令、輸入正確的root密碼,能夠登陸爲root用戶來對系統進行管理員級別的配置。
可是,爲了更進一步增強系統的安全性,有必要創建一個管理員的組,只容許這個組的用戶來執行 「su -」 命令登陸爲 root 用戶,而讓其餘組的用戶即便執行 「su -」 、輸入了正確的 root 密碼,也沒法登陸爲 root 用戶。在UNIX和Linux下,這個組的名稱一般爲 「wheel」 。
回到root用戶
1)修改/etc/pam.d/su配置
su 時要求用戶加入到wheel組
修改/etc/pam.d/su文件,將「
#auth required pam_wheel.so」替換成「auth required pam_wheel.so」
修改/etc/pam.d/su文件,將「
#auth sufficient pam_wheel.so」替換成「auth sufficient pam_wheel.so」
2)修改/etc/login.defs文件
只有wheel組能夠su 到root
cp /etc/login.defs /etc/login.defs_back 先作個備份
tail /etc/login.defs 從文件底部查看
3) 添加用戶到管理員,禁止普通用戶su 到 root
1 #把hadoop用戶加到wheel組裏
2 [root@nn1 ~]# gpasswd -a hadoop wheel
3 #查看wheel組裏是否有hadoop用戶
4 [root@nn1 ~]# cat /etc/group | grep wheel
4)用 hadoop 用戶驗證一下,因爲 hadoop 沒有在wheel 組裏,因此沒有 su - root 權限。
5)修改/etc/pam.d/su文件(上面已經配好)
將字符串「#auth sufficient pam_wheel.so」替換成「auth sufficient pam_wheel.so」
在克隆機器前,配置nn1 機器的 /etc/hosts 文件,文件內須要配置nn一、nn二、s一、s二、s3 全部機器的IP 和 主機名。linux
修改/etc/hosts文件,追加如下內容。vim /etc/hosts
1 192.168.174.160 nn1.hadoop
2 192.168.174.161 nn2.hadoop
3 192.168.174.162 s1.hadoop
4 192.168.174.163 s2.hadoop
5 192.168.174.164 s3.hadoop
執行完上面的命令,一個基礎的linux系統就配置好了。而後再根據這個虛擬機克隆出 4個linux系統c++
其中:nn2.hadoop: 從節點算法
s1.hadoop、s2.hadoop、s3.hadoop:三個工做節點數據庫
並用hadoop用戶,測試彼此之間是否能進行ssh通訊apache
1) 虛擬機克隆
右鍵 nn1 機器→ 管理 → 克隆。編程
克隆完成後,須要給克隆的虛擬機配置靜態IP。vim
2)配置靜態IP
1)查看網卡硬件名稱和基本信息 ip add 緩存

虛擬機會給每一個克隆的虛擬機建立新網卡,如上面的 ens33 。
若是網卡設備信息中沒有顯示IP,則須要配置配置文件
cd /etc/sysconfig/network-scripts/
vim ifcfg-ens33
service network restart
ifcfg-xxx 中的xxx 與網卡名相同後,配置ifcfg-xxx 文件
1 TYPE="Ethernet"
2 BOOTPROTO="static"
3 DEFROUTE="yes"
4 PEERDNS="yes"
5 PEERROUTES="yes"
6 IPV4_FAILURE_FATAL="no"
7 IPV6INIT="yes"
8 IPV6_AUTOCONF="yes"
9 IPV6_DEFROUTE="yes"
10 IPV6_PEERDNS="yes"
11 IPV6_PEERROUTES="yes"
12 IPV6_FAILURE_FATAL="no"
13 NAME="ens33"
14 UUID="d15377eb-6ffa-44c9-a06d-f7eb00f49f44"
15 DEVICE="ens33"
16 ONBOOT="yes"
17 IPADDR=192.168.142.133
18 PREFIX=24
19 GATEWAY=192.168.142.2
20 DNS1=192.168.142.2
21 DNS2=8.8.8.8
須要修改的內容,配置完的網卡文件
配置完後,用systemctl restart network.service重啓網絡服務,當前的ssh就鏈接不上了,是由於網絡IP被改變成你本身設置的靜態IP。
用 ip add 查看網卡信息
1 hostnamectl set-hostname nn1.hadoop
2 #修改完後用hostname可查看當前主機名
3 hostname
若是上不了網執行如下操做
3)配置 /etc/resolv.conf 的 nameserver
cat /etc/resolv.conf 查看nameserver是否被設置正確
vim /etc/resolv.conf 修改文件,若是不存在nameserver就在文件下面添加,若是存在就修改,把nameserver 設置成本身對應的DNS。
4)中止掉NetworkManager服務
五臺一塊兒執行
1 // 中止NetworkManager服務
2 systemctl stop NetworkManager.service
3 // 並設置成開機不啓動
4 systemctl disable NetworkManager.service
5 // 以後重啓網絡服務
6 systemctl restart network.service
5)
修改每一個機器的主機名
1 hostnamectl set-hostname nn2.hadoop
2 hostnamectl set-hostname s1.hadoop
3 hostnamectl set-hostname s2.hadoop
4 hostnamectl set-hostname s3.hadoop
執行腳本要給腳本加上可執行權限
1 chmod -R +x ~/hadoop_op
exe.sh : 執行su 命令,與ssh_root.sh 配套使用
ips :用於存放要操做的主機列表,用回車或空格隔開
scp_all.sh :用hadoop用戶拷貝當前機器的文件到其餘操做機
ssh_all.sh :用hadoop 用戶可登錄其餘操做機執行相應操做
ssh_root.sh : 用hadoop 用戶登陸其餘操做機,並su 到 root 用戶,以root 用戶執行相應操做,與exe.sh 配套使用
1)ips
2)ssh_all.sh
3)ssh_root.sh
4)exe.sh
5)scp_all.sh
3.2 批量腳本的使用
1)將批量腳本上傳到機器上
把hadoop_op.zip文件用 rz 命令上傳到 nn1.hadoop 機器上
2)解壓批量腳本,並修改批量腳本權限
通常先切換到當前使用用戶的home目錄下
解壓: unzip hadoop_op.zip
修改權限:chmod -R 775 ./hadoop_op
3)測試批量SSH命令
./ssh_all.sh hostname
4)測試批量傳文件
若是想將nn1.hadoop 機器上/root下的s1 文件,分發到其餘機器的/root/dir/ 目錄下,該如何操做?
1)nn1.hadoop:將/root/s1 文件拷貝到hadoop家目錄下
2)多機分發腳本,將s1文件分發到其餘機器的hadoop家目錄
這步通常的是分發到/tmp 臨時目錄下,這個目錄linux會按期刪除
3)執行ssh_root.sh 在root家目錄下建立dir目錄
4)執行ssh_root.sh 將每臺機器的hadoop用戶家目錄下的s1文件拷貝到/root/dir目錄下