文章目錄
- 1 安裝hadoop
- 2 hadoop集羣配置
- 2.1 集羣配置
- 2.1.2 集羣部署規劃
- 2.1.3 配置集羣
- 2.1.3.1 核心配置文件 core-site.xml
- 2.1.3.2 HDFS配置文件 hadoop-env.sh/hdfs-site.xml
- 2.1.3.3 YARN配置文件 yarn-env.sh/yarn-site.xml
- 2.1.3.4 MapReduce配置文件 mapred-env.sh/mapred-site.xml
- 2.1.3.5 修改slaves
- 2.1.4 集羣單節點啓動
- 2.1.5 SSH免密登陸配置
- 2.1.6 編寫集羣分發腳本 xsync
- 2.1.7 羣起集羣
- 2.1.8 集羣基本測試
- 2.1.9 集羣啓動/停止方式總結
- 2.2 項目經驗
- 3 遇到的問題
歡迎訪問筆者個人技術博客:http://rukihuang.xyz/
學習視頻來源於尚硅谷,視頻鏈接:尚硅谷大數據項目數據倉庫,電商數倉V1.2新版
,Respect!
1 安裝hadoop
1.1 將hadoop導入到/opt/software中
- 我使用xftp實現文件上傳
1.2 安裝hadoop
- 解壓
tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/
1.3 添加hadoop環境變量
- 在
/etc/profile.d/env.sh
中添加hadoop環境變量
##HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
- 使配置文件生效
source /etc/profile.d/env.sh
- 檢查環境變量是否生效
hadoop version
1.4 hadoop的目錄結構
2 hadoop集羣配置
2.1 集羣配置
2.1.2 集羣部署規劃
hadoop102 | hadoop103 | hadoop104 | |
---|---|---|---|
HDFS | NameNode DataNode | DateNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
2.1.3 配置集羣
- 需要配置的文件,在
/opt/module/hadoop-2.7.2/etc/hadoop
目錄下- core-site.xml
- hdfs-site.xml
- yarn-site.xml
- mapred-site.xml
- hadoop-env.sh
- yarn-env.sh
- mapred-env.sh
- slaves
2.1.3.1 核心配置文件 core-site.xml
- 修改
core-site.xml
vim core-site.xml
- 在
configuration
標籤下添加如下配置
<!-- 指定 HDFS 中 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<!-- 指定 Hadoop 運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
2.1.3.2 HDFS配置文件 hadoop-env.sh/hdfs-site.xml
- 修改
hadoop-env.sh
vim hadoop-env.sh
- 修改jdk環境變量路徑(25行)
export JAVA_HOME=/opt/module/jdk1.8.0_144
- 修改
hdfs-site.xml
vim hdfs-site.xml
- 在
configuration
標籤下添加如下配置
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 指定 Hadoop 輔助名稱節點主機配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
2.1.3.3 YARN配置文件 yarn-env.sh/yarn-site.xml
- 修改
yarn-env.sh
vim yarn-env.sh
- 修改jdk環境變量路徑(24行)
export JAVA_HOME=/opt/module/jdk1.8.0_144
- 修改
yarn-site.xml
vim yarn-site.xml
- 在
configuration
標籤下添加如下配置
<!-- Reducer 獲取數據的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 YARN 的 ResourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 日誌聚集功能 -->
<property>
<name>yarn.log-aggregation.enable</name>
<value>true</value>
</property>
<!-- 日誌保留設置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2.1.3.4 MapReduce配置文件 mapred-env.sh/mapred-site.xml
- 修改
mapred-env.sh
vim mapred-env.sh
- 修改jdk環境變量路徑(16行)
export JAVA_HOME=/opt/module/jdk1.8.0_144
- 修改
mapred-site.xml
vim mapred-site.xml
- 在
configuration
標籤下添加如下配置
<!-- 指定 MR 運行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 歷史服務器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 歷史服務器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
2.1.3.5 修改slaves
- 添加集羣主機名
vim slaves
hadoop102
hadoop103
hadoop104
2.1.4 集羣單節點啓動
- 如果集羣時第一次啓動,需要格式化NameNode,在
/opt/module/hadoop-2.7.2
目錄下操作
hadoop namenode -format
- 在hadoop102中啓動
NameNode
hadoop-daemon.sh start namenode
- 在hadoop102、hadoop103、hadoop104中分別啓動
DataNode
hadoop-daemon.sh start datanode
- 使用
jps
查看節點啓動情況
jps
2.1.5 SSH免密登陸配置
2.1.5.1 配置SSH
ssh 192.168.222.103
- 在詢問是否connecting時,輸入yes
2.1.5.2 無密鑰配置
- 免密登陸原理
- 生成公鑰和私鑰,在
~/.ssh
目錄下進行。敲3個回車
ssh-keygen -t rsa
- 將公鑰拷貝到要免密登錄的目標機器上
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
2.1.5.3 .ssh文件夾下文件功能解釋
文件夾 | 功能 |
---|---|
known_hosts | 記錄 ssh 訪問過計算機的公鑰(public key) |
id_rsa | 生成的私鑰 |
id_rsa.pub | 生成的公鑰 |
authorized_keys | 存放授權過得無密登錄服務器公鑰 |
2.1.6 編寫集羣分發腳本 xsync
2.1.6.1 scp(secure copy)安全拷貝
- scp可以實現服務器與服務器之間的數據拷貝。(from server1 to server2)
- 基本語法
命令 | 遞歸 | 要拷貝的文件路徑/名稱 | 目的用戶@主機:目的路徑/名稱 |
---|---|---|---|
scp | -r | pdir/fname | user@hadoophost:pdir/fname |
- 實例
# 將 hadoop101 中/opt/module 目錄下的軟件拷貝到 hadoop102 上
scp -r /opt/module root@hadoop102:/opt/module
2.1.6.2 rsync遠程同步工具
-
rsync 主要用於備份和鏡像。具有速度快、避免複製相同內容和支持符號鏈接的優點。
-
rsync 和 scp 區別:用 rsync 做文件的複製要比 scp 的速度快,rsync 只對差異文件做更
新。scp 是把所有文件都複製過去。
-
基本語法
-r
:遞歸-v
:顯示覆制過程-l
:拷貝符號鏈接
命令 | 遞歸 | 要拷貝的文件路徑/名稱 | 目的用戶@主機:目的路徑/名稱 |
---|---|---|---|
rsync | -rvl | pdir/fname | user@hadoophost:pdir/fname |
- 實例
#把 hadoop101 機器上的/opt/software 目錄同步到 hadoop102 服務器的 root 用戶 下的/opt/目錄
rsync -rvl /opt/software/ root@hadoop102:/opt/software
2.1.6.3 xsync集羣分發腳本 (~/bin/xsync)
-
需求:循環複製文件到所有節點的相同目錄下
-
創建
vim xsync
#!/bin/bash
#1 獲取輸入參數個數,如果沒有參數,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 獲取文件名稱
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 獲取上級目錄到絕對路徑
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 獲取當前用戶名稱
user=`whoami`
#5 循環
for((host=103; host<105; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
- 修改腳本xsync,使具有執行權限
chmod 777 xsync
- 執行分發腳本,回到
/opt/module
目錄
xsync hadoop-2.7.2/
2.1.7 羣起集羣
- 如果集羣是第一次啓動,需要格式化
NameNode
。注意格式化之前,一定要先停 止上次啓動的所有 namenode 和 datanode 進程,然後再刪除 data 和 log 數據。(/opt/module/hadoop-2.7.2
)
bin/hdfs namenode -format
- 啓動命令
- 注意:NameNode 和 ResourceManger 如果不是同一臺機器,不能在 NameNode 上啓 動 YARN,應該在 ResouceManager 所在的機器上啓動 YARN。
#老命令
sbin/start-all.sh
#新(推薦)
#啓動HDFS
sbin/start-dfs.sh
#啓動YARN
sbin/start-yarn.sh
- web端查看
NameNode
:http://hadoop102:50070/
2.1.8 集羣基本測試
2.1.8.1 上傳文件到集羣
- 上傳小文件(
/opt/module/hadoop-2.7.2
)
hdfs dfs -mkdir -p /user/ruki/input
hdfs dfs -put wcinput/wc.input /user/ruki/input
- 上傳大文件
bin/hadoop fs -put /opt/software/hadoop-2.7.2.tar.gz /user/ruki/input
2.1.8.2 HDFS文件存放路徑
/opt/module/hadoop-2.7.2/data/tmp/dfs/data
2.1.8.3 拼接
cat blk_1073741837>>tmp.file
2.1.8.4 下載
/opt/module/hadoop-2.7.2
bin/hadoop fs -get /user/atguigu/input/hadoop-2.7.2.tar.gz ./
2.1.9 集羣啓動/停止方式總結
2.1.9.1 各個組件逐一啓動/停止
- HDFS
hadoop-daemon.sh start namenode/datanode/secondarynamenode
hadoop-daemon.sh stop namenode/datanode/secondarynamenode
- YARN
yarn-daemon.sh start / stop resourcemanager / nodemanager
2.1.9.2 各個模塊啓動/停止(配置ssh爲前提)
- 整體啓動/停止HDFS
start-dfs.sh
stop-dfs.sh
- 整體啓動/定製YARN
start-yarn.sh
stop-yarn.sh
2.2 項目經驗
2.2.1 HDFS存儲多目錄
- 在
hdfs-site.xml
文件中配置多目錄,注意新掛載磁盤的訪問權限問題。
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///hd2/dfs/ data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4</value>
</property>
- 開啓目錄數據均衡
/opt/module/hadoop-2.7.2
- 對於參數 10,代表的是集羣中各個節點的磁盤空間利用率相差不超過 10%
bin/start-balancer.sh –threshold 10
- 停止數據均衡命令
bin/stop-balancer.sh
2.2.2 支持LZO壓縮配置
- 將編譯好的
hadoop-lzo-0.4.20.jar
放入hadoop-2.7.2/share/hadoop/common/
- 同步至hadoop103、hadoop104
xsync hadoop-lzo-0.4.20.jar
- 在
core-site.xml
新增配置 (/opt/module/hadoop-2.7.2/etc/hadoop
)
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec
</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
- 同步
core-site.xml
到 hadoop103、hadoop104
xsync core-site.xml
- 重啓集羣(
/opt/module/hadoop-2.7.2/bin
)
start-dfs.sh
stop-dfs.sh
2.2.3 LZO創建索引
- 創建 LZO 文件的索引,LZO 壓縮文件的可切片特性依賴於其索引,故我們需要手動爲 LZO 壓縮文件創建索引。若無索引,則 LZO 文件的切片只有一個。
2.2.4.1 測試
- 將 bigtable.lzo(214M)上傳到集羣的根目錄
hadoop fs -mkdir /input
hadoop fs -put bigtable.lzo /input
- 對上傳的lzo文件上傳索引
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /input/bigtable.lzo
- 執行wordcount
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output2
2.2.4 基準測試
2.2.4.1 HDFS寫
- 寫入10個128mb的文件
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB
2.2.4.2 HDFS讀
- 讀取10個128mb的文件
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB
2.2.4.3 刪除測試生成的數據
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -clean
3 遇到的問題
3.1 NameNode沒有啓動成功
- 在hadoop102機器上使用
jps
命令,發現NameNode沒有啓動,導致無法使用hadoop命令 - 解決方式:Hadoop HDFS Namenode啓動不成功