大數據學習入門到實戰教程,精心整理萬字長文入門,老奶奶看了都說學會了

白又白i 2021-08-15 21:13:23 阅读数:586

本文一共[544]字,预计阅读时长:1分钟~
教程 精心 整理 老奶奶 奶奶

這是我參與8月更文挑戰的第13天,活動詳情查看:8月更文挑戰

什麼是大數據

基本概念

在互聯網技術發展到現今階段,大量日常、工作等事務產生的數據都已經信息化,人類產生的數據量相比以前有了爆炸式的增長,以前的傳統的數據處理技術已經無法勝任,需求催生技術,一套用來處理海量數據的軟件工具應運而生,這就是大數據!

換個角度說,大數據是:

1、有海量的數據

2、有對海量數據進行挖掘的需求

3、有對海量數據進行挖掘的軟件工具(hadoop、spark、storm、flink、tez、impala…)

大數據在現實生活中的具體應用

電商推薦系統:基於海量的瀏覽行為、購物行為數據,進行大量的算法模型的運算,得出各類推薦結論,以供電商網站頁面來為用戶進行商品推薦

精准廣告推送系統:基於海量的互聯網用戶的各類數據,統計分析,進行用戶畫像(得到用戶的各種屬性標簽),然後可以為廣告主進行有針對性的精准的廣告投放

什麼是hadoop

hadoop中有3個核心組件:

分布式文件系統:HDFS —— 實現將文件分布式存儲在很多的服務器上

分布式運算編程框架:MAPREDUCE —— 實現在很多機器上分布式並行運算

分布式資源調度平臺:YARN —— 幫用戶調度大量的mapreduce程序,並合理分配運算資源

hdfs整體運行機制

hdfs:分布式文件系統

hdfs有著文件系統共同的特征:

  • 有目錄結構,頂層目錄是:/

  • 系統中存放的就是文件

  • 系統可以提供對文件的:創建、删除、修改、查看、移動等功能

hdfs跟普通的單機文件系統有區別:

  • 單機文件系統中存放的文件,是在一臺機器的操作系統中

  • hdfs的文件系統會橫跨N多的機器

  • 單機文件系統中存放的文件,是在一臺機器的磁盤上

  • hdfs文件系統中存放的文件,是落在n多機器的本地單機文件系統中(hdfs是一個基於linux本地文件系統之上的文件系統)

hdfs的工作機制:

1、客戶把一個文件存入hdfs,其實hdfs會把這個文件切塊後,分散存儲在N臺linux機器系統中(負責存儲文件塊的角色:datanode)<准確來說:切塊的行為是由客戶端决定的>

2、一旦文件被切塊存儲,那麼,hdfs中就必須有一個機制,來記錄用戶的每一個文件的切塊信息,及每一塊的具體存儲機器(負責記錄塊信息的角色是:namenode)

3、為了保證數據的安全性,hdfs可以將每一個文件塊在集群中存放多個副本(到底存幾個副本,是由當時存入該文件的客戶端指定的)

綜述:一個hdfs系統,由一臺運行了namenode的服務器,和N臺運行了datanode的服務器組成!

搭建hdfs分布式集群

hdfs集群組成結構:

安裝hdfs集群的具體步驟:

一、首先需要准備N臺linux服務器

學習階段,用虛擬機即可!

先准備4臺虛擬機:1個namenode節點 + 3 個datanode 節點

二、修改各臺機器的主機名和ip地址

主機名:hdp-01 對應的ip地址:192.168.33.61

主機名:hdp-02 對應的ip地址:192.168.33.62

主機名:hdp-03 對應的ip地址:192.168.33.63

主機名:hdp-04 對應的ip地址:192.168.33.64

三、從windows中用CRT軟件進行遠程連接

在windows中將各臺linux機器的主機名配置到的windows的本地域名映射文件中:

c:/windows/system32/drivers/etc/hosts
192.168.33.61 hdp-01
192.168.33.62 hdp-02
192.168.33.63 hdp-03
192.168.33.64  hdp-04
複制代碼

用crt連接上後,修改一下crt的顯示配置(字號,編碼集改為UTF-8):

配置linux服務器的基礎軟件環境

  • 防火牆

關閉防火牆:

service iptables stop
複制代碼

關閉防火牆自啟:

chkconfig iptables off
複制代碼
  • 安裝jdk:(hadoop體系中的各軟件都是java開發的)

1)利用alt+p 打開sftp窗口,然後將jdk壓縮包拖入sftp窗口

