一、環境準備java
1.一、安裝CentOS7node
1.二、安裝JDK7linux
tar -zxvf jdk-8u211-linux-x64.tar.gzmkdir /usr/java/ mv jdk1.8.0_211/ /usr/java/jdk18 alternatives --install /usr/bin/java java /usr/java/jdk18/bin/java 2
#配置JAVA環境變量(因爲openjdk會自動安裝一個java,使得咱們手動安裝的不生效,須要先手動修改)算法
alternatives --config java
而後輸入數字按回車,能夠選擇相應的java版本apache
vi /etc/profile
大寫G跳到文本最後,$能夠跳至本行的結尾,增長編程
export JAVA_8_HOME=/usr/java/jdk18 export JAVA_HOME=$JAVA_8_HOME export JRE_HOME=$JAVA_HOME/jre export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar上面三行爲添加java8的安裝路徑
:wq保存退出bash
source /etc/profile
#從新加載服務器
而後java -version與javac -version查看,兩個都能正常反饋,而且版本信息一致,就是java安裝成功了。網絡
1.三、配置免密訪問app
ssh-keygen //一路回車默認便可 ssh-copy-id {其餘機器的ip}
遠程其餘機器的時候,提示Are you sure you want to continue connecting (yes/no)?
按yes繼續,而後提示輸入目標主機的密碼。
而後ssh 其餘機器IP測試,若是沒有提示輸入密碼便可遠程登陸,操做完成。
1.四、編輯hosts表
vi /etc/hosts
(三臺都須要操做)
10.1.30.52 bigdata52 10.1.30.53 bigdata53 10.1.30.54 bigdata54
1.五、修改hostname
直接輸入hostname命令修改
hostname bigdata52 hostname bigdata53 hostname bigdata54
vi /etc/hostsname
(3臺分別設置爲5二、5三、54)
hostname bigdata52 hostname bigdata53 hostname bigdata54
重啓機器生效
二、安裝Hadoop
2.一、安裝Hadoop2.7.3
單臺初始化設置,設置完再拷貝到其餘機器,下載hadoop
wget http://apache.claz.org/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz
mv hadoop2.7.6 hadoop mv hadoop/ /usr/local/hadoop
vi /etc/profile
export HADOOP_HOME=/usr/local/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
保存(最後那行也須要,由於舊版本配置文件在hadoop/conf下,新版都在hadoop/etc/hadoop下面了,不少舊教程沒有這條,開啓會報錯。)
source /etc/profile
2.二、Hadoop配置文件修改
建議當一臺配置好以後,再將hadoop整個文件傳輸到另外2臺.
vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh
將export JAVA_HOME=$JAVA_HOME 修改成
export JAVA_HOME=/usr/java/jdk18
而後修改4個配置文件
cd /usr/local/hadoop/etc/hadoop
vi core-site.xml
<configuration> <!--配置HDFS主節點,namenode的地址,9000是RPC通訊端口--> <property> <name>fs.defaultFS</name> <value>hdfs://bigdata52:9000</value> </property> <!--配置HDFS數據塊和元數據保存的目錄,必定要修改--> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> </configuration>
vi hdfs-site.xml
<property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>bigdata53:50090</value> </property>
#配置了備用的namenode爲30.53
cp mapred-site.xml.template mapred-site.xml vi mapred-site.xml
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
vi yarn-site.xml
<property> <name>yarn.resourcemanager.hostname</name> <value>bigdata52</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
2.三、拷貝到其餘節點
scp -r hadoop root@10.1.30.53:/usr/local/hadoop scp -r hadoop root@10.1.30.54:/usr/local/hadoop
2.四、配置slave
vi /usr/local/hadoop/etc/hadoop/slaves
bigdata52 bigdata53 bigdata54
2.五、初始化命名
hdfs namenode -format
若是不是第一次格式化,格式化以前先刪除/usr/local/hadoop/下面的tmp、logs兩個目錄
2.六、啓動Hadoop
cd /usr/local/hadoop/sbin
啓動程序。
sh start-all.sh
使用jps能夠查看運行狀況。
10.1.30.52-namenode(master)+datanode
10.1.30.53-secondary-namenode+datanode
10.1.30.54-datanode
三、使用MapReduce進行wordcount
3.1wordcount(單詞統計)
測試僅使用Hadoop自帶的wordcount來進行測試。
hadoop fs -mkdir -p /usr/local/hadoop/input
#fs方式建立文件夾input,這個是集羣文件夾,直接操做系統ls看不到。注意後面都要使用全路徑,不然會報錯
cd /software
vi test.txt
而後隨便往裏面輸入寫內容,例如Hello World,Hello Hadoop,Hello Mapreduce三行內容
hadoop fs -put /software/test.txt /usr/local/hadoop/input
#把本地test.txt傳到集羣input文件夾
hadoop fs -ls /usr/local/hadoop/input
#查看input目錄結構
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount /usr/local/hadoop/input output
#運行wordcount,版本根據實際替換,output也是個文件夾
hadoop fs -ls output
#查看output目錄下面的文件
hadoop fs -cat output/part-r-00000
#查看輸出文件裏面保存的結果
3.2其餘例子(計算圓周率)
在mapreduce文件夾裏面還有不少例子能夠試用,例如圓周率計算。
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar pi 10 10
#計算圓周率,第一個10是運行10次map任務,第二個10是每一個map任務投擲次數,因此總投擲次數是10×10=100。
刪除提示已經存在的輸出文件夾
hadoop fs -rmr output
四、總結
4.1Hadoop與MapReduce的本質
按照個人理解,Hadoop是個軟件,本質上是一個分佈式計算的軟件,MapReduce只是Hadoop裏面的框架與方法論。
與負載均衡不一樣,負載均衡是對於不少個訪問請求,分攤到不一樣的服務器來處理/響應。而分佈式計算,是將一個很複雜的任務(可能須要很大量的CPU與內存計算資源)拆分(Map)成多個任務,每一個任務分別分攤到1臺服務器進行處理/計算,而後將全部服務器的計算結果彙總/合併(Reduce)成最終的結果,而後輸出。
由於能夠分佈式(並行)計算,因此計算節點能夠橫向擴容(scale out),理論上能夠無限節點橫向擴容,提供足夠多的計算資源去並行處理足夠複雜的任務,能夠大大提高計算性能與處理速度,減小計算等待時長。
4.2Hadoop的使用
與上面淺嘗則止的直接調用現成example案例不一樣。真正須要使用MapReduce,去完成個性化的任務,是須要編程的。
MapReduce只是個框架而已,具體須要實現的業務邏輯,是須要調用Map與Reduce裏面的類與方法,自行進行編寫的。
至少要編寫Mapper類、Reducer類,main函數,使用eclipse打包爲一個jar包,再使用hadoop執行的。
具體還須要學習java的編程語言與面向對象的編程方法,並非安裝以後,即插即用的。
4.3關於大數據的一些思考
隨着大數據的興起,不管懂仍是不懂的人,都喜歡著書立論說大數據如何厲害,如何神奇,有什麼做用。可是市面上的8~9成的書籍,都是告訴你什麼是大數據、大數據有什麼做用,而且喜歡將大數據的做用神化。可是書裏面歷來都不會涉及,如何使用大數據,採用什麼方法才能達到它說的做用,可能由於他們根本不知道。
書籍上面動不動就扯,你天天微博、朋友圈、淘寶、拼多多留下了好多數據,你的消費習慣、購買能力、飲食偏好、出入行蹤,造成了好多數據,而後經過大數據分析(又來了,來來去去就那麼一句,到底hadoop?mapreduce?spark?Hive?仍是咋的?你說啊,怎麼你不說了),就能畫出你的用戶畫像,你是怎麼樣的人,而後給你精準營銷,預測你的行動......(此處省略一萬字)
問題是,真的那麼神奇嗎?經過「大數據分析」這個黑盒子,真的可以無所不能嗎?答案固然是否認的。
若是你深刻本身動手用java寫過一個wordcount甚至更多的自定義分析實例出來,你就會發覺,使用大數據以前,你先須要:
1)你先要收集數據(可能經過寫爬蟲,從多個網站例如淘寶、京東、拼多多同時爬取商品信息過來,也可能經過其餘手段)
2)而後還須要多數據作預處理與清洗(過濾不須要的數據、去除重複的數據、按照統一的規範與格式轉換數據,如2019-07-13統一爲2019/07/13等)
要達到上面兩個目的,你須要本身最終想要什麼,須要分析什麼,什麼樣的數據與你分析的目標有關聯,可能對你最終的目標分析有幫助,即你須要知道須要什麼數據。
而不是書裏面說的,只要把亂七八糟的海量數據回來,扔進去大數據分析系統,系統就會自動像機器學習、深度學習、神經網絡那樣,幫你自動挖掘、分析、提煉,找到你要的東西分析結論,那是不可能的。
你必須知道你須要什麼,也須要寫好算法告訴系統如何去分析(這纔是重點)。
至此,數據準備完畢,你才能使用Hadoop,依照MapReduce框架:
1)編寫如何將任務拆開
2)編寫如何將計算結果整合
Hadoop只是幫你將原來1臺機器要算1000個小時的工做量,變爲並行計算,讓你能夠將1個大任務拆分爲1000個小任務,讓1000臺機器能夠同時幫你計算,1小時內算出而且彙總結果提供給你而已。只是幫你用分佈式計算,縮短整個計算週期而已。
因此大數據分析根本就不是直接將海量的數據灌進去黑盒子,而後大數據自動幫你挖掘,機器學習,自動分析,最終告訴你結果。這個是徹底的誤解。
大數據分析只是幫你在處理海量的數據的時候,將任務拆分,分佈式計算,用盡可能短的時間幫你分析出結果而已。