大数据与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