1. 報錯 Windows 上寫的腳本 拷貝到 Linux(比如 CentOS)系統時會出現。
bash: ./set_java_home.sh: /bin/bash^M: bad interpreter: No such file or directory
報錯原因
^M 是 Windows 的換行符(\r\n)
Linux 使用的是 Unix 格式的換行符(\n)
所以你的腳本第一行的 #!/bin/bash 實際上變成了:
#!/bin/bash^M
解決方法把腳本轉換為 Unix 格式
使用 dos2unix 命令
dos2unix set_java_home.sh
##如果沒有下面就是安裝命令
yum install dos2unix -y
2. 解決centos里面多版本java,統中默認的 Java(通過 alternatives 指定的)自動同步到 JAVA_HOME,以保證一致性。
#!/bin/bash# 配置你的 Java 安裝路徑(按你提供的內容)
JAVA8_PATH="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64"
JAVA11_PATH="/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64"# 參數校驗
if [[ $1 == "8" ]]; thenecho "🔄 正在切換到 Java 8..."sudo alternatives --set java $JAVA8_PATH/jre/bin/javasudo alternatives --set javac $JAVA8_PATH/bin/javacexport JAVA_HOME=$JAVA8_PATH
elif [[ $1 == "11" ]]; thenecho "🔄 正在切換到 Java 11..."sudo alternatives --set java $JAVA11_PATH/bin/javasudo alternatives --set javac $JAVA11_PATH/bin/javacexport JAVA_HOME=$JAVA11_PATH
elseecho "? 參數錯誤,請輸入 8 或 11,例如:"echo " source ./switch-java.sh 8"echo " source ./switch-java.sh 11"return 1
fi# 清理舊 PATH 中的 JAVA_HOME 相關路徑
export PATH=$(echo "$PATH" | awk -v RS=: -v ORS=: '/java/ {next} {print}' | sed 's/:$//')# 加入新 JAVA_HOME/bin
export PATH=$JAVA_HOME/bin:$PATH# 顯示結果
echo "? 已切換至 JAVA_HOME: $JAVA_HOME"
java -version
##到對應位置運行這個腳本,前面加上source,就是全局運行,不加的話就是在一個進程里面運行,檢查的時候可能檢查不到
source switch-java.sh 8
source switch-java.sh 11
##檢查命令
echo $JAVA_HOME
下圖是切換Java8的source scripts/switch-java.sh 8
下圖是切換java11的source scripts/switch-java.sh 11
設置重新啟動服務器,以后默認的環境變量中的java的版本
vim ~/.bashrc
##添加
# 每次登錄自動設置 Java 8 為默認(你自己上面腳本存放的位置)
source $HOME/scripts/switch-java.sh 8
或
# 每次登錄自動設置 Java 11 為默認$HOME指的是根目錄root
source $HOME/scripts/switch-java.sh 11
# 最后執行
source ~/.bashrc
Hadoop
安裝教程
官網鏈接:https://hadoop.apache.org/releases.html
不同的安裝包的區別
文件名 | 含義 |
---|---|
source | 源碼包,需要你自己編譯(不推薦初學者) |
binary | 官方編譯好的二進制包(?推薦) |
binary-aarch64 | 針對 ARM 架構的電腦(如蘋果 M1/M2、樹莓派) |
binary-lean | 精簡版本(一般不推薦) |
推薦下載的安裝包:Hadoop 3.3.6 binary
下載地址:https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
下載完成后上傳到服務器
我上傳的目錄是/usr/local
cd /usr/local/
tar -zxvf hadoop-3.3.6.tar.gz
mv hadoop-3.3.6 hadoop
執行完上述命令后Hadoop 安裝路徑是 /usr/local/hadoop
配置環境變量配置文件
vim ~/.bashrc
#把下面的內容寫到配置文件里面
#我的java已經配置了,不需要配置java了如圖
# Hadoop
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#讓配置文件生效重新加載
source ~/.bashrc
#測試是否生效,如下圖已經安裝完成
hadoop version
hadoop理解
干嘛用的:
是為了解決“單機無法處理超大數據”的問題,通過“分布式存儲(HDFS)+ 分布式計算(MapReduce)”來高效地處理海量數據。
用于存儲和處理超大規模數據(TB、PB 級別)。
原理:
1.把大文件切成小塊分布存儲在多臺機器上(HDFS)
2.把任務拆成小任務并行處理,最后匯總結果(MapReduce)
核心組件與原理圖解
Hadoop 核心原理組件解釋
組件 | 功能 |
---|---|
HDFS | 分布式文件系統,把大文件切成塊存到多臺機器,每塊默認保存 3 份(容錯) |
MapReduce | 分布式計算框架,把任務拆成 map → shuffle → reduce,分布式并行處理 |
YARN | 資源調度框架,決定哪些機器執行哪些任務 |
NameNode | HDFS 中的“總目錄”,保存文件結構、塊位置(元數據) |
DataNode | 實際存儲數據塊的節點 |
ResourceManager | 管理所有節點資源,分配任務 |
NodeManager | 每個節點的“本地資源控制器”,接收任務并執行 |
應用場景:分布式存儲和海量數據計算,用在“大數據”場景下。
場景 | 描述 |
---|---|
日志分析 | 網站、APP、大型平臺的用戶訪問日志分析(TB 級) |
數據倉庫(Hive) | 用 SQL 處理海量結構化數據 |
ETL 處理(+Sqoop) | 數據抽取(從 MySQL 導入)、轉換、加載 |
搜索引擎爬蟲 | 把抓取網頁分布式處理、存儲 |
圖像視頻處理 | 多節點同時處理圖片/視頻數據(如壓縮、轉碼) |
機器學習預處理 | 對大規模訓練數據進行 MapReduce 處理 |
互聯網企業分析系統 | 淘寶、百度、騰訊、頭條等早期都用了 Hadoop 搭建離線數據處理平臺 |
Hadoop優勢
優勢 | 說明 |
---|---|
高可擴展 | 加機器就能擴容(線性擴展) |
高容錯 | 自動備份副本,節點宕了也不會丟數據 |
大規模處理 | 支持 TB/PB 級別數據處理 |
高性價比 | 可用普通商用服務器構建分布式平臺 |
開源生態豐富 | Hive、Spark、HBase、Flink 都能集成 Hadoop 存儲 |
不適合的地方
不適合場景 | 說明 |
---|---|
實時計算(ms 級) | Hadoop 是離線批處理,延遲分鐘級 |
小數據場景 | 啟動 MapReduce 比處理本身還慢 |
高頻低延遲系統 | 比如金融交易系統、秒殺系統,不適合 Hadoop |
高并發 OLTP | Hadoop 不支持事務處理和高并發讀寫操作 |
運行模式
模式 | 是否需要配置 XML | 是否需要創建 tmp、namenode、datanode 等目錄 | 是否需要啟動服務 |
---|---|---|---|
1. 本地模式(Local Mode) | ? 不需要 | ? 不需要 | ? 不需要 |
2. 偽分布式模式 | ? 需要 | ? 必須創建 | ? 啟動 HDFS/YARN |
3. 真分布式模式 | ? 需要 | ? 必須創建(不同節點) | ? 啟動多節點服務 |
hadoop部署偽分布式
第一步創建 Hadoop 所需的工作目錄
mkdir -p /usr/local/hadoop/tmp
mkdir -p /usr/local/hadoop/hdfs/namenode
mkdir -p /usr/local/hadoop/hdfs/datanode
目錄 | 作用 |
---|---|
/usr/local/hadoop/tmp | Hadoop 運行時的臨時文件目錄(如鎖文件、緩存) |
/usr/local/hadoop/hdfs/namenode | 存儲 NameNode 元數據(如文件目錄結構、塊位置) |
/usr/local/hadoop/hdfs/datanode | 存儲 DataNode 的實際數據塊(HDFS 文件數據) |
NameNode 認為 /usr/local/hadoop/hdfs/namenode 是它的持久存儲位置。
DataNode 把數據塊寫入 /usr/local/hadoop/hdfs/datanode。
tmp 用來緩存、寫日志、寫運行時中間文件。
第 2 步:編輯配置文件
配置文件路徑:/usr/local/hadoop/etc/hadoop/
2.1. core-site.xml
vim /usr/local/hadoop/etc/hadoop/core-site.xml
內容:需要外部訪問配置hdfs://主機名稱:9000
<configuration><property><name>fs.defaultFS</name><value>hdfs://主機名稱(或者是你的ip注意要和下面的文件中的保持一致):9000</value></property><property><name>hadoop.tmp.dir</name><value>/usr/local/hadoop/tmp</value></property>
</configuration>
2.2 hdfs-site.xml
vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
內容:
<configuration><!-- 設置副本數為1(偽分布式) --><property><name>dfs.replication</name><value>1</value></property><!-- NameNode 存儲目錄 --><property><name>dfs.namenode.name.dir</name><value>file:/usr/local/hadoop/hdfs/namenode</value></property><!-- DataNode 存儲目錄 --><property><name>dfs.datanode.data.dir</name><value>file:/usr/local/hadoop/hdfs/datanode</value></property><!-- DataNode 注冊使用公網IP(重要) --><property><name>dfs.datanode.hostname</name><value>你自己的主機名稱或者是ip</value></property><!-- DataNode 與客戶端通信使用 hostname(IP) --><property><name>dfs.datanode.use.datanode.hostname</name><value>true</value></property><!-- 客戶端使用 hostname(IP) 訪問 DataNode --><property><name>dfs.client.use.datanode.hostname</name><value>true</value></property><!-- 開放 NameNode RPC(綁定到所有網卡) --><property><name>dfs.namenode.rpc-bind-host</name><value>0.0.0.0</value></property><!-- 可選:關閉主機名校驗,允許 IP 注冊 --><property><name>dfs.namenode.reject-unresolved-datanode-hostname</name><value>false</value></property></configuration>
2.3 mapred-site.xml
vim /usr/local/hadoop/etc/hadoop/mapred-site.xml
內容:
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property>
</configuration>
2.4 yarn-site.xml
vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
內容:
<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property>
</configuration>
第三步配置免密登錄
ssh-keygen -t rsa # 全部回車
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
ssh localhost # 確保不需要輸入密碼
第四步:格式化 HDFS(只做一次)
hdfs namenode -format
#后面如果再需要格式化需要關閉這兩個
stop-dfs.sh
stop-yarn.sh
第五步:啟動命令
#停止命令
stop-dfs.sh
#啟動命令
start-dfs.sh
start-yarn.sh
#jps用于列出當前系統中所有的HotSpot Java虛擬機進程
jps # 查看服務是否正常## 報錯
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
#你在用 root 用戶執行 start-dfs.sh 命令
#Hadoop 默認不允許你用 root 來啟動 HDFS 守護進程(安全考慮)## 下面是解決方法 以及其他命令
#創建用戶
useradd hadoop
passwd hadoop
#把Hadoop 安裝目錄權限改給 hadoop 用戶:
chown -R hadoop:hadoop /usr/local/hadoop
#給hadoop用戶賦予sudo權限(centos7)
usermod -aG wheel hadoop
#其他關于防火墻的命令可選
sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
#切換用戶
su - hadoop
vim ~/.bashrc #編輯,不同用戶不同的環境變量文件
#切換完用戶后從新配置java和hadoop的環境變量(如下圖)
#我Java的環境變量是一個腳本文件(Java8 和java11需要切換),根據自己的需求配置
#保存后再執行(讓配置文件生效)
source ~/.bashrc
#驗證是否生效
echo $JAVA_HOME
echo $HADOOP_HOME
which hadoop
總總結:hadoop是什么,是用來處理海量數據的,然后有兩大核心模塊,一個就是,分布式文件HDFS(Hadoop Distributed File System),里面有兩種節點NameNode和DataNode ,HDFS會把一個大文件分成塊(block默認大小是128MB)每個塊會有多個副本存在不同的服務器上(默認3個),具體的內容存在DataNode里面,而NameNode相當于DataNode的目錄。
hadoop操作上傳,下載,讀取文件的命令
#查看HDFS的根目錄
hdfs dfs -ls /
# 創建用戶目錄
hdfs dfs -mkdir -p /user/hadoop
# 創建臨時目錄(某些程序可能會用到)
hdfs dfs -mkdir /tmp
# 設置臨時目錄權限為 777(某些程序依賴)
hdfs dfs -chmod -R 777 /tmp上傳文件
hdfs dfs -put /本地路徑/文件名 /HDFS目標路徑
#列子
hdfs dfs -put /home/hadoop/files/劍來01.mp4 /user/hadoop/
#查看是否上傳成功
hdfs dfs -ls /user/hadoop/
# 查看文件塊和位置
hdfs fsck /user/hadoop/劍來01.mp4 -files -blocks -locations
輸出:
Status: HEALTHY
# ? 文件健康,未缺塊、未損壞Number of data-nodes: 1
# 📦 當前集群中只有1個 DataNode(單節點偽分布式)Number of racks: 1
# 📶 當前僅配置了1個機架(Rack)Total dirs: 0
# 📁 總共目錄數量為0(因為只檢查了一個文件)Total symlinks: 0
# 🔗 符號鏈接數量為0(HDFS中很少使用符號鏈接)Replicated Blocks:Total size: 2655188930 B# 📄 文件總大小約 2.65GBTotal files: 1# 📁 本次檢查的文件數量Total blocks (validated): 20 (avg. block size 132759446 B)# 📦 文件被切分為20個塊,每個塊平均約132MB(符合HDFS默認128MB)Minimally replicated blocks: 20 (100.0 %)# ? 所有塊至少有1個副本,符合設定的副本數Over-replicated blocks: 0 (0.0 %)# 📈 沒有副本數量超出配置的塊Under-replicated blocks: 0 (0.0 %)# 📉 沒有副本數量不足的塊Mis-replicated blocks: 0 (0.0 %)# ?? 塊沒有分布不合理(如所有副本都集中在同一節點)的問題Default replication factor: 1# 🔁 當前系統默認副本數為1(單節點無法設置更高)Average block replication: 1.0# 📊 所有塊平均有1個副本Missing blocks: 0# ? 沒有缺失的塊Corrupt blocks: 0# ? 沒有損壞的塊Missing replicas: 0 (0.0 %)# ? 所有副本都存在,沒有副本缺失Blocks queued for replication: 0# 📋 沒有等待復制的塊(說明副本充足)Erasure Coded Block Groups:Total size: 0 BTotal files: 0Total block groups (validated): 0Minimally erasure-coded block groups: 0Over-erasure-coded block groups: 0# ?? 未使用 Erasure Coding(糾刪碼),這是一種高級存儲方式,用于節省空間,當前未啟用# 查看集群副本默認配置
hdfs getconf -confKey dfs.replication
# 輸出文件大小
hdfs dfs -du -h /user/hadoop/
#下載
hdfs dfs -get /user/hadoop/劍來01.mp4 ./
#預覽內容
#查看文件的開頭
hdfs dfs -cat /user/hadoop/data1.txt | head
#查看結尾(日志)
hdfs dfs -tail /user/hadoop/log.txt
#查看前幾行
hdfs dfs -cat /user/hadoop/data2.csv | head -n 5
#過濾
hdfs dfs -ls /user/hadoop/ | grep '\.csv'
#查找
hdfs dfs -find / -name "*.csv"
#查找特定名字
hdfs dfs -find / -name "data2025-*.txt"
#刪除
hdfs dfs -rm /user/hadoop/劍來01.mp4
#用 hdfs dfs -ls 查看上傳了哪些文件
#用 -cat、-tail、head 查看內容判斷是不是你要的
#用 -du -h 看大小,或 grep / find 輔助篩選
Hadoop端口介紹
端口 | 類型 | 服務 | 用法 | 是否瀏覽器能訪問 |
---|---|---|---|---|
9000 | RPC通信端口 | NameNode | Hadoop 命令通信(如 put、get、ls) | ? 不行,后臺服務端口 |
9870 | Web UI | NameNode Web | 瀏覽 HDFS 目錄、查看塊位置 | ? 可以 |
9864 | Web UI | DataNode Web | 查看 DataNode 狀態和數據塊 | ? 可以 |
8088 | Web UI | YARN ResourceManager | 查看作業運行狀態 | ? 可以 |
hadoop安全模式
重新啟動的時候會進入到安全模式
# 查看安全模式狀態
hdfs dfsadmin -safemode get
#強制退出安全模式
hdfs dfsadmin -safemode leave
# 輸出示例:
# Safe mode is ON
# 或
# Safe mode is OFF