2)然後在linux中將jdk壓縮包解壓到/root/apps 下

3)配置環境變量:JAVA_HOME PATH

vi /etc/profile 在文件的最後,加入:

export JAVA_HOME=/root/apps/jdk1.8.0_60
export PATH=$PATH:$JAVA_HOME/bin
複制代碼

4)修改完成後,記得 source /etc/profile使配置生效

5)檢驗:在任意目錄下輸入命令:java -version 看是否成功執行

6)將安裝好的jdk目錄用scp命令拷貝到其他機器

7)將/etc/profile配置文件也用scp命令拷貝到其他機器並分別執行source命令

  • 集群內主機的域名映射配置

在hdp-01上,

vi /etc/hosts
複制代碼
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.33.61 hdp-01
192.168.33.62 hdp-02
192.168.33.63 hdp-03
192.168.33.64   hdp-04
複制代碼

然後,將hosts文件拷貝到集群中的所有其他機器上

scp /etc/hosts hdp-02:/etc/
scp /etc/hosts hdp-03:/etc/
scp /etc/hosts hdp-04:/etc/
複制代碼

補充

提示: 如果在執行scp命令的時候,提示沒有scp命令,則可以配置一個本地yum源來安裝

1、先在虛擬機中配置cdrom為一個centos的安裝鏡像iso文件

2、在linux系統中將光驅掛在到文件系統中(某個目錄)

3、mkdir /mnt/cdrom

4、mount -t iso9660 -o loop /dev/cdrom /mnt/cdrom

5、檢驗掛載是否成功:ls /mnt/cdrom

6、3、配置yum的倉庫地址配置文件

7、yum的倉庫地址配置文件目錄:

/etc/yum.repos.d

8、先將自帶的倉庫地址配置文件批量更名:

9、然後,拷貝一個出來進行修改

10、修改完配置文件後,再安裝scp命令:11、yum install openssh-clients -y

安裝hdfs集群

1、上傳hadoop安裝包到hdp-01

2、修改配置文件

要點提示 核心配置參數:

1)指定hadoop的默認文件系統為:hdfs

2)指定hdfs的namenode節點為哪臺機器

3)指定namenode軟件存儲元數據的本地目錄

4)指定datanode軟件存放文件塊的本地目錄

hadoop的配置文件在:/root/apps/hadoop安裝目錄/etc/hadoop/

1.修改hadoop-env.sh

export JAVA_HOME=/root/apps/jdk1.8.0_60
複制代碼

2.修改core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdp-01:9000</value>
</property>
</configuration>
複制代碼

3.修改hdfs-site.xml

<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/root/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/root/dfs/data</value>
</property>
</configuration>
複制代碼

4.拷貝整個hadoop安裝目錄到其他機器

scp -r /root/apps/hadoop-2.8.0 hdp-02:/root/apps/
scp -r /root/apps/hadoop-2.8.0 hdp-03:/root/apps/
scp -r /root/apps/hadoop-2.8.0 hdp-04:/root/apps/
複制代碼

5.啟動HDFS

所謂的啟動HDFS,就是在對的機器上啟動對的軟件

要點提示:要運行hadoop的命令,需要在linux環境中配置HADOOP_HOME和PATH環境變量
vi /etc/profile
export JAVA_HOME=/root/apps/jdk1.8.0_60
export HADOOP_HOME=/root/apps/hadoop-2.8.0
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
複制代碼

首先,初始化namenode的元數據目錄

要在hdp-01上執行hadoop的一個命令來初始化namenode的元數據存儲目錄

hadoop namenode -format
複制代碼
  • 創建一個全新的元數據存儲目錄

  • 生成記錄元數據的文件fsimage

  • 生成集群的相關標識:如:集群id——clusterID

然後,啟動namenode進程(在hdp-01上)

hadoop-daemon.sh start namenode

啟動完後,首先用jps查看一下namenode的進程是否存在

然後,在windows中用瀏覽器訪問namenode提供的web端口:50070

http://hdp-01:50070

然後,啟動眾datanode們(在任意地方)

hadoop-daemon.sh start datanode
複制代碼

** 用自動批量啟動脚本來啟動HDFS**

1)先配置hdp-01到集群中所有機器(包含自己)的免密登陸
2)配完免密後,可以執行一次 ssh 0.0.0.0
3)修改hadoop安裝目錄中/etc/hadoop/slaves(把需要啟動datanode進程的節點列入)
hdp-01
hdp-02
hdp-03
hdp-04
4)在hdp-01上用脚本:start-dfs.sh 來自動啟動整個集群
5)如果要停止,則用脚本:stop-dfs.sh
複制代碼

