目錄:
大資料解決四大核心問題:
-
資料的儲存(Big Data Storage),海量資料需要處理和分析,但前提是要進行有效的儲存。Hadoop的誕生突破了傳統資料檔案系統的單機模式。HDFS使得資料可以跨越不同的機器與裝置,並且用一個路徑去管理不同平臺上的資料。
-
資料的計算(Data Calculation),在資料有效儲存的基礎上,對資料的統計和分析本質上就是資料的計算。在大資料領域常見的計算工具有MapReduce、Spark等。
-
資料的查詢(Consensus Data),對大資料進行有效管理的核心指標是資料查詢技術。其中NoSQL (Not Only SQL)應用較為廣泛,能較有效解決資料的隨機查詢,其中就主要包括Hbase等。從本質而言,依舊是Hadoop模式下的資料查詢。
-
資料的挖掘(Data mining),Hive資料倉儲為資料的挖掘提供了基礎,通過分類、預測、相關性分析來建立模型進行模式識別、機器學習從而構建專家系統。
Hadoop之父
大牛,他是Lucene、Nutch 、Hadoop等專案的發起人。是他,把高深莫測的搜尋技術形成產品,貢獻給普通大眾;還是他,打造了在雲端計算和大資料領域裡如日中天的Hadoop。他是某種意義上的盜火者(普羅米修斯盜火造福人類),他就是Doug Cutting。
Hadoop是專案的總稱。主要是由HDFS和MapReduce組成。HDFS是Google File System(GFS)的開源實現。MapReduce是Google MapReduce的開源實現。
Hadoop的誕生突破了傳統資料檔案系統的單機模式。使得資料可以跨越不同的機器與裝置,並且用一個路徑去管理不同平臺上的資料。
MapReduce的計算模型分為Map和Reduce兩個過程。在日常經驗裡,我們統計資料需要分類,分類越細、參與統計的人數越多,計算的時間就越短,這就是Map的形象比喻,在大資料計算中,成百上千臺機器同時讀取目標檔案的各個部分,然後對每個部分的統計量進行計算,Map就是負責這一工作的;而Reduce就是對分類計數之後的合計,是大資料計算的第二階段。可見,資料的計算過程就是在HDFS基礎上進行分類彙總。
HDFS把節點分成兩類:NameNode和DataNode。NameNode是唯一的,程式與之通訊,然後從DataNode上存取檔案。這些操作是透明的,與普通的檔案系統API沒有區別。
MapReduce則是JobTracker節點為主,分配工作以及負責和使用者程式通訊。
HDFS和MapReduce實現是完全分離的,並不是沒有HDFS就不能MapReduce運算。
Hadoop也跟其他雲端計算專案有共同點和目標:實現海量資料的計算。而進行海量計算需要一個穩定的,安全的資料容器,才有了Hadoop分散式檔案系統(HDFS,Hadoop Distributed File System)。
HDFS通訊部分使用org.apache.hadoop.ipc,可以很快使用RPC.Server.start()構造一個節點,具體業務功能還需自己實現。針對HDFS的業務則為資料流的讀寫,NameNode/DataNode的通訊等。
MapReduce主要在org.apache.hadoop.mapred,實現提供的介面類,並完成節點通訊(可以不是hadoop通訊介面),就能進行MapReduce運算。
叢集規劃:
主機名 |
IP |
程式(jps) |
hadoop01 |
192.168.163.129 |
ZooKeeper(QuorumPeerMain) Hadoop HDFS Flume Hive |
hadoop02 |
192.168.163.130 |
ZooKeeper(QuorumPeerMain) |
hadoop03 |
192.168.163.131 |
ZooKeeper(QuorumPeerMain) |
子專案
Hadoop Common: 在0.20及以前的版本中,包含HDFS、MapReduce和其他專案公共內容,從0.21開始HDFS和MapReduce被分離為獨立的子專案,其餘內容為Hadoop Common
HDFS: Hadoop分散式檔案系統(Distributed File System) - HDFS (Hadoop Distributed File System)
MapReduce:平行計算框架,0.20前使用 org.apache.hadoop.mapred 舊介面,0.20版本開始引入org.apache.hadoop.mapreduce的新API
HBase: 類似Google BigTable的分散式NoSQL列資料庫。(HBase和Avro已經於2010年5月成為頂級 Apache 專案)
Hive:資料倉儲工具,由Facebook貢獻。
Zookeeper:分散式鎖設施,提供類似Google Chubby的功能,由Facebook貢獻。
Avro:新的資料序列化格式與傳輸工具,將逐步取代Hadoop原有的序列化機制。
Pig: 大資料分析平臺,為使用者提供多種介面。
Ambari:Hadoop管理工具,可以快捷的監控、部署、管理叢集。
Sqoop:於在HADOOP與傳統的資料庫間進行資料的傳遞。
配置虛擬機器
HDFS由java編寫,需要jdk支援
docker官方文件要求必須執行在Linux kernel 3.8以上,所以需要安裝在Centos7或者Ubantu系統上。
yum install lrzsz #安裝上傳下載元件
uname –a #檢查當前Linux核心版本
查詢結果:Linux tdocker 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
配置IP地址
修改配置檔案
cd /etc/sysconfig/network-scripts #進入網路配置目錄
dir ifcfg* #找到網路卡配置檔案
ifcfg-eno16777736 ifcfg-lo
vi ifcfg-eno16777736
配置檔案內容
TYPE=Ethernet
BOOTPROTO=static #改成static,針對NAT
NAME=eno16777736
UUID=4cc9c89b-cf9e-4847-b9ea-ac713baf4cc8
DEVICE=eno16777736
ONBOOT=yes #開機啟動此網路卡
IPADDR=192.168.163.30 #固定IP地址
NETMASK=255.255.255.0 #子網掩碼
GATEWAY=192.168.163.2 #閘道器和NAT自動配置的相同,不同則無法登入
DNS1=192.168.163.2 #和閘道器相同
測試
centos7 命令發生巨大變化
ip addr #檢視IP地址 ip add
service network restart #重啟網路
systemctl restart network.service #重啟網路centos7
vi /etc/hosts #127.0.0.1 dredis
hostname dreids #注意必須修改機器名hostname
ping www.baidu.com #如果出現baidu的ip地址則表示網路連通
配置域名解析
1、windows配置
C:\Windows\System32\drivers\etc\hosts
192.168.163.129 hadoop01
192.168.163.130 hadoop02
192.168.163.131 hadoop03
2、linux虛擬機器配置hosts
vi /etc/hosts
192.168.163.129 hadoop01
192.168.163.130 hadoop02
192.168.163.131 hadoop03
hostname hadoop01 #修改每臺伺服器的機器名,必須
3、重啟網路
/etc/init.d/network restart
或者
service network restart
4、ssh免登陸
在虛擬機器中Terminal中執行下面語句
ssh-keygen #三次回車即可
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.163.130 #複製金鑰
ssh 192.168.163.130
5、安裝jdk配置環境變數
zk首先需要安裝jdk環境。 mkdir /usr/local/src/java #按習慣使用者自己安裝的軟體存放到/usr/local/src目錄下 上傳jdk tar包 #利用SSH工具軟體上傳檔案 tar -xvf jdk-7u51-linux-x64.tar.gz #解壓壓縮包 配置環境變數 1)vi /etc/profile 2)在尾行新增 #set java environment JAVA_HOME=/usr/local/src/java/jdk1.7.0_51 JAVA_BIN=/usr/local/src/java/jdk1.7.0_51/bin PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPATH 儲存退出 3)source /etc/profile 使更改的配置立即生效 4)java -version 檢視JDK版本資訊。如顯示1.7.0證明成功。
6、關閉防火牆
systemctl stop firewalld.service #關閉防火牆服務 systemctl disable firewalld.service #禁止防火牆開啟啟動 或者 systemctl restart iptables.service #重啟防火牆使配置生效 systemctl enable iptables.service #設定防火牆開機啟動 檢查防火牆狀態 [root@hadoop01 ~]# firewall-cmd --state #檢查防火牆狀態 not running #返回值,未執行
Zookeeper安裝配置
在Zookeeper叢集環境下只要一半以上的機器正常啟動了,那麼Zookeeper服務將是可用的。因此,叢集上部署Zookeeper最好使用奇數臺機器,這樣如果有5臺機器,只要3臺正常工作則服務將正常使用。
ZooKeeper介紹
ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分散式同步、組服務等。ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。
官網:http://www.apache.org/dist/zookeeper/ cd /usr/local/src #安裝檔案根目錄 mkdir zk #安裝路徑 tar -xvf zookeeper-3.4.8.tar.gz #解壓 cd zookeeper-3.4.8 #進入目錄 mkdir log #建立日誌檔案路徑 mkdir data #建立資料檔案路徑,預設/tmp/zookeeper下 cd data #進入資料目錄 vi myid #建立myid檔案,內容1對應zoo.cfg中配置的server.1範圍:1~255之間的整數,在叢集中必須唯一 cd .. #退到上級目錄 cd conf #進入配置目錄 cp zoo_sample.cfg zoo.cfg #複製模板檔案
tickTime=2000 #tickTime心跳時間, clientPort=2181 #訪問埠 dataDir=/usr/local/src/zk/zookeeper-3.4.8/data #設定日誌路徑 dataLogDir=/usr/local/src/zk/zookeeper-3.4.8/log #增加設定日誌路徑 server.1=hadoop01:2888:3888 #叢集最少3個節點,可按機器名 server.2=hadoop02:2888:3888 #2888指follower連leader埠 server.3=hadoop03:2888:3888 #3888指定選舉的埠
Centos6.5 /sbin/iptables -I INPUT -p tcp --dport 2181 -j ACCEPT #開啟埠 /etc/rc.d/init.d/iptables save #修改生效 /etc/init.d/iptables status #檢視配置 Centos7 firewall-cmd --zone=public --add-port=2181/tcp --permanent #開埠 firewall-cmd --zone=public --add-port=2888/tcp --permanent #開埠 firewall-cmd --zone=public --add-port=3888/tcp --permanent #開埠 firewall-cmd --reload #執行 firewall-cmd --zone=public --list-ports #檢視開啟埠 注:關閉防火牆更徹底,要開啟埠則所有的遠端訪問埠都類似上面必須開啟
sh bin/zkServer.sh start #啟動ZK服務 sh bin/zkServer.sh stop #停止ZK服務 sh bin/zkServer.sh restart #重啟ZK服務
[root@localhost conf]# jps 5863 Jps 2416 QuorumPeerMain #QuorumPeerMain是zookeeper程式,啟動正常
sh bin/zkServer.sh status #檢視ZK狀態 檢視結果:叢集中只有一個leader,其他都是follower [root@localhost bin]# ./zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/src/zk/zookeeper-3.4.8/bin/../conf/zoo.cfg Mode: leader [root@localhost bin]# ./zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/src/zk/zookeeper-3.4.8/bin/../conf/zoo.cfg Mode: follower 常見錯誤: Error contacting service. It is probably not running. 如果出現上面提示,請檢查配置檔案或者防火牆是否放行2181/2888/3888埠 [root@localhost bin]# ./zkServer.sh stop [root@localhost bin]# ./zkServer.sh start-foreground 日誌啟動方式 注意,如果啟動時拒絕訪問,檢查是否防火牆埠都開啟,如果開啟則都先啟動,再看。某個節點沒啟動,當然訪問是被拒絕。
[root@localhost bin]# ./zkCli.sh -server hadoop01:2181
[zk: localhost:2181(CONNECTED) 1] ls / [dubbo, zookeeper]
安裝HDFS
cd /usr/local/src #進入目錄 mkdir hadoop #建立目錄 tar -xvf hadoop-2.7.1.tar.gz #上傳檔案
vi etc/hadoop/hadoop-env.sh #JDK安裝目錄,雖然系統配置了JAVA_HOME,但有時無法正確識別,最後進行配置 export JAVA_HOME=/usr/local/src/java/jdk1.7.0_51/ #指定hadoop的配置檔案目錄,不執行hadoop可以不指定 export HADOOP_CONF_DIR=/usr/local/src/hadoop/hadoop-2.7.1/etc/hadoop
vi etc/hadoop/core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.163.129:9000</value> </property> <!--注意:用來指定臨時存放目錄,否則預設的系統的臨時目錄當重啟hadoop時會被刪除,影響HDFS下的檔案 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/src/hadoop/hadoop-2.7.1/tmp</value> </property> <!--執行zookeeper地址--> <property> <name>ha.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value> </property> </configuration>
vi etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.namenode.rpc-address</name> <value>hadoop01:9000</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
vi etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.namenode.rpc-address</name> <value>hadoop01:9000</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
將mapred-site.xml.template複製一份並將名稱修改為mapred-site.xml cp mapred-site.xml.template mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop01</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
vi slaves
hadoop01 #將localhost改為hostname名
配置hadoop的環境變數:
#set hadoop env
HADOOP_HOME=/usr/local/src/hadoop/hadoop-2.7.1/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
bin/hdfs namenode –format
看到上面的successfully格式化成功,檔案在/tmp/hadoop-root/dfs/name下
注意:可能失敗,jps檢查不到namenode,再次格式化,如果還不行檢查配置檔案。
sbin/start-dfs.sh
#停止服務stop-dfs.sh
也可以執行sbin/start-all.sh啟動hadoop,其中就包括hdfs。它會多啟動兩個服務:nodeManager和ResourceManager。執行jps就應該顯示6個服務,就代表啟動成功。
檢查服務是否正常:
1、可以通過瀏覽器直接訪問:http://192.168.163.129:50070/
2、如下圖
1、可以用jps檢視後臺java程式,確保hdfs的程式都正常啟動 由於重新格式化系統可能出現某些程式不能啟動,解決方法是先停止服務,刪除rm -fr /tmp/hadoop-root 下name,data等節點資料,重新啟動服務 2、localhost: ssh: Could not resolve hostname localhost: Name or service not …… 在/etc/profile中進行配置 #set hadoop env HADOOP_HOME=/usr/local/src/hadoop/hadoop-2.7.1/ export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin 3、namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured. [root@hadoop01 hadoop-2.7.1]# vim etc/hadoop/hdfs-site.xml <property> <name>dfs.namenode.rpc-address</name> <value>192.168.163.129:9000</value> </property> 3、put: Cannot create file/test/letter.txt._COPYING_. Name node is in safe mode. 執行下面的命令 bin/hadoop dfsadmin -safemode leave
http://192.168.163.129:50070/
執行命令很慢,執行時稍等片刻
bin/hdfs dfs -mkdir /user #建立user目錄
bin/hdfs dfs -put /root/install.log /use r #上傳檔案
bin/hdfs dfs –ls / #檢視根目錄
bin/hdfs dfs -ls /user #列目錄
http://192.168.163.129:50070/
注意:埠50070或者要關閉防火牆