大數據與Hadoop
- hadoop是一種分析和處理海量數據的軟件平臺
- hadoop是一款開源軟件,使用JAVA開發
- hadoop可以提供一個分佈式基礎架構
Hadoop特點
- 高可靠性,高擴展性,高效性,高容錯性,低成本
Hadoop的核心組件
- HDFS: hadoop分佈式文件系統
- Mapreduce: 分佈式計算框架
- Yarn: 集羣資源管理系統
Hadoop模式
- 單機
- 僞分佈式
- 完全分佈式
部署Hadoop單機版
[root@ecs-hadoop1 ~]# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
[root@ecs-hadoop1 ~]# tar -zxvf hadoop-2.7.7.tar.gz
[root@ecs-hadoop1 ~]# mv hadoop-2.7.7 /usr/local/hadoop
修改hadoop的運行腳本文件指定java_home安裝目錄
[root@ecs-hadoop1 ~]# rpm -ql java-1.8.0-openjdk #列出軟件包安裝路徑
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/bin/policytool
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libawt_xawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libjawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libjsoundalsa.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libsplashscreen.so
/usr/share/applications/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64-policytool.desktop
/usr/share/icons/hicolor/16x16/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/24x24/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/32x32/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/48x48/apps/java-1.8.0-openjdk.png
[root@ecs-hadoop1 ~]# cd /usr/local/hadoop/
[root@ecs-hadoop1 hadoop]# vim etc/hadoop/hadoop-env.sh #修改環境腳本文件
修改25行 export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre" #指定java安裝路徑
修改33行 export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/usr/local/hadoop/etc/hadoop"} #指定hadoop配置文件路徑
[root@ecs-hadoop1 hadoop]# cd /usr/local/hadoop
[root@ecs-hadoop1 hadoop]# mkdir oo #創建統計目錄
[root@ecs-hadoop1 hadoop]# cp *.txt oo #收集數據材料
[root@ecs-hadoop1 hadoop]# ls oo
LICENSE.txt NOTICE.txt README.txt
[root@ecs-hadoop1 hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount oo xx
命令含義解釋:
./bin/hadoop 表示運行hadoop
jar 表示調用一個jar文件(程序員開發出來的jar文件)
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar jar文件路徑
wordcount 統計哪個單詞出現的次數最多
oo 表示要統計的目錄
xx 表示分析完的結果放哪裏
[root@ecs-hadoop1 hadoop]# ls #統計完成後就會出現一個xx的目錄,這裏存放這統計結果
bin include libexec NOTICE.txt README.txt share
etc lib LICENSE.txt oo sbin xx
[root@ecs-hadoop1 xx]# ls
part-r-00000 #表示處理完的結果文件 _SUCCESS #表示分析成功
僞分佈式介紹
僞分佈式和完全分佈式類似,僞分佈式主要用於學習和測試,幾乎是將所有角色都安裝在一臺主機上,使用本地磁盤
分佈式文件系統HDFS介紹
HDFS角色及概念
- Client: 切分文件,訪問HDFS,與namenode交互獲取文件位置信息,與Datanode交互讀取和寫入數據
- Namenode : Master節點,配置副本策略(存幾份),處理所有客戶端請求
- Secondarynode: 定期合併fsimages(文件映像)和fsedits(補丁),推送給namedone
- Datanode : 數據存儲節點,彙報存儲信息給namenode
搭建完全分佈式
首先搭建分佈式文件系統HDFS
基礎準備
- 禁用selinux
- 卸載firewalld
- 安裝java-1.8.0-openjdk-devel 和 java-1.8.0-openjdk
- 修改主機名映射文件
- 修改3個配置文件
配置主機名映射文件
[root@hadoop1 ~]# vim /etc/hosts
192.168.1.60 hadoop1
192.168.1.61 node-0001
192.168.1.62 node-0002
192.168.1.63 node-0003
部署密鑰(包括本機)要求不需要密碼就可以登錄其他節點
for i in hadoop1 node-0001 node-0002 node-0003
> do
> ssh-copy-id root@$i; done
> done
修改ssh配置文件(遠程連接時不需要輸入yes)
[root@hadoop1 ~]# vim /etc/ssh/ssh_config
在第60行添加 StrictHostKeyChecking no
:wq
[root@hadoop1 ~]# systemctl restart sshd
官方文檔地址 http://hadoop.apache.org/docs/r2.7.7/
修改hadoop的核心配置文件core-site
[root@hadoop1 ~]# cd /usr/local/hadoop/etc/hadoop/
[root@hadoop1 hadoop]# vim core-site.xml
<configuration> #所有的參數必須放在這裏面
<property>
<name>fs.defaultFS</name> #集羣使用什麼存儲介質
<value>hdfs://hadoop1:9000</value> #指定hdfs的namenode
</property>
<property>
<name>hadoop.tmp.dir</name> #指定數據存儲的根目錄
<value>/var/hadoop</value>
</property>
</configuration>
配置hdfs-site文件
[root@nn01 hadoop]# vim hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.http-address</name> #namenode的地址
<value>hadoop1:50070</value> #hadoop1必須能ping通
</property>
<property>
<name>dfs.namenode.secondary.http-address</name> #secondary namenode地址
<value>hadoop1:50090</value>
</property>
<property>
<name>dfs.replication</name> #副本數量(存幾份)
<value>2</value> #存兩份
</property>
</configuration>
修改slaves文件,指定node節點是誰
[root@nn01 hadoop]# vim slaves
node-0001 #必須能ping通
node-0002
node-0003
編寫palybook批量部署其他節點
[root@hadoop1 ~]# vim /root/hadoop.yml
---
- name: install hadoop
hosts: hadoop
tasks:
- name: 刪除防火牆
yum: name=firewalld-* state=removed
- name: 安裝java環境
yum: name=java-1.8.0-openjdk,java-1.8.0-openjdk-devel state=installed
- name: 安裝hadoop
synchronize:
src: /usr/local/hadoop #直接同步hadoop的目錄,hadoop後面不帶/就代表把hadoop目錄也同步過去
dest: /usr/local/
- name: 同步主機名映射文件
copy: src=/etc/hosts dest=/etc/hosts
- name: 同步配置文件 #後期修改配置文件時可以直接調用標籤
tags: sync_conf
template:
src: "{{ item }}"
dest: /usr/local/hadoop/etc/hadoop/
owner: root
group: root
mode: 0644
with_items:
- /usr/local/hadoop/etc/hadoop/hadoop-env.sh
- /usr/local/hadoop/etc/hadoop/core-site.xml
- /usr/local/hadoop/etc/hadoop/hdfs-site.xml
- /usr/local/hadoop/etc/hadoop/slaves
[root@hadoop1 ~]# ansible-playbook hadoop.yml --syntax-check
[root@hadoop1 ~]# ansible-playbook hadoop.yml
格式化
[root@hadoop1 hadoop]# mkdir /var/hadoop #創建hadoop的數據根目錄
[root@hadoop1 hadoop]# ./bin/hdfs namenode -format #格式化namenode
[root@hadoop1 hadoop]# ./sbin/start-dfs.sh #啓動hadoop
[root@hadoop1 hadoop]# jps #驗證角色
4388 NameNode
4682 Jps
4573 SecondaryNameNode
[root@hadoop1 hadoop]# ansible hadoop -m shell -a'jps' #查看節點角色
node-0001 | SUCCESS | rc=0 >>
21320 Jps
21166 DataNode
node-0003 | SUCCESS | rc=0 >>
21346 Jps
21192 DataNode
node-0002 | SUCCESS | rc=0 >>
21366 Jps
21212 DataNode
集羣驗證
[root@hadoop1 hadoop]# ./bin/hdfs dfadmin -report #查看各個節點信息
部署 Mapreduce和Yarn組件
在準備好的環境下給master (nn01)主機添加ResourceManager的角色,在node1,node2,node3上面添加NodeManager的角色
配置mapred-site
[root@hadoop01 ] # cd /usr/local/hadoop/etc/hadoop/
[root@hadoop01 hadoop]# mv mapred-site.xml.template mapred-site.xml
[root@hadoop01 hadoop]# vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name> #指定管理類
<value>yarn</value>
</property>
</configuration>
配置yarn-site
[root@hadoop1 hadoop]# vim yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name> #指定resourcemanager位置
<value>hadoop1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name> #計算框架
<value>mapreduce_shuffle</value> #名稱
</property>
</configuration>
同步配置
[root@hadoop1 hadoop]# for i in node-0001 node-0002 node-0003
> do
> scp /usr/local/hadoop/etc/hadoop/mapred-site.xml root@$i:/usr/local/hadoop/etc/hadoop/mapred-site.xml
> done
[root@hadoop1 hadoop]# for i in node-0001 node-0002 node-0003
> do
> scp /usr/local/hadoop/etc/hadoop/yarn-site.xml root@$i:/usr/local/hadoop/etc/hadoop/yarn-site.xml
> done
[root@hadoop1 hadoop]# ./sbin/start-yarn.sh #啓動yarn
驗證
[root@hadoop1 hadoop]# jps
2499 Jps
2390 SecondaryNameNode
2198 NameNode
1750 ResourceManager
1086 WrapperSimpleApp
[root@hadoop1 hadoop]# ansible hadoop -m shell -a'jps' #再次查看各個節點身份
node-0003 | SUCCESS | rc=0 >>
1671 NodeManager
2023 Jps
1864 DataNode
1102 WrapperSimpleApp
node-0001 | SUCCESS | rc=0 >>
1104 WrapperSimpleApp
1896 DataNode
1674 NodeManager
2026 Jps
node-0002 | SUCCESS | rc=0 >>
1896 DataNode
1096 WrapperSimpleApp
1674 NodeManager
2026 Jps
[root@hadoop1 hadoop]# ./bin/yarn node -list #查看yarn節點
20/07/05 19:30:33 INFO client.RMProxy: Connecting to ResourceManager at hadoop1/192.168.1.60:8032
Total Nodes:3
Node-Id Node-State Node-Http-Address Number-of-Running-Containers
node-0002:41311 RUNNING node-0002:8042 0
node-0003:32822 RUNNING node-0003:8042 0
node-0001:36311 RUNNING node-0001:8042 0
web訪問hadoop
http://hadoop1:50070/ #namenode
http://hadoop1:50090/ #secondory namenode
http://node(xx):50075/ #datanode (node1,node2,node3)
http://hadoop1:8088/ #resourcemanager
http://node(xx):8042/ #nodemanager (node1,node2,node3)
Hadoop的使用
案例1 Hadoop詞頻統計
- 在集羣文件系統裏創建文件夾
- 上傳要分析的文件到目錄中
- 分析上傳文件
- 展示結果
[root@hadoop1 ~]# cd /usr/local/hadoop/
[root@hadoop1 hadoop]# ./bin/hadoop fs -mkdir /input #創建目錄
[root@hadoop1 hadoop]# ./bin/hadoop fs -ls / #./bin/hadoop fs - 爲固定格式 後面跟命令
drwxr-xr-x - root supergroup 0 2020-07-05 19:49 /input
[root@hadoop1 hadoop]# ./bin/hadoop fs -touchz /file1 #創建文件
[root@hadoop1 hadoop]# ./bin/hadoop fs -ls /
-rw-r--r-- 2 root supergroup 0 2020-07-05 19:50 /file1
drwxr-xr-x - root supergroup 0 2020-07-05 19:49 /input
[root@hadoop1 hadoop]# ./bin/hadoop fs -get /file1 /root/ #從hdfs上下載文件
[root@hadoop1 hadoop]# ./bin/hadoop fs -put *.txt /input #從本地上傳文件到hdfs
[root@hadoop1 hadoop]# ./bin/hadoop fs -ls /input
Found 3 items
-rw-r--r-- 2 root supergroup 86424 2020-07-05 19:52 /input/LICENSE.txt
-rw-r--r-- 2 root supergroup 14978 2020-07-05 19:52 /input/NOTICE.txt
-rw-r--r-- 2 root supergroup 1366 2020-07-05 19:52 /input/README.txt
[root@hadoop1 hadoop]# ./bin/hadoop jar \
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /input /output #hadoop集羣分析大數據,hadoop集羣/input裏的數據存到hadoop集羣/output下
[root@hadoop1 hadoop]# ./bin/hadoop fs -ls /output #查看分析完的目錄
Found 2 items
-rw-r--r-- 2 root supergroup 0 2020-07-05 20:02 /output/_SUCCESS
-rw-r--r-- 2 root supergroup 30290 2020-07-05 20:02 /output/part-r-00000
[root@hadoop1 hadoop]# ./bin/hadoop fs -get /output/part-r-00000 . #將統計完的文件下載到本地
[root@hadoop1 hadoop]# ./bin/hadoop fs -cat /output/part-r-00000 #或者直接使用cat查看結果文件
也可以利用web網站查看分析的目錄文件(但是統計完的文件需要下載才能看)
HDFS增加節點
- 修改/etc/hosts
- 同步配置文件/usr/local/hadoop
- 卸載防火牆,禁用selinux
- 拷貝公鑰給新的節點
- 啓動節點 Datenode
- 設置帶寬(爲新節點分配數據)
- 在master主節點查看
[root@hadoop1 ~]# vim /etc/hosts
192.168.1.60 hadoop1
192.168.1.61 node-0001
192.168.1.62 node-0002
192.168.1.63 node-0003
192.168.1.64 newnode
[root@hadoop1 ~]# ssh-copy-id root@newnode
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/slaves #添加指定新節點
node-0001
node-0002
node-0003
newnode
[root@hadoop1 ~]# ansible-playbook hadoop.yml #使用ansible部署新節點
去新的節點啓動datanode
[root@newnode hadoop]# ./sbin/hadoop-daemon.sh start datanode #啓動datenode
[root@newnode hadoop]# jps #驗證
1393 WrapperSimpleApp
9813 DataNode
9885 Jps
設置同步帶寬(爲新節點分配數據單位字節)
[root@newnode hadoop]# ./bin/hdfs dfsadmin -setBalancerBandwidth 60000000
返回hadoop1查看集羣成員
[root@hadoop1 hadoop]# ./bin/hdfs dfsadmin -report
當我們的數據量沒有預估的那麼大時就需要下線節點,節省資源
HDFS下線節點
- HDFS 刪除節點狀態
- 查看狀態 ./bin/hdfs dfsadmin -report
- Normal: 正常狀態
- Decommissioned in program: 數據正在遷移
- Decommissioned: 數據遷移完成
- 注意:僅當狀態變成Decommissioned才能down機下線
[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/slaves
//去掉之前添加的newdode
node1
node2
node3
[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
//在此配置文件裏面加入下面四行
<property>
<name>dfs.hosts.exclude</name> #表示下線節點
<value>/usr/local/hadoop/etc/hadoop/exclude</value> #下線節點的存放路徑
</property>
[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/exclude #將需要下線的節點寫入定義的配置文件
node4
導出數據
[root@hadoop1 hadoop]# ./bin/hdfs dfsadmin -refreshNodes #將下線主機的數據導入到其他主機上
[root@nn01 hadoop]# ./bin/hdfs dfsadmin -report #查看newnode顯示Decommissioned時纔可下線主機
下線機器
[root@newnode ~]# cd /usr/local/hadoop/
[root@newnode hadoop]#./sbin/hadoop-daemon.sh stop datanode //停止datanode
[root@node4 hadoop]# ./sbin/yarn-daemon.sh start nodemanager
//yarn 增加 nodemanager
[root@node4 hadoop]# ./sbin/yarn-daemon.sh stop nodemanager //停止nodemanager
stopping nodemanager
[root@node4 hadoop]# ./bin/yarn node -list
//yarn 查看節點狀態,還是有node4節點,要過一段時間纔會消失
Total Nodes:4
Node-Id Node-State Node-Http-Address Number-of-Running-Containers
node3:34628 RUNNING node3:8042 0
node2:36300 RUNNING node2:8042 0
node4:42459 RUNNING node4:8042 0
node1:39196 RUNNING node1:8042 0