hdfs的客戶端操作

客戶端的理解

hdfs的客戶端有多種形式:

1、網頁形式

2、命令行形式

3、客戶端在哪裏運行,沒有約束,只要運行客戶端的機器能够跟hdfs集群聯網

文件的切塊大小和存儲的副本數量,都是由客戶端决定!

所謂的由客戶端决定,是通過配置參數來定的

hdfs的客戶端會讀以下兩個參數,來决定切塊大小、副本數量:

切塊大小的參數:dfs.blocksize

副本數量的參數:dfs.replication

上面兩個參數應該配置在客戶端機器的hadoop目錄中的hdfs-site.xml中配置

<property>
<name>dfs.blocksize</name>
<value>64m</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
複制代碼

hdfs命令行客戶端的常用操作命令

0、查看hdfs中的目錄信息

hadoop fs -ls /hdfs路徑
複制代碼

1、上傳文件到hdfs中

> hadoop fs -put /本地文件 /aaa
>
> hadoop fs -copyFromLocal /本地文件 /hdfs路徑 ## copyFromLocal等價於 put
>
> hadoop fs -moveFromLocal /本地文件 /hdfs路徑 ##
> 跟copyFromLocal的區別是:從本地移動到hdfs中
複制代碼

2、下載文件到客戶端本地磁盤

hadoop fs -get /hdfs中的路徑 /本地磁盤目錄

hadoop fs -copyToLocal /hdfs中的路徑 /本地磁盤路徑 ## 跟get等價

hadoop fs -moveToLocal /hdfs路徑 /本地路徑 ## 從hdfs中移動到本地

3、在hdfs中創建文件夾

hadoop fs -mkdir -p /aaa/xxx

4、移動hdfs中的文件(更名)

hadoop fs -mv /hdfs的路徑 /hdfs的另一個路徑

5、删除hdfs中的文件或文件夾

hadoop fs -rm -r /aaa

6、修改文件的權限

hadoop fs -chown user:group /aaa

hadoop fs -chmod 700 /aaa

7、追加內容到已存在的文件

hadoop fs -appendToFile /本地文件 /hdfs中的文件

8、顯示文本文件的內容

hadoop fs -cat /hdfs中的文件

hadoop fs -tail /hdfs中的文件

補充:hdfs命令行客戶端的所有命令列錶
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] <path> ...]
[-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] [-x] <path> ...]
[-expunge]
[-find <path> ... <expression> ...]
[-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
[-help [cmd ...]]
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touchz <path> ...]
[-truncate [-w] <length> <path> ...]
        [-usage [cmd ...]]
複制代碼

hdfs的java客戶端編程

==============

HDFS客戶端編程應用場景:數據采集

在windows開發環境中做一些准備工作:

1、在windows的某個路徑中解壓一份windows版本的hadoop安裝包

2、將解壓出的hadoop目錄配置到windows的環境變量中:HADOOP_HOME

開發代碼

1、將hdfs客戶端開發所需的jar導入工程(jar包可在hadoop安裝包中找到common/hdfs)

2、寫代碼

要點:要對hdfs中的文件進行操作,代碼中首先需要獲得一個hdfs的客戶端對象

Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hdp-01:9000"),conf,"root");
複制代碼

3、利用fs對象的方法進行文件操作

比如:

上傳文件—— fs.copyFromLocalFile(new Path("本地路徑"),new Path("hdfs的路徑"));

下載文件——fs.copyToLocalFile(new Path("hdfs的路徑"),new Path("本地路徑"))

項目實戰

需求描述:

在業務系統的服務器上,業務程序會不斷生成業務日志(比如網站的頁面訪問日志)

業務日志是用log4j生成的,會不斷地切出日志文件

需要定期(比如每小時)從業務服務器上的日志目錄中,探測需要采集的日志文件(access.log不能采),發往HDFS

注意點:業務服務器可能有多臺(hdfs上的文件名不能直接用日志服務器上的文件名)

當天采集到的日志要放在hdfs的當天目錄中

采集完成的日志文件,需要移動到到日志服務器的一個備份目錄中

定期檢查(一小時檢查一次)備份目錄,將備份時長超出24小時的日志文件清除

Timer timer = new Timer()
timer.schedual()
複制代碼

