大數據是指在必定時間內沒法用常規軟件工具進行捕捉、管理和處理的數據集合,是須要新處理模式才能具備更強的決策力、洞察發現力和流程優化能力的海量、高增加率和多樣化的信息增加。html
主要解決海量的存儲和海量數據的分析計算問題。java
Volume(大量)node
Velocity(高速)linux
Variety(多樣)web
Value(低價值密度)shell
物流倉儲:大數據分析系統助力商家精細化運營、提高銷量、節約成本。數據庫
零售:分析用戶消費習慣,爲用戶購買商品提供方便,從而提高商品銷量。vim
旅遊:深度結合大數據能力與旅遊行業需求,共建旅遊產業智慧管理、智慧服務和智慧營銷的將來。centos
商品推薦:根據用戶購買記錄推薦商品。bash
保險:海量數據挖掘及風險預測,助力保險行業精準營銷,提高精細化訂價能力。
金融:多維度體現用戶特徵,幫助金融機構推薦優質客戶,防範欺詐風險。
房地產:大數據全面助力房地產行業,打造精準投策與營銷,選出更合適的地,建造更合適的樓,賣給更合適的人。
人工智能:以大數據爲依託。
Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。
主要解決,海量數據的存儲和海量數據的分析計算問題。
廣義上來講,Hadoop一般是指一個更普遍的概念——Hadoop生態圈。
Apache版本最原始(最基礎)的版本,對於入門學習最好。
Cloudera在大型互聯網企業中用的較多。
Hortonworks文檔較好。
高可靠性:Hadoop 底層維護多個數據副本,因此即便 Hadoop 某個計算元素或存儲出現故障,也不會致使數據的丟失。
高擴展性:在集羣間分配任務數據,可方便的擴展數以千計的節點。
高效性:在 MapReduce 的思想下,Hadoop 是並行工做的,以加快任務處理速度。
高容錯性:可以自動將失敗的任務從新分配。
NameNode(nn):存儲文件的元數據
,如文件名,文件目錄結構,文件屬性(生成時間、副本數、文件權限),以及每一個文件的塊列表和塊所在的DataNode等。
DataNode(dn):在本地文件系統存儲文件塊數據
,以及塊數據的校驗和。
Secondary NameNode(2nn):用來監控 HDFS 狀態的輔助後臺程序,每隔一段時間獲取 HDFS 元數據的快照。
MapReduce 將計算過程分爲兩個階段:Map 和 Reduce
Map 階段並行處理輸入數據
Reduce 階段對 Map 結果進行彙總
圖中涉及的技術名詞解釋以下:
1)Sqoop:Sqoop 是一款開源的工具,主要用於在 Hadoop、Hive 與傳統的數據庫(MySQL)間進行數據的傳遞,能夠將一個關係型數據庫中的數據導進到 Hadoop 的 HDFS 中,也能夠將 HDFS 的數據導進到關係型數據庫中。
2)Flume:Flume 是 Cloudera 提供的一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的系統,Flume 支持在日誌系統中定製各種數據發送方,用於收集數據;同時,Flume 提供對數據進行簡單處理,並寫到各類數據接受方(可定製)的能力。
3)Kafka:Kafka 是一種高吞吐量的分佈式發佈訂閱消息系統,有以下特性:
(1)經過O(1)的磁盤數據結構提供消息的持久化,這種結構對於即便數以 TB 的消息存儲也可以保持長時間的穩定性能。
(2)高吞吐量:即便是很是普通的硬件 Kafka 也能夠支持每秒數百萬的消息。
(3)支持經過 Kafka 服務器和消費機集羣來分區消息。
(4)支持 Hadoop 並行數據加載。
4)Storm:Storm 用於「連續計算」,對數據流作連續查詢,在計算時就將結果以流的形式輸出給用戶。
5)Spark:Spark 是當前最流行的開源大數據內存計算框架,能夠基於 Hadoop 上存儲的大數據進行計算。
6)Oozie:Oozie 是一個管理 Hdoop 做業(job)的工做流程調度管理系統。
7)Hbase:HBase 是一個分佈式的、面向列的開源數據庫,HBase 不一樣於通常的關係數據庫,它是一個適合於非結構化數據存儲的數據庫。
8)Hive:Hive 是基於 Hadoop 的一個數據倉庫工具,能夠將結構化的數據文件映射爲一張數據庫表,並提供簡單的 SQL查詢功能,能夠將 SQL 語句轉換爲 MapReduce 任務進行運行, 其優勢是學習成本低,能夠經過類 SQL 語句快速實現簡單的 MapReduce 統計,沒必要開發專門的 MapReduce 應用,十分適合數據倉庫的統計分析。
10)R語言:R 是用於統計分析、繪圖的語言和操做環境。R 是屬於 GNU 系統的一個自由、免費、源代碼開放的軟件,它是一個用於統計計算和統計製圖的優秀工具。
11)Mahout:Apache Mahout 是個可擴展的機器學習和數據挖掘庫。
12)ZooKeeper:Zookeeper 是 Google 的 Chubby 一個開源的實現,它是一個針對大型分佈式系統的可靠協調系統,提供的功能包括:配置維護、名字服務、 分佈式同步、組服務等,ZooKeeper 的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
關閉防火牆
# 關閉防火牆 systemctl stop firewalld # 開機禁用防火牆 systemctl disable firewalld
建立用戶
# 建立用戶 useradd djm # 修改密碼 passwd djm
配置用戶具備 root 權限
djm ALL=(ALL) NOPASSWD:ALL
在 /opt 目錄下建立文件夾
sudo mkdir /opt/software sudo mkdir /opt/module
卸載現有 Java
rpm -qa | grep java | xargs sudo rpm -e --nodeps
解壓到 /opt/module 目錄
tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/
配置環境變量
sudo vim /etc/profile #JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_144 export PATH=$PATH:$JAVA_HOME/bin
刷新配置
source /etc/profile
測試是否安裝成功
java -version
解壓到 /opt/module 目錄
tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/
配置環境變量
sudo vim /etc/profile #HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-2.7.2 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
刷新配置
source /etc/profile
測試是否安裝成功
hadoop version
bin 目錄:存放對 Hadoop 相關服務(HDFS,YARN)進行操做的腳本
etc 目錄:Hadoop 的配置文件目錄,存放 Hadoop 的配置文件
lib 目錄:存放 Hadoop 的本地庫(對數據進行壓縮解壓縮功能)
sbin 目錄:存放啓動或中止 Hadoop 相關服務的腳本
share 目錄:存放 Hadoop 的依賴 jar 包、文檔、和官方案例
建立一個 input 文件夾
[djm@hadoop101 hadoop-2.7.2]$ mkdir input
將 Hadoop 的 xml 配置文件複製到 input
[djm@hadoop101 hadoop-2.7.2]$ cp etc/hadoop/*.xml input
執行 share 目錄下的 MapReduce 程序
# output 必須是一個不存在的文件夾 [djm@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'
查看輸出結果
[djm@hadoop101 hadoop-2.7.2]$ cat output/*
配置 hadoop-env.sh
#修改JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_144
配置 core-site.xml
<configuration> <!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop101:9000</value> </property> <!-- 指定Hadoop運行時產生文件的存儲目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property> </configuration>
配置 hdfs-site.xml
<configuration> <!-- 指定HDFS副本的數量 --> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
啓動集羣
#格式化NameNode [djm@hadoop101 hadoop-2.7.2]$ hdfs namenode -format #啓動NameNode [djm@hadoop101 hadoop-2.7.2]$ hadoop-daemon.sh start namenode #啓動DataNode [djm@hadoop101 hadoop-2.7.2]$ hadoop-daemon.sh start datanode
查看是否啓動成功
jps
web 端查看HDFS文件系統
http://hadoop101:50070/dfshealth.html#tab-overview
操做集羣
#在HDFS文件系統上建立input [djm@hadoop101 hadoop-2.7.2]$ hdfs dfs -mkdir -p /user/djm/input #將測試文件內容上傳到文件系統上 [djm@hadoop101 hadoop-2.7.2]$ hdfs dfs -put wcinput/wc.input /user/djm/input/ #運行MapReduce程序 [djm@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/djm/input/ /user/djm/output #查看運行結果 [djm@hadoop101 hadoop-2.7.2]$ hdfs dfs -cat /user/djm/output/* #刪除運行結果 [djm@hadoop101 hadoop-2.7.2]$ hdfs dfs -rm -r /user/djm/output
爲何不能一直格式化 NameNode,格式化 NameNode,要注意什麼?
當咱們執行文件系統格式化時,會在 NameNode 數據文件夾(即配置文件中 dfs.name.dir 在本地系統的路徑)中保存一個 dfs/data/current/VERSION 文件,記錄了 clusterID 和 datanodeUuid,格式化 NameNode 會產生新的 clusterID,可是 VERSION 文件只記錄第一次格式化時保存的 clusterID,所以形成 DataNode 與 NameNode 之間的 ID 不一致,解決方法是刪除 VERSION 文件。
配置 yarn-env.sh
#修改JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_144
配置 yarn-site.xml
<configuration> <!-- Reducer獲取數據的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop101</value> </property> </configuration>
配置 mapred-env.sh
#修改JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_144
配置 mapred-site.xml
#將mapred-site.xml.template重命名爲mapred-site.xml [djm@hadoop101 hadoop-2.7.2]$ mv mapred-site.xml.template mapred-site.xml <configuration> <!-- 指定MR運行在YARN上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
啓動集羣
#啓動NameNode [djm@hadoop101 hadoop-2.7.2]$ hadoop-daemon.sh start namenode #啓動DataNode [djm@hadoop101 hadoop-2.7.2]$ hadoop-daemon.sh start datanode #啓動ResourceManager [djm@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager #啓動NodeManager [djm@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
web 端查看 YARN
集羣操做
#刪除文件系統上的output文件 [djm@hadoop101 hadoop-2.7.2]$ hdfs dfs -rm -R /user/djm/output #執行MapReduce程序 [djm@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/djm/input /user/djm/output
配置 mapred-site.xml
<configuration> <!-- 歷史服務器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop101:10020</value> </property> <!-- 歷史服務器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop101:19888</value> </property> </configuration>
啓動歷史服務器
mr-jobhistory-daemon.sh start historyserver
查看 JobHistory
http://hadoop101:19888/jobhistory
日誌彙集概念:應用運行完成之後,將程序運行日誌信息上傳到 HDFS 系統上。
日誌彙集功能好處:能夠方便的查看到程序運行詳情,方便開發調試。
<configuration> <!-- 日誌彙集功能使能 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 日誌保留時間設置7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property> </configuration>
重啓 NodeManager 、ResourceManager 和 HistoryServer
[djm@hadoop101 hadoop-2.7.2]$ yarn-daemon.sh stop resourcemanager [djm@hadoop101 hadoop-2.7.2]$ yarn-daemon.sh stop nodemanager [djm@hadoop101 hadoop-2.7.2]$ mr-jobhistory-daemon.sh stop historyserver [djm@hadoop101 hadoop-2.7.2]$ yarn-daemon.sh start resourcemanager [djm@hadoop101 hadoop-2.7.2]$ yarn-daemon.sh start nodemanager [djm@hadoop101 hadoop-2.7.2]$ mr-jobhistory-daemon.sh start historyserver
刪除 HDFS 上已經存在的輸出文件
[djm@hadoop101 hadoop-2.7.2]$ hdfs dfs -rm -R /user/djm/output
執行 WordCount 程序
[djm@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/djm/input /user/djm/output
查看日誌
http://hadoop101:19888/jobhistory
Hadoop 配置文件分兩類:默認配置文件和自定義配置文件,只有用戶想修改某一默認配置值時,才須要修改自定義配置文件,更改相應屬性值。
自定義配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml 四個配置文件存放在 $HADOOP_HOME/etc/hadoop 這個路徑上,用戶能夠根據項目需求從新進行修改配置。
建立 xsync
[djm@hadoop102 ~]$ mkdir bin [djm@hadoop102 ~]$ cd bin/ [djm@hadoop102 bin]$ touch xsync [djm@hadoop102 bin]$ vi 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 ------------------- hadoop$host -------------- rsync -av $pdir/$fname $user@hadoop$host:$pdir done
分發
[djm@hadoop102 ~]$ xsync /opt/module/jdk1.8.0_144 [djm@hadoop102 ~]$ xsync /opt/module/hadoop-2.7.2 [djm@hadoop102 ~]$ xsync /etc/profile
集羣部署規劃
hadoop102 | hadoop103 | hadoop104 | |
---|---|---|---|
HDFS | NameNode、DataNode | DataNode | SecondaryNameNode、DataNode |
YARN | NodeManager | ResourceManager、NodeManager | NodeManager |
配置 core-site.xml
<configuration> <!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop101:9000</value> </property> <!-- 指定Hadoop運行時產生文件的存儲目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property> </configuration>
配置 hadoop-env.sh
#修改JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_144
配置 hdfs-site.xml
<configuration> <!-- 指定HDFS副本的數量 --> <property> <name>dfs.replication</name> <value>3</value> </property> <!-- 指定Hadoop輔助名稱節點主機配置 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop104:50090</value> </property> </configuration>
配置 yarn-env.sh
#修改JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_144
配置 yarn-site.xml
<configuration> <!-- Reducer獲取數據的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop103</value> </property> </configuration>
配置 mapred-env.sh
#修改JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_144
配置 mapred-site.xml
<configuration> <!-- 指定MR運行在YARN上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
在集羣上分發配置好的 Hadoop 配置文件
[djm@hadoop102 ~]$ xsync /opt/module/hadoop-2.7.2/etc/hadoop/
若是集羣是第一次啓動,須要格式化 NameNode
[djm@hadoop102 hadoop-2.7.2]$ hdfs namenode -format
在 hadoop102 上啓動 NameNode
[djm@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh start namenode
在 hadoop10二、hadoop103 以及 hadoop104 上分別啓動 DataNode
[djm@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh start datanode [djm@hadoop103 hadoop-2.7.2]$ hadoop-daemon.sh start datanode [djm@hadoop104 hadoop-2.7.2]$ hadoop-daemon.sh start datanode
爲何三個主機來回切換佔用一個 datanode?
分別查看三臺主機的 VERSION 文件,發現 datanodeUuid 相同,果斷分別刪除 VERSION 文件,從新啓動 datanode,問題解決
生成公鑰和私鑰
[djm@hadoop102 .ssh]$ ssh-keygen -t rsa
將公鑰拷貝到要免密登陸的目標機器上
[djm@hadoop102 .ssh]$ ssh-copy-id hadoop102 [djm@hadoop102 .ssh]$ ssh-copy-id hadoop103 [djm@hadoop102 .ssh]$ ssh-copy-id hadoop104 [djm@hadoop103 .ssh]$ ssh-copy-id hadoop102 [djm@hadoop103 .ssh]$ ssh-copy-id hadoop103 [djm@hadoop103 .ssh]$ ssh-copy-id hadoop104 [djm@hadoop104 .ssh]$ ssh-copy-id hadoop102 [djm@hadoop104 .ssh]$ ssh-copy-id hadoop103 [djm@hadoop104 .ssh]$ ssh-copy-id hadoop104
.ssh 下(~/.ssh)的文件功能解釋
known_hosts | 記錄ssh訪問過計算機的公鑰(public key) |
---|---|
id_rsa | 生成的私鑰 |
id_rsa.pub | 生成的公鑰 |
authorized_keys | 存放受權過得無密登陸服務器公鑰 |
編寫 jpsall 腳本
#!/bin/bash # 循環 for((host=102; host<105; host++)); do echo ------------------- hadoop$host -------------- ssh hadoop$host "source /etc/profile && jps" done
配置 slaves
hadoop102 hadoop103 hadoop104
同步全部節點配置文件
[djm@hadoop102 hadoop]$ xsync slaves
啓動 HDFS
[djm@hadoop102 hadoop-2.7.2]$ start-dfs.sh
啓動 YARN
[djm@hadoop103 hadoop-2.7.2]$ start-yarn.sh
啓動 HistoryServer
[djm@hadoop103 hadoop-2.7.2]$ mr-jobhistory-daemon.sh start historyserver
查看是否啓動成功
[djm@hadoop102 hadoop-2.7.2]$ jpsall ------------------- hadoop102 -------------- 98640 Jps 3266 DataNode 3037 NameNode 3549 NodeManager ------------------- hadoop103 -------------- 74929 DataNode 75258 NodeManager 39453 Jps 75054 ResourceManager ------------------- hadoop104 -------------- 77123 SecondaryNameNode 76562 DataNode 76786 NodeManager 41475 Jps 76904 JobHistoryServer
刪除文件系統上的 output 文件
[djm@hadoop102 hadoop-2.7.2]$ hdfs dfs -rm -R /user/djm/output
執行 MapReduce 程序
[djm@hadoop102 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/djm/input /user/djm/output
各個服務組件逐一啓動/中止
分別啓動/中止 HDFS 組件
hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
啓動/中止 YARN
yarn-daemon.sh start / stop resourcemanager / nodemanager
各個模塊分開啓動/中止(配置 ssh 是前提)經常使用
總體啓動/中止 HDFS
start-dfs.sh / stop-dfs.sh
總體啓動/中止 YARN
start-yarn.sh / stop-yarn.sh
檢查是否安裝了 ntp 服務
[root@hadoop102 ~]# rpm -qa | grep ntp
修改 /etc/ntp.conf
將 #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap 修改成 restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap 將 server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst 修改成 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst 添加 server 127.127.1.0 fudge 127.127.1.0 stratum 10
修改 /etc/sysconfig/ntpd
#同步硬件時間 SYNC_HWCLOCK=yes
從新啓動 ntpd 服務
[root@hadoop102 ~]# systemctl restart ntpd
設置ntpd服務開機啓動
[root@hadoop102 ~]# chkconfig ntpd on
在其餘機器配置 10 分鐘與時間服務器同步一次
[root@hadoop102 ~]# crontab -e 添加 */10 * * * * /usr/sbin/ntpdate hadoop102