课程介绍
基本介绍大数据
4V特征
体积大:体积大
高速:数据生成速度快,存储速度快,处理速度快
多样化:数据的类型和来源。结构化、非结构化、半结构化数据
价值:低密度。体积大,有价值的数据相对较少
Hadoop平台特点
低成本、高可靠性、高效率、可扩展性
课程所需的环境
Vmware CentOS7
注:本课程Linux系统与其他课程分开
XShell、SecureCRT:连接虚拟机进行指令操作
winSCP:在Windows和Linux文件传输之间
notePad :文本编辑器
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-ie0Ddj5E-1647349327846)(C:\Users\ADMINI~1\AppData\Local\Temp\1614688009667.png)]
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-VMlg3n0y-1647349327847)(C:\Users\ADMINI~1\AppData\Local\Temp\1614688019165.png)]
参考资料
软件下载:
链接:https://pan.baidu.com/s/1sKVDY7ok_ke_v4VwqANCSw 提取码:doop
Linux基本操作
用户和组
root:超级用户进入后显示#
普通用户:hadoop,进入后显示$
用户切换指令:su 用户名
每个用户的主目录/home/用户名,root用户的主目录是/root
文件权限
r:读权限,w:写权限,x:执行权限
文件权限描述分为三组:
文件/目录创建者权限描述
2同组其他用户的权限描述
3其他组用户的权限描述
Hadoop平台简介
Hadoop起源
谷歌的三篇论文分别出现了HDFS,MapReduce,Yarn创始人是框架Dung Cutting
Hadoop生态圈
Hadoop核心组件
数据传输:Sqoop,Kafka,Flume
数据存储:HDFS,HBase
资源调度:Yarn
计算:MapReduce,Hive,Spark,Storm
协调者:Zookeeper
Hadoop安装
准备虚拟机环境
CentOS7安装
配置网络
目的:Linux虚拟机与Windows客户机互联互通,也就是说Linux能正常上网。
-
虚拟机网络连接方式:NAT
-
查看虚拟机虚拟网关地址:
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-gkARLFXl-1647349327848)(assets/1614924659625-1614924661270.png)]
图片中示例的网段为192.168.136.0,网关192.168.136.1
-
虚拟机IP地址设置
目的:静态设置虚拟机IP,集群中的每台电脑IP固定地址
规划:
master:192.168.136.11
slave1:192.168.136.12
slave2:192.168.136.13
配置IP地址:
vi指令解释: vi是指编辑文本文件/配置文件,vi打开并编辑文件。若该文件存在,则直接打开;若该文件不存在,则该指令将创建同名文件并打开,等待编辑。 注:使用vi如果要编辑指令打开配置文件,则需要在
键盘上敲击i,进入insert(插入)模式,此时可以修改文件。
#修改网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 提示:注意结合tab键使用。sysc tab键可自动补充sysconfig
完成以下配置:
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-UsHjM6Rh-1647349327848)(assets/1614926251701-1614926253479.png)]
#退出vi模式 Esc保存退出键:wq,然后回车;如果不保存,退出:q;强制退出:!q,文件内容不会保存。 #注意小写字母
-
重启网络服务
虚拟机网卡重新启动
systemctl restart network
注意:↑您可以帮助您快速找到以前输入的指令
-
网络测试
ping百度,退出ping测试,ctrl c
-
常见的网络问题
- 重启虚拟机,如果无法解决,尝试重启vmware
- ping看看网关地址,看能不能通过ping 192.168.136.2
- 网关能ping通后,看能不能ping通Windows机器的ip地址
- Windows能否ping通虚拟机IP地址
- 如果Windows如果与虚拟机不需要检查Windows配置
- 检查服务是否正常开放
- 检查Windows网络适配器
关闭防火墙
关闭防火墙,从启动项中删除自动重启。
#检查防火墙的状态 systemctl status firewalld #关闭防火墙 systemctl stop firewalld 禁止防火墙随机自启 systemctl disable firewalld
克隆虚拟机
为分布式Hadoop三台虚拟机创建在集群环境中。
虚拟机的基本说明:
#关闭虚拟机 shutdown -h now #重启虚拟机 reboot
选中虚拟机,右键,“管理”->创造完整的克隆:
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-lksrPQnX-1647349327848)(assets/1615249116553-1615249117697.png)]
克隆2次,得到三台虚拟机,分别为:
master:192.168.136.11
slave1:192.168.136.12
slave2:192.168.136.13
修改slave1和slave2的IP地址:
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-539RKwlP-1647349327849)(assets/1615249797435-1615249798462.png)]
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-Px4CKLXZ-1647349327849)(assets/1615249853048-1615249854399.png)]
重启网络服务,查看IP测试网络是否连是否连接。
SecureCRT软件连接
配置连接:
连接协议:SSH2
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-yRFdoMZi-1647349327849)(assets/1615250508925-1615250510797.png)]
修改会话选项:
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-VfRpPQyP-1647349327850)(assets/1615251181975-1615251183389.png)]
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-AWqoyMmx-1647349327850)(assets/1615251240924-1615251242029.png)]
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(imggqQIqyxQ-1647349327850)(assets/1615251335515-1615251337382.png)]
修改主机名
给虚拟机起个主机名,分别为master,slave1,slave2
指令(secureCRT中ctrl+alt+c复制指令,右键粘贴指令):
[root@localhost ~]# vi /etc/hostname
master
#重启虚拟机即可
修改映射文件
映射文件是ip地址和主机名的对应关系的文件。
[root@master ~]# vi /etc/hosts
192.168.136.11 master
192.168.136.12 slave1
192.168.136.13 slave2
配置时钟同步
ntp是一种自动在互联网上同步电脑时间的服务,使用之前需要先进行安装。(三台虚拟机都需要进行安装)
-
安装ntp服务
[root@master ~]# yum install ntp
-
配置ntp
[root@master ~]# vi /etc/sysconfig/ntpd # Command line options for ntpd OPTIONS="-g" YS_HWLOCK=yes
-
启动服务
[root@master ~]# systemctl start ntpd [root@master ~]# systemctl status ntpd [root@master ~]# date
winSCP安装及使用
该软件用于在linux虚拟机和windows物理机之间进行文件传输。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B2gGoV6F-1647349327850)(assets/1615290586776-1615290587861.png)]
安装JDK
注意:所有的软件安装包放在路径/usr/local/src下,所有的软件安装路径为/usr/local/src
-
将jdk安装包放在/usr/local/src下
[root@master ~]# cd /usr/local/src/ [root@master src]# ll 总用量 185340 -rw-r--r--. 1 root root 189784266 8月 27 2020 jdk-8u152-linux-x64.tar.gz
-
检查操作系统是否已安装openJDK,如果是的话,将其卸载#
#先查询 [root@master src]# rpm -qa | grep java java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64 javapackages-tools-3.4.1-11.el7.noarch tzdata-java-2017b-1.el7.noarch #再卸载 [root@master src]# rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64 [root@master src]# rpm -e --nodeps javapackages-tools-3.4.1-11.el7.noarch [root@master src]# rpm -e --nodeps tzdata-java-2017b-1.el7.noarch
-
创建文件夹/usr/local/src
[root@master src]# cd /opt [root@master opt]# mkdir software [root@master opt]# ll 总用量 0 drwxr-xr-x. 2 root root 6 3月 9 19:57 software
-
将安装包解压到/usr/local/src中
[root@master ~]# tar -zxf /usr/local/src/jdk-8u152-linux-x64.tar.gz -C /usr/local/src/ #重命名文件夹为java [root@master software]# mv /usr/local/src/jdk1.8.0_152/ /usr/local/src/java
-
修改用户权限
我们使用root用户进行解压、重命名,此时java文件夹的使用权限归root用户。因为后期使用集群时,我们使用的是hadoop用户,所以我们需要将java文件夹的权限赋值给hadoop用户。
添加hadoop用户:
[root@master home]# useradd hadoop [root@master home]# passwd hadoop #输入2次新密码,密码为hadoop
[root@master ~]# chown -R hadoop:hadoop /usr/local/src/java/
-
修改环境变量文件并生效
全局环境变量文件是/etc/profile,在最后两行添加,保存退出
[root@master ~]# vi /etc/profile export JAVA_HOME=/usr/local/src/java export PATH=$PATH:$JAVA_HOME/bin [root@master ~]# source /etc/profile
-
测试jdk是否安装成功
[root@master ~]# java -version java version "1.8.0_152" Java(TM) SE Runtime Environment (build 1.8.0_152-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)
将三台虚拟机的jdk都安装好。
问题:
如果不小心把/etc/profile文件改坏了,导致任何指令无法输入,怎么办?
- 重新传一份profile文件
- 在命令行中输入:export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin
单机模式
-
解压安装包
[root@master src]# tar -zxf /usr/local/src/hadoop-2.7.1.tar.gz -C /usr/local/src/
-
修改解压之后的文件夹名
[root@master software]# mv hadoop-2.7.1/ hadoop
-
配置/etc/profile文件,保存退出,并生效。检查是否配置正确
[root@master software]# vi /etc/profile export HADOOP_HOME=/usr/local/src/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin [root@master software]# source /etc/profile [root@master software]# hadoop version Hadoop 2.7.1 Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 15ecc87ccf4a0228f35af08fc56de536e6ce657a
路径讲解:
[root@master hadoop]# ll 总用量 28 drwxr-xr-x. 2 10021 10021 194 6月 29 2015 bin drwxr-xr-x. 3 10021 10021 20 6月 29 2015 etc drwxr-xr-x. 2 10021 10021 106 6月 29 2015 include drwxr-xr-x. 3 10021 10021 20 6月 29 2015 lib drwxr-xr-x. 2 10021 10021 239 6月 29 2015 libexec -rw-r--r--. 1 10021 10021 15429 6月 29 2015 LICENSE.txt -rw-r--r--. 1 10021 10021 101 6月 29 2015 NOTICE.txt -rw-r--r--. 1 10021 10021 1366 6月 29 2015 README.txt drwxr-xr-x. 2 10021 10021 4096 6月 29 2015 sbin drwxr-xr-x. 4 10021 10021 31 6月 29 2015 share
bin:存放Hadoop运行程序和管理软件
etc:存放Hadoop配置文件(非常重要!)
sbin:存放Hadoop集群启动、停止指令
share:存放说明文档、案例、依赖的jar包
-
修改配置文件$HADOOP_HOME/etc/hadoop/hadoop-env.sh
[root@master hadoop]# vi etc/hadoop/hadoop-env.sh export JAVA_HOME=/usr/local/src/java
保存退出。
-
修改权限,赋予hadoop用户使用权限
[root@master software]# chown -R hadoop:hadoop hadoop/、
-
切换到hadoop用户,测试Hadoop是否能正常运行
[root@master software]# su hadoop
入门程序:WordCount,单词计数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PSmBBx5K-1647349327851)(assets/1615446566097-1615446567339.png)]
输入文件:/usr/local/src/input/hello.txt
输出:/usr/local/src/out(不能提前创建好)
执行hadoop jar指令,运行wordcount案例jar包测试Hadoop是否能正常计算:
[hadoop@master input]$ hadoop jar /usr/local/src/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /usr/local/src/input/hello.txt /usr/local/src/out
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rEwgiFP4-1647349327851)(assets/1615447156438-1615447157816.png)]
查看输出文件内容:
[hadoop@master out]$ cat part-r-00000 bigdata 2 hadoop 2 hello 1 world 1
Hadoop的核心组件
HDFS,MapReduce和Yarn是Hadoop的三大核心组件。HDFS用于海量分布式数据的存储;MapReduce用于对海量数据进行分布式处理;Yarn用于进行资源调度。
HDFS
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LJUIJSFn-1647349327851)(assets/1615530224369-1615530225534.png)]
- NameNode,存储着FSImage和edits。它有4个方面的职责:
- 管理HDFS的namespace:维护着文件系统树以及文件树中所有文件的元数据。FSImage文件存储HDFS上文件的元数据,如文件名、文件目录结构、文件属性(文件生成时间、副本数、权限、大小等)以及文件的数据块所在的DataNode等。edits文件记录着所有对文件系统的写操作(如上传、修改等)。
- 管理DataNode上的数据块:NameNode决定了文件数据块存储到哪个DataNode上。
- 处理客户端的读写请求:读取文件时,NameNode将文件所在的块列表反馈给客户端;写文件时,反馈一组DataNode给客户端用于进行写操作。写成功之后,将操作记录在edits文件中。
- 配置副本策略:NameNode根据用户确定的副本策略(默认3个副本)管理HDFS中数据的副本。当HDFS中某个数据块的副本少于设定值时,它会指定其中一个块自动复制到其他DataNode上。
- DateNode(数据节点)负责存储数据,把每个HDFS数据块(默认128M)存储在本地文件系统的单独文件。
- 存储实际的数据块
- 处理客户端的读写请求,执行数据块的读和写
- 向NameNode定期汇报数据块信息,并且向NameNode发送心跳信号保持联系。
- SecondaryNameNode(2NN,第二名称节点)主要用于合并数据文件FSImage。它会每隔一段时间(默认为3600秒)将NameNode上的FSImage和edits文件复制到本地,然后将二者合并成新的FSImage文件,并复制回NameNode。
MapReduce
(1)MapReduce是面向大型数据处理的、简化的、并行计算模型。 (2)将用户编写的业务逻辑代码和自带的默认组件整合成一个完整的分布式运算程序,使得开发并行计算应用程序变得很容易。 (3)MapReduce把对大数据的操作分发给多个子节点并行处理,然后整合各个子节点的输出结果,得到最终的计算结果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bQN7rwn1-1647349327852)(assets/1615852542735-1615852543952.png)]
优点: (1)易于编程:使用它的一些简单接口,就可以完成一个分布式程序。 (2)良好的拓展性:当计算资源不足时,可以简单地通过增加计算机的数量来扩展它的计算能力。 (3)高容错性:当运算节点出现故障时,MapReduce的计算任务可以自动转移到另一个节点运行,不需要人工干预。 (4)适合处理离线大数据:能够处理PB级的离线数据。
缺点: (1)不适合实时计算:MapReduce达不到在秒级以内反馈运算结果。 (2)不适合流式计算:流式计算处理的数据是动态的,而MapReduce只能处理静态的数据。 (3)不适合有向图计算:对于有向图计算,MapReduce在处理数据的过程中,每个任务的输出结果都会写入磁盘,会造成大量的磁盘读写,形成瓶颈,降低系统的性能。
Yarn
伪分布式
仅需要在master一个节点上进行安装即可。大致步骤为解压->修改配置文件->启动相应进程->测试集群状态
SSH免密登录
与用户相关。不同的用户产生的秘钥文件是不同的。
思考:需要用哪个用户产生秘钥文件,并进行秘钥文件的分发?
hadoop用户。因此使用hadoop用户进行秘钥文件的生成和分发。
-
切换到hadoop用户
-
三台虚拟机分别生成秘钥文件
[hadoop@master ~]$ ssh-keygen -t rsa [hadoop@slave1 ~]$ ssh-keygen -t rsa [hadoop@slave2 ~]$ ssh-keygen -t rsa
-
三台虚拟机分别分发三次秘钥文件
[hadoop@master ~]$ ssh-copy-id master [hadoop@master ~]$ ssh-copy-id slave1 [hadoop@master ~]$ ssh-copy-id slave2
-
SSH登录测试
[hadoop@master ~]$ ssh slave1 Last failed login: Tue Mar 16 20:06:37 CST 2021 from slave2 on ssh:notty There was 1 failed login attempt since the last successful login. Last login: Tue Mar 16 19:55:51 2021 [hadoop@slave1 ~]$ exit 登出 Connection to slave1 closed
修改配置文件
配置文件功能:
-
core-site.xml:配置的是集群全局参数,用于定义系统级别的参数,如HDFS的URL(主节点位置)、Hadoop的临时目录等;
-
hdfs-site.xml:HDFS参数,包括NameNode和DataNode的存放位置、文件副本个数、文件读取权限等;
-
mapred-site.xml:MapReduce参数
-
yarn-site.xml:Yarn的系统参数。如ResourceManager、NodeManager的通信端口,web监控端口等;
-
解压
[root@master software]# tar -zxf /usr/local/src/hadoop-2.7.1.tar.gz -C /usr/local/src/ [root@master software]# mv hadoop-2.7.1/ hadoop
-
配置/etc/profile文件并生效
[root@master ~]# vi /etc/profile export HADOOP_HOME=/usr/local/src/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin [root@master ~]# source /etc/profile
-
将hadoop安装文件夹赋予hadoop用户权限,切换到hadoop用户
[root@master software]# chown -R hadoop:hadoop hadoop/ [root@master software]# su hadoop
-
修改配置文件core-site.xml
[hadoop@master hadoop]# vi core-site.xml <property> <!--hdfs地址--> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <!-- 指定hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/src/hadoop/data/tmp</value> </property>
-
修改配置文件hadoop-env.sh
[hadoop@master hadoop]# vi hadoop-env.sh export JAVA_HOME=/usr/local/src/java
-
修改hdfs-site.xml
[hadoop@master hadoop]# vi hdfs-site.xml <!--副本集个数--> <property> <name>dfs.replication</name> <value>1</value> </property>
-
修改yarn-env.sh
[hadoop@master hadoop]# vi yarn-env.sh export JAVA_HOME=/usr/local/src/java
-
修改yarn-site.xml
[hadoop@master hadoop]# vi yarn-site.xml <!-- reducer获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property>
-
修改mapred-env.sh
[hadoop@master hadoop]# vi mapred-env.sh export JAVA_HOME=/usr/local/src/java
-
修改mapred-site.xml
[hadoop@master hadoop]# cp mapred-site.xml.template mapred-site.xml [hadoop@master hadoop]# vi mapred-site.xml <!-- 指定mr运行在yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
-
修改slaves文件,将文件内容(localhost)清空,改为从节点列表名称。保存退出
[hadoop@master hadoop]$ vi slaves master
-
格式化NameNode(注意,只有在第一次启动Hadoop时进行,以后不要再做任何格式化的操作!!!),本操作只做一次!!!
[hadoop@master hadoop]# hdfs namenode -format
-
启动集群(启动HDFS、Yarn),先启动HDFS,再启动Yarn
[hadoop@master hadoop]# start-dfs.sh [hadoop@master hadoop]# start-yarn.sh [hadoop@master hadoop]# jps 2032 SecondaryNameNode 1763 NameNode 2196 ResourceManager 1881 DataNode 2556 Jps 2478 NodeManager
-
集群状态检查
使用浏览器进行集群状态的查看。浏览器建议使用谷歌浏览器,如果使用360的话,要切换到“极速”模式。
查看HDFS状态:
NameNode地址:50070:http://192.168.136.11:50070/
查看Yarn状态:
RecourceManager地址:8088:http://192.168.136.11:8088/
启动过程问题排查
-
重新修改了配置文件以后,再次启动集群之前,是否需要格式化namenode?不需要!!!
-
日志查看
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tAJnawV5-1647349327852)(assets/1615898887802-1615898888864.png)]
哪个进程有问题,就去查看相应的日志文件。比如namenode没有正常启动,就可以去看启动namenode时写入的log文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-saagq9uN-1647349327852)(assets/1615899180389-1615899181326.png)]
[hadoop@master logs]$ cat /usr/local/src/hadoop/logs/hadoop-hadoop-namenode-master.log
完全分布式
集群规划
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fY53a5i5-1647349327852)(assets/1616049594212-1616049595096.png)]
配置文件的修改
删除伪分布式软件包,切换到root用户,解压安装包,重命名:
[hadoop@master software]$ rm -rf hadoop/
[hadoop@master software]$ su root
密码:
[root@master software]# tar -zxf /usr/local/src/hadoop-2.7.1.tar.gz -C /usr/local/src/
[root@master software]# mv hadoop-2.7.1/ hadoop
-
修改core-site.xml
[root@master hadoop]# vi core-site.xml <property> <!--hdfs地址--> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <!-- 指定hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/src/hadoop/tmp</value> </property>
-
修改hadoop-env.sh
[root@master hadoop]# vi hadoop-env.sh export JAVA_HOME=/usr/local/src/java
-
修改hdfs-site.xml
[root@master hadoop]# vi hdfs-site.xml <!--副本集个数--> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>slave2:50090</value> </property>
-
修改yarn-env.sh
[root@master hadoop]# vi yarn-env.sh export JAVA_HOME=/usr/local/src/java
-
修改yarn-site.xml
[root@master hadoop]# vi yarn-site.xml <!-- reducer获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>slave1</value> </property>
-
修改mapred-env.sh
[root@master hadoop]# vi mapred-env.sh export JAVA_HOME=/usr/local/src/java
-
修改mapred-site.xml
[root@master hadoop]# cp mapred-site.xml.template mapred-site.xml [root@master hadoop]# vi mapred-site.xml <!-- 指定mr运行在yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
-
修改slaves
[root@master hadoop]# vi slaves master slave1 slave2
-
分发Hadoop软件包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lc1lWGv1-1647349327853)(assets/1616052255319-1616052256264.png)]
[root@master software]# scp -r /usr/local/src/hadoop/ slave1:/usr/local/src/ [root@master software]# scp -r /usr/local/src/hadoop/ slave2:/usr/local/src/
-
修改权限,三台虚拟机都需要修改
[root@master software]# chown -R hadoop:hadoop /usr/local/src/hadoop [root@slave1 software]# chown -R hadoop:hadoop /usr/local/src/hadoop [root@slave2 software]# chown -R hadoop:hadoop /usr/local/src/hadoop
-
分发环境变量文件/etc/profile并生效
[root@master software]# scp /etc/profile slave1:/etc/profile [root@master software]# scp /etc/profile slave2:/etc/profile [root@slave1 software]# source /etc/profile [root@slave2 software]# source /etc/profile
-
三台虚拟机切换到hadoop用户,在Master上格式化namenode
[root@master software]# su hadoop [root@slave1 software]# su hadoop [root@slave2 software]# su hadoop [hadoop@master software]$ hdfs namenode -format
-
启动集群并测试
[hadoop@master software]$ start-dfs.sh [hadoop@slave1 software]$ start-yarn.sh [hadoop@master software]$ jps 11120 NameNode 11473 NodeManager 11572 Jps 11245 DataNode [hadoop@slave1 software]$ jps 3168 DataNode 3376 NodeManager 3276 ResourceManager 3663 Jps [hadoop@slave2 software]$ jps 3057 SecondaryNameNode 3265 Jps 3001 DataNode 3166 NodeManager
-
关闭集群
[hadoop@slave1 software]$ stop-yarn.sh [hadoop@master software]$ stop-dfs.sh
问题总结
文件夹说明
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXWWOFK4-1647349327853)(assets/1616135376259-1616135378113.png)]
logs文件夹为日志文件,里面记录了该节点进程启动、操作过程的一些日志信息。如果某节点进程出了问题,就去该节点的logs文件夹内找相应日志查看,拍错。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sINabVbe-1647349327853)(assets/1616136753460-1616136755121.png)]
配置文件的一致性
如果检查出是配置文件出错了,那么在修改完(在hadoop用户下修改)配置文件后,一定要将配置文件分发到集群的其他节点上,改谁发谁!!
比如在master上修改了core-site.xml文件,就可以执行如下操作:
[hadoop@master ~]$ scp /usr/local/src/hadoop/etc/hadoop/core-site.xml slave1:/usr/local/src/hadoop/etc/hadoop/core-site.xml
[hadoop@master ~]$ scp /usr/local/src/hadoop/etc/hadoop/core-site.xml slave2:/usr/local/src/hadoop/etc/hadoop/core-site.xml
修改并分发好配置文件后,重启集群,检查集群状态。
格式化问题
如果确认配置文件没有问题,集群也无法正常启动,可以在关闭集群后重新格式化namenode。
需要注意的是,第二次格式化之前,一定要把三台虚拟机的临时路径都删掉!!!即将三台虚拟机的/usr/local/src/hadoop/data文件夹删除
[hadoop@master ~]$ rm -rf /usr/local/src/hadoop/data/
[hadoop@slave1 ~]$ rm -rf /usr/local/src/hadoop/data/
[hadoop@slave2 ~]$ rm -rf /usr/local/src/hadoop/data/
确认删除成功后,再进行格式化,然后启动集群,查看状态。
集群启动的问题
HDFS启动/关闭指令在配置的namenode节点上执行;
Yarn启动/关闭指令在配置的resourcemanager节点上执行。
单独启动某个节点的某个进程的指令:
#单独启动namenode
[hadoop@master ~]$ hadoop-daemon.sh start namenode
#单独启动datanode
[hadoop@slave2 ~]$ hadoop-daemon.sh start datanode
#单独启动secondarynamenode
[hadoop@slave2 ~]$ hadoop-daemon.sh start secondarynamenode
#单独启动resourcemanager
[hadoop@slave1 ~]$ yarn-daemon.sh start resourcemanager
#单独启动nodemanager
[hadoop@slave1 ~]$ yarn-daemon.sh start nodemanager
HDFS Shell操作
HDFS Shell操作以hadoop fs或hdfs dfs开头。
#查看某路径下文件夹
hadoop fs -ls HDFS路径
#在HDFS上创建文件夹
hadoop fs -mkdir HDFS文件夹路径
#在HDFS上创建文件夹(上级目录不存在)
hadoop fs -mkdir -p HDFS文件夹路径
#将本地文件上传到HDFS上
hadoop fs -put 本地文件路径 HDFS路径
#查看集群文件的内容
hadoop fs -cat HDFS文件路径
#从HDFS上下载文件到本地
hadoop fs -get HDFS文件路径 本地路径
#删除HDFS上空文件夹
hadoop fs -rmdir HDFS文件夹路径
#删除HDFS上的非空文件夹
hadoop fs -rm -r HDFS文件夹路径
#将HDFS上的路径剪切至另一个路径下
hadoop fs -mv HDFS源路径 HDFS目标路径
#将HDFS上的路径复制到另一个路径下
hadoop fs -cp HDFS源路径 HDFS目标路径
#在HDFS上创建一个文件
hadoop fs -touchz HDFS路径
MapReduce编程
Windows环境安装
JDK安装
-
解压jdk到c盘
-
配置环境变量
我的电脑->属性->高级系统设置->环境变量
系统变量->新建:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MWmuD8Wd-1647349327854)(assets/1616499606165-1616499607379.png)]
添加Path:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Es0QYu57-1647349327854)(assets/1616499743833-1616499744985.png)]
-
测试
打开命令行,输入java -version,如果可以看到java版本号,表示jdk安装成功。
Hadoop安装
-
解压到C盘
-
配置环境变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Df8ATLFk-1647349327854)(assets/1616500047474-1616500048613.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aChRKwox-1647349327854)(assets/1616500058242-1616500059298.png)]
-
测试
重新打开cmd,输入hadoop version,能显示版本号代表hadoop安装成功。
-
将hadoop.dll和winutils.exe文件复制到C:\Windows\System32下。
IDEA安装及配置
- IDEA安装,然后配置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N1GFYlNG-1647349327855)(assets/1616502986541-1616502987912.png)]
鼠标滚轴调整字体大小:File->Settings->Editor->General:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rrcLekS9-1647349327855)(assets/1616503129819-1616503130911.png)]
-
pom文件编辑,添加相应的依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> </dependencies>
-
修改maven工程的settings文件路径和respository路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4vQn2Oas-1647349327855)(assets/1616503674518-1616503675375.png)]
-
将log4j.propertites复制到项目的src->resources目录下
WordCount案例编程
原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qHJ8VIx1-1647349327855)(assets/1616654996586-1616654998108.png)]
代码
package cn.xpc.wc; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class WcMapper extends Mapper<LongWritable, Text,Text, IntWritable> { /* map方法输入<0,"hello world bigdata"> 输出<"hello",1><"world",1><"bigdata",1> 每一行文本执行一次map方法 */ @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { Text k=new Text(); IntWritable v=new IntWritable(); //1需要把序列化后的每行文本转换成字符串 String line=value.toString(); //2切割 String[] words=line.split(" "); //3遍历切割后得到的数组,将每一个单词写出去 for(String w:words){ //写出每个键值对<w,1> k.set(w); v.set(1); context.write(k,v); } } } package cn.xpc.wc; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class WcReducer extends Reducer<Text, IntWritable,Text,IntWritable> { /* reduce方法输入<"hadoop",{1,1}> 输出<"hadoop",2> 对每一对聚合后的K,V键值对执行一次reduce方法 */ @Override protected