hdfs的核心工作原理

===========

namenode元數據管理要點

1、什麼是元數據?

hdfs的目錄結構及每一個文件的塊信息(塊的id,塊的副本數量,塊的存放比特置)

2、元數據由誰負責管理?

namenode

3、namenode把元數據記錄在哪裏?

namenode的實時的完整的元數據存儲在內存中;

namenode還會在磁盤中(dfs.namenode.name.dir)存儲內存元數據在某個時間點上的鏡像文件;

namenode會把引起元數據變化的客戶端操作記錄在edits日志文件中;

secondarynamenode會定期從namenode上下載fsimage鏡像和新生成的edits日志,然後加載fsimage鏡像到內存中,然後順序解析edits文件,對內存中的元數據對象進行修改(整合)

整合完成後,將內存元數據序列化成一個新的fsimage,並將這個fsimage鏡像文件上傳給namenode

上述過程叫做:checkpoint操作

提示:secondary namenode每次做checkpoint操作時,都需要從namenode上下載上次的fsimage鏡像文件嗎?

第一次checkpoint需要下載,以後就不用下載了,因為自己的機器上就已經有了。

補充:secondary namenode啟動比特置的配置

默認值 <property>
<name>dfs.namenode.secondary.http-address</name>
<value>0.0.0.0:50090</value>
</property>
複制代碼

把默認值改成你想要的機器主機名即可

secondarynamenode保存元數據文件的目錄配置:

默認值

 <name>dfs.namenode.checkpoint.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/namesecondary</value>
</property>
複制代碼

改成自己想要的路徑即可:/root/dfs/namesecondary

mapreduce快速上手

小案例:

統計HDFS的/wordcount/input/a.txt文件中的每個單詞出現的次數——wordcount

明白了一點:可以在任何地方運行程序,訪問HDFS上的文件並進行統計運算,並且可以把統計的結果寫回HDFS的結果文件中;

但是,進一步思考:如果文件又多又大,用上面那個程序有什麼弊端?

慢!因為只有一臺機器在進行運算處理!

如何變得更快?

核心思想:讓我們的運算程序並行在多臺機器上執行!

mapreduce運行平臺YARN

mapreduce程序應該是在很多機器上並行啟動,而且先執行map task,當眾多的maptask都處理完自己的數據後,還需要啟動眾多的reduce task,這個過程如果用用戶自己手動調度不太現實,需要一個自動化的調度平臺——hadoop中就為運行mapreduce之類的分布式運算程序開發了一個自動化調度平臺——YARN。

安裝yarn集群

yarn集群中有兩個角色:

主節點:Resource Manager 1臺

從節點:Node Manager N臺

Resource Manager一般安裝在一臺專門的機器上

Node Manager應該與HDFS中的data node重疊在一起

修改配置文件:

yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hdp-04</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
複制代碼

然後複制到每一臺機器上

然後在hdp-04上,修改hadoop的slaves文件,列入要啟動nodemanager的機器

然後將hdp-04到所有機器的免密登陸配置好

然後,就可以用脚本啟動yarn集群:

sbin/start-yarn.sh
複制代碼

停止:

sbin/stop-yarn.sh
複制代碼

啟動完成後,可以在windows上用瀏覽器訪問resourcemanager的web端口:

http://hdp-04:8088

看resource mananger是否認出了所有的node manager節點

運行mapreduce程序

首先,為你的mapreduce程序開發一個提交job到yarn的客戶端類(模板代碼):

描述你的mapreduce程序運行時所需要的一些信息(比如用哪個mapper、reducer、map和reduce輸出的kv類型、jar包所在路徑、reduce task的數量、輸入輸出數據的路徑)

將信息和整個工程的jar包一起交給yarn

然後,將整個工程(yarn客戶端類+ mapreduce所有jar和自定義類)打成jar包

然後,將jar包上傳到hadoop集群中的任意一臺機器上

最後,運行jar包中的(YARN客戶端類)

[[email protected] ~]# hadoop jar wc.jar cn.edu360.hadoop.mr.wc.JobSubmitter
複制代碼

QQ截圖20210726151159.png

我是**白又白i**,一名喜歡分享知識的程序媛️

如果沒有接觸過編程這塊的朋友看到這篇博客,發現不會編程或者想要學習的,可以直接留言+私我呀~【非常感謝你的點贊、收藏、關注、評論,一鍵四連支持】

版权声明:本文为[白又白i]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815211248054K.html