一.大數據
廣義大數據:以hadoop軟件為主的生態圈(Sqoop、Flume、Spark、Flink、Hbase、Kafka和cdh環境)
狹義大數據:hadoop軟件本身,開源的(在gitlab上可以看到源代碼和地址)
二.組成
Hadoop由以下三個部分組成:
1.hdfs? 存儲數據(主要是網盤存儲)
2.mapreduce? 計算作業(生產上不使用,但設計理念指導著其他框架)
3.yarn? 資源(CPU、內存memory)和作業的調度
實際上大數據也是這三個東西:
1.存儲:hdfs、hbase、kudu
2.計算:mapreduce、spark、flink(其中spark和flink是重中之重)
3.資源和作業的調度:yarn
例:假如有100臺機器(電腦),有一個很大的計算作業,100G的數據
? ①首先需要存儲.但是一臺機器存不下去,那么就需要把這些數據分開存進這100臺機器,這時候hdfs會把文件切割,進行分布式存儲(讀的時候會自動拼接)。
? ②計算(作業),可以跑在其中某臺或幾臺,計算時就需要從hdfs存儲的資源里抽取調度,通過集群光纖傳輸到計算機的機器上,計算完成后又會把結果再次執行回寫到存儲上面(這里的存儲可以是外部存儲)。
三.hadoop的安裝部署
1.版本:hadoop-3.2.2(【注意】:下載二進制的binary,不要下載源代碼)
2.要學會看官方文檔:Apache Hadoop 3.3.1 – Hadoop: Setting up a Single Node Cluster.(注意版本喲)
(一).準備工作
1.官網下載壓縮包:Apache Downloads
2.rz 上傳hadoop壓縮包到Linux(一般上傳到root用戶的/tmp目錄,因為這個目錄有777權限,在這個目錄里沒有權限的煩惱)
3.在Linux系統里創建一個用戶hadoop001并在這個用戶下創建以下文件夾:
useradd hadoop001? #新建用戶hadoop001
su - hadoop001? #切換到該用戶下
mkdir sourecode software app log lib data tmp shell app.bak.1 app.bak.2
sourcecode //存放源代碼;software //存放安裝包;app //解壓后的目錄;log //日志目錄;data //數據目錄;lib //存放第三方jar包;tmp //臨時目錄;app.bak.1和app.bak.2用于備份
【問題】:為什么要自己建立一個/tmp目錄,而不使用root用戶下自帶的/tmp目錄?
? 答:因為自帶的/tmp目錄會根據當前版本特性,默認清除定期(30天)不訪問的內容。
4.把安裝包從root用戶移動到用戶hadoop001
mv /tmp/hadoop-3.2.2.tar.gz /home/hadoop001/software
此時報錯:Operation not permitted? 原因:盡管自帶的/tmp目錄有777權限,但是新建的用戶hadoop001對hadoop-3.22.tar.gz的操作還是有權限限制的,所以不能移動。
? 解決方法一:賦予新用戶hadoop001權限后再執行上述操作。
? 解決方法二:退出到root用戶,再執行:mv /tmp/hadoop-3.2.2.tar.gz /home/hadoop001/software
5.在root用戶下賦予用戶hadoop001的software目錄下所以的權限:
? ? chown hadoop001:hadoop001 /home/hadoop001/software/*
(二).hadoop的軟連接
1.切換到用戶hadoop001的software目錄解壓hadoop壓縮包到~/app目錄:
? tar -xzvf hadoop-3.2.2.tar.gz -C /home/hadoop001/app
2.進入到?/home/hadoop001/app做一個軟連接:
? ln -s hadoop-3.2.2 hadoop
軟連接的好處:
①版本切換,只需要去shell腳本配置hadoop的名字即可.
②小盤轉大盤(最后要查看用戶和權限,然后啟動服務)
3.cd /home/hadoop001/app/hadoop查看,關心以下目錄:
①bin? 命令執行腳本(大部分的大數據項目解壓后都有bin目錄)
②sbin? 啟動或停止服務的腳本
③etc? 配置文件(部分大數據項目解壓后沒有etc目錄,而是生成config目錄)
4.看官網,了解三種模式
①Local (Standalone) Mode 本地模式 ,不啟動進程,實際工作中從來沒用過[單個java進程]
②Pseudo-Distributed Mode? 偽分布式 ,啟動進程 單個進程(老大 小弟),學習
③Fully-Distributed Mode? ? ? 集群模式 , 啟動多個進程(2個老大,多個小弟),生產 。
[考點]:Hadoop has been demonstrated on Linux clusters with 2000 nodes.
Hadoop 的進程在集群中最多的正常的數量級可以部署在2000臺機器中(可以認為它有2000個小弟)
要求的軟件:Java 一般用Java 8(jdk 1.8.0_301),在生產部署時一定要注意java的版本(生產部署時一定要注意其版本不在該問題版本列表中Hadoop Java Versions - Hadoop - Apache Software Foundation(這個網站是專門處理issue的)[注意]:凡是看到“組件名稱-數字”,比如HADOOP-16795、SPARK-2908,表明該組件是有問題的,是存在ERROR的)
(三).Java安裝(jdk 1.8.0_301)
[參考mysql里jdk的安裝部署(后期更新貼網址)]
1.解壓(root用戶下)??
2. mkdir -p /usr/java(這個目錄是固定的,注意養成習慣)
? ? ?mv jdk1.8.0_301 /usr/java/
? ? chown -R root:root? /usr/java/*? #修正權限
vi /etc/profile? ? ? #配置全局環境變量
? ? ? ? ?export JAVA_HOME=/usr/java/jdk1.8.0_301
? ? ? ? ?export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile? ?#使文件生效
which java? #檢驗配置java是否OK
(四).ssh
偽分布式和集群模式都需要ssh
ssh:遠程登錄到目標地址,可能還會執行命令 ssh hadoop001@comerdata001 date
【考題】:
1.從A機器跳到B機器遠程登錄,當前會話光標在哪里?
? 答:在B機器,因為已經到了B機器,是跳到了B機器的家目錄。
? 驗證:root目錄下,切到某個指定用戶,再ssh root@機器名
2.從A機器跳到B機器遠程登錄再執行命令,ssh hadoop001@comerdata001 date?當前會話光標在A機器還是B機器?
? 答:在A機器,因為執行命令結束后,會話也隨之結束,然后又跳回來了。
? 驗證:exit到某個指定用戶的家目錄下,再再ssh root@機器名 date(執行完結果打印到控制臺,然后又回到了當前目錄)
(五).配置JAVA_HOME
配置JAVA_HOME
cd app/hadoop/etc/hadoop
ll? (以.cmd結尾的是Windows下的執行文件;以.sh結尾的是Linux下的執行文件)
vi hadoop-env.sh 進入后在#JAVA_HOME=/usr/java/testing hdfs dfs -ls下面輸入:
? ? ?JAVA_HOME=/usr/java/jdk1.8.0_301(前面的#是注釋標志,一定要刪了哈,不然不會生效喲)
案例
測試一波:Local (Standalone) Mode下(只有程序啟動時,才會有程序進程,用作調試)? 單機模式: 無進程
cd /home/hadoop001/app/hadoop
mkdir input
cp etc/hadoop/*.xml input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar grep input output 'dfs[a-z.]+'? #官方提供的例子(grep:過濾;input:輸入的文件;output:過濾后的文件放這里;'dfs[a-z.]+' :過濾的條件)
[注]:'dfs[a-z.]+' :正則(“.”代表匹配除"\r\n"換行符之外的任意單個字符;“+”代表一次或多次匹配前面的字符或子表達式)參考:Java 正則表達式 | 菜鳥教程 (runoob.com)
ll? ? #運行結果:發現它自己創建了output文件夾
cd output
ll? #顯示_SUCCESS表示運行成功;part-r-00000存放運行結果
cat part-r-00000? #顯示1 dfsadmin,表示dfsadmin出現了一次
(六).偽分布式部署
1.hadoop需要單個節點,每個進程獨立的跑起來。
2.root用戶下修正用戶、用戶組,避免權限錯誤:
chown -R hadoop001:hadoop001 hadoop/*
3.配置文件在/home/hadoop001/app/hadoop/etc/hadoop目錄下
配置core核心服務
cd?/home/hadoop001/app/hadoop/etc/hadoop
vi core-site.xml? #hdfs的訪問路徑
? 進入之后,【第一行、第二行千萬不要刪除!!!】
? 在<configuration>與</configuration>之間輸入:
? <property>
? ? ? ? <name>fs.defaultFS</name>
? ? ? ? <value>hdfs://comerdata001:9000</value>? #官網上是localhost:9000,改成當前機器名哈
? ? </property>
配置hdfs組件
vi hdfs-site.xml
? 進入之后,【第一行、第二行千萬不要刪除!!!】
? 在<configuration>與</configuration>之間輸入:
? <property>
? ? ? ? <name>dfs.replication</name>? #副本機制,默認為三份
? ? ? ? <value>1</value>? ?#(1臺機器)1個副本
? ? </property>
配置ssh不需要密碼啟動
1.配置ssh啟動不需要密碼
cd ~
ssh-keygen? ?#多個回車(如果忘了命令,輸入ssh按兩次Tab鍵)
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys? #將公鑰放進一個信任文件里(開始創建用戶時沒有配置密碼,但是想要被訪問就得配置公鑰[相當于一個密碼])
chmod 0600 ~/.ssh/authorized_keys #賦予600權限【重中之重】
2.建立連接
cd .ssh
chmod 600 authorized_keys #賦予600權限。ssh登錄時仍然需要密碼(所以賦予600權限超級重要)
ssh comerdata001? #用當前光標所在的用戶去訪問ssh(等價于ssh hadoop001@comerdata001)
第一次建立連接時,需要輸入yes哈
3.格式化
為什么要格式化??
答:①hdfs分布式文件存儲部署在Linux環境中,而hdfs有自己約定的文件格式,所以一定要格式化去適應Linux環境;②格式化會生成一些初始的目錄配置。
cd ~/app/hadoop
bin/hdfs namenode -format? #格式化完成后,文件存儲在系統自帶的/tmp目錄
顯示:Storage directory /tmp/hadoop-hadoop001/dfs/name has been successfully formatted.說明格式化成功
4.啟動
sbin/start-dfs.sh
①Namenode 名稱節點,存儲源數據,啟動在當前機器 老大
②Datanode 數據節點,存儲數據內容,啟動在localhost 小弟
③Secondary Namenode 如果沒有配置,啟動在localhost,但是配置后也啟動在當前機器 老二
“老大”被掛掉,“老二”上位。但是“老二”“能力不足”有局限性:因為“老二”去同步“老大”的數據并不是實時備份,而是每隔一小時備份一次。“老大”被掛掉,“老二”上位,數據可能會丟失,這樣局限性很大。比如“老大”11:30出事了,“老二”上位只有11:00之前的數據。所以生產上一般不要“老二”,而是用另一個實時備份的“老大”,等“老大”一gg,新“老大”馬上接替它。
jps #查看服務有沒有啟動成功(這個很不保險,有可能是假象,建議還是以ps -ef| grep hadoop為準)
Web訪問Namenode
2.x 版本訪問Web:端口號:50070
3.x 版本訪問Web:端口號:9870
Windows打開瀏覽器,輸入http://外網ip:9870(or 50070)
如果是云主機,端口號要在云主機的安全組打開,Windows打開網頁需要關閉防火墻
關閉防火墻
? 可參考配置可訪問外網靜態IP(四)配置虛擬機IP及Windows "ping" - 簡書 (jianshu.com)
阿里云打開安全組
? 1.打開阿里云,點擊“云服務器ECS”,選擇所買的實例所在地區;
? 2.點擊左側菜單欄“網絡與安全”下的“安全組”,點擊“配置規則”;
? 3.選擇“入方向”配置:手動添加:
? ? ①端口范圍:9870/9870(從端口號9870到9870結束,即只允許9870訪問);
? ? ②授權對象:源:0.0.0.0/0,即允許所有IP訪問
? 4.刷新網頁就OK了。
案例
cd ~/app/hadoop
bin/hdfs dfs -mkdir /user? #創建目錄(bin/hdfs dfs:在當前系統運行跑一個文件系統命令,可以用bin/hadfs --help命令和bin/hdfs dfs --help命令查看命令幫助看看此命令的用法;“/”不是Linux下的目錄,而是hdfs自己存儲生成的目錄開始,Linux部署結束了是形成了自己的一套文件系統)
bin/hdfs dfs -ls / #查看hdfs自己文件系統的目錄
bin/hdfs dfs -mkdir /user/hadoop001
bin/hdfs dfs -mkdir input? #前面沒有輸入絕對路徑或當前路徑,其默認是在當前用戶所在的目錄下(家目錄)
bin/hdfs dfs -ls /user/hadoop001
bin/hdfs dfs -put etc/hadoop/*.xml input #將Linux里的/etc/hadoop下所有的.xml文件存放在hdfs環境input目錄下。
bin/hdfs dfs -ls /user/hadoop001/input
跑案例計算:
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar grep input output 'dfs[a-z.]+'
bin/hdfs dfs -get output output? #將文件從hdfs下載到Linux?
對比:
Windows與Linux之間:上傳rz 下載lz
Linux與hdfs之間:上傳-put 下載:-get
cd ~/app/hadoop/output/output
ll? ?#顯示_SUCCESS表示運行成功;part-r-00000存放運行結果
cat part-r-00000
【問題】:對比此處偽分布式cat part-r-00000和單機版cat part-r-00000,為什么運行程序一樣會出現兩種結果?
? (單機版結果:1 dfsadmin;而偽分布式多了1? ? ? ?dfs.replication)
? ?答:因為中途的.xml文件新增加了配置。