Hadoop核心组件
Hadoop HDFS(分布式文件存储系统):解决海量数据存储
Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度
Hadoop MapReduce(分布式计算框架):解决海量数据计算
服务器
运行角色
node1
namenode datanode resourcemanager nodemanager
node2
secondarynamenode datanode nodemanager
node3
datanode nodemanager
https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html
百度搜一个密钥用
密钥 ZF3R0-FHED2-M80TY-8QYGC-NPKYF
https://www.centos.org/download/
查看当前主机名指令: cat /etc/hostname
修改当前主机名指令:vim /etc/hostname
:wq
保存后重新加载该配置
重新加载配置指令source /etc/hostname
修改指令vim /etc/hosts
查看指令cat /etc/hosts
ps:查看你主机的ip地址指令:ifconfig
systemctl stop firewalld.service
关闭防火墙
systemctl disable firewalld.service
禁止防火墙开启自启
ssh免密登录(node1执行->node1|node2|node3)
ssh-keygen
#4个回车 生成公钥、私钥 ssh-copy-id node1
、ssh-copy-id node2
、ssh-copy-id node3
yum -y install ntpdate
安装ntpdate
ntpdate ntp4.aliyun.com
从阿里云同步
mkdir -p /export/server/
#软件安装路径
mkdir -p /export/data/
#数据存储路径
mkdir -p /export/software/
#安装包存放路径
jdk安装详细过程 https://www.cnblogs.com/stulzq/p/9286878.html
上传、解压Hadoop安装包(node1) 上传可以用rz
命令或你的连接工具如finalshell自带的
cd /export/server
进入目录
tar zxvf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz
解压事先准备好的hadoop安装包
xxxx-site.xml ,site表示的是用户定义的配置,会覆盖default中的默认配置。
core-site.xml 核心模块配置
hdfs-site.xml hdfs文件系统模块配置
mapred-site.xml MapReduce模块配置
yarn-site.xml yarn模块配置
所有的配置文件目录:/export/server/hadoop-3.3.0/etc/hadoop
export JAVA_HOME=/export/server/jdk1.8.0_241
#文件最后添加
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
!-- 设置默认使用的文件系统 Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
<!-- 设置Hadoop本地保存数据路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/data/hadoop-3.3.0</value>
</property>
<!-- 设置HDFS web UI用户身份 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<!-- 整合hive 用户代理设置 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<!-- 垃圾桶文件保存时间 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<!-- 设置SNN进程运行机器位置信息 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:9868</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MR程序历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 是否将对容器实施物理内存限制 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!-- 是否将对容器实施虚拟内存限制。 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 开启日志聚集 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置yarn历史服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
</property>
<!-- 保存的时间7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
node1
node2
node3
在node1机器上将Hadoop安装包scp同步到其他机器
cd /export/server
scp -r hadoop-3.3.0 root@node2:$PWD
scp -r hadoop-3.3.0 root@node3:$PWD
vim /etc/profile
export HADOOP_HOME=/export/server/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
scp /etc/profile root@node2:/etc/
scp /etc/profile root@node3:/etc/
source /etc/profile
hadoop #验证环境变量是否生效
首次启动HDFS时,必须对其进行格式化操作。
format本质上是初始化工作,进行HDFS清理和准备工作
hdfs namenode -format
执行结果
PS:1. 首次启动之前需要format操作; 2. format只能进行一次 后续不再需要; 3. 如果多次format除了造成数据丢失外,还会导致 hdfs集群主从角色之间互不识别。通过删除所有机 器hadoop.tmp.dir目录重新format解决
在node1上,使用软件自带的shell脚本一键启动。前提:配置好机器之间的SSH免密登录和workers文件。
HDFS集群
start-dfs.sh
stop-dfs.sh
YARN集群
start-yarn.sh
stop-yarn.sh
Hadoop集群
start-all.sh
stop-all.sh
启动完毕之后可以使用jps命令查看进程是否启动成功
Hadoop启动日志路径:/export/server/hadoop-3.3.0/logs/
地址:http://namenode_host:9870
namenode用你指定的node替代
如http://node1:9870/dfshealth.html#tab-overview
地址:http://resourcemanager_host:8088
其中resourcemanager_host是resourcemanager运行所在机器的主机名或者ip
如我访问的就是http://node1:8088/cluster
hadoop fs -mkdir /itcast
hadoop fs -put zookeeper.out /itcast
hadoop fs -ls /
cd /export/server/hadoop-3.3.0/share/hadoop/mapreduce/
hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 2 4
hadoop fs -mkdir [-p] ...
path 为待创建的目录
-p选项的行为与Unix mkdir -p非常相似,它会沿着路径创建父目录
hadoop fs -ls [-h] [-R] [ ...]
path 指定目录路径
-h 人性化显示文件size
-R 递归查看指定目录及其子目录
hadoop fs -put [-f] [-p] ...
-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限
localsrc 本地文件系统(客户端所在机器)
dst 目标文件系统(HDFS)
hadoop fs -cat ...
读取指定文件全部内容,显示在标准输出控制台。 注意:对于大文件内容读取,慎重。
hadoop fs -get [-f] [-p] ...
下载文件到本地文件系统指定目录
-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限。
hadoop fs -cp [-f] ...
-f 覆盖目标文件(已存在下)
hadoop fs -appendToFile ...
将所有给定本地文件的内容追加到给定dst文件。 dst如果文件不存在,将创建该文件。 如果为-,则输入为从标准输入中读取。
hadoop fs -mv ...
移动文件到指定文件夹下 可以使用该命令移动数据,重命名文件的名称
NameNode是Hadoop分布式文件系统的核心,架构中的主角色。
NameNode维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。
基于此,NameNode成为了访问HDFS的唯一入口。
NameNode内部通过内存和磁盘文件两种方式管理元数据。
其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和edits log(Journal)编辑日志。
DataNode是Hadoop HDFS中的从角色,负责具体的数据块存储。
DataNode的数量决定了HDFS集群的整体数据存储能力。
通过和NameNode配合维护着数据块。
Secondary NameNode充当NameNode的辅助节点,但不能替代NameNode。
主要是帮助主角色进行元数据文件的合并动作。可以通俗的理解为主角色的“秘书”
HDFS客户端创建对象实例DistributedFileSystem, 调用该对象的open()方法来打开希望读取的文件。
DistributedFileSystem使用RPC调用namenode来确定文件中前几个块的块位置(分批次读取)信息。 对于每个块,namenode返回具有该块所有副本的datanode位置地址列表,并且该地址列表是排序好的,与客户端的 网络拓扑距离近的排序靠前。
DistributedFileSystem将FSDataInputStream输入流返回到客户端以供其读取数据。
客户端在FSDataInputStream输入流上调用read()方法。然后,已存储DataNode地址的InputStream连接到文件 中第一个块的最近的DataNode。数据从DataNode流回客户端,结果客户端可以在流上重复调用read()
当该块结束时,FSDataInputStream将关闭与DataNode的连接,然后寻找下一个block块的最佳datanode位置。 这些操作对用户来说是透明的。所以用户感觉起来它一直在读取一个连续的流。 客户端从流中读取数据时,也会根据需要询问NameNode来检索下一批数据块的DataNode位置信息。
一旦客户端完成读取,就对FSDataInputStream调用close()方法
一个完整的MapReduce程序在分布式运行时有三类
MRAppMaster:负责整个MR程序的过程调度及状态协调
MapTask:负责map阶段的整个数据处理流程
ReduceTask:负责reduce阶段的整个数据处理流程
运行MapReduce程序评估一下圆周率的值,执行中可以去YARN页面上观察程序的执行的情况。
第一个参数:pi表示MapReduce程序执行圆周率计算任务;
第二个参数:用于指定map阶段运行的任务task次数,并发度,这里是10;
第三个参数:用于指定每个map任务取样的个数,这里是50。
[root@node1 mapreduce]# hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 10 50
示例位置:/export/server/hadoop-3.3.0/share/hadoop/mapreduce
上传文本文件1.txt到HDFS文件系统的/input目录下,如果没有这个目录,使用shell创建
hadoop fs -mkdir /input
创建hdfs输入目录
hadoop fs -put 1.txt /input
提交文件到hdfs文件系统
准备好之后,执行官方MapReduce实例,对上述文件进行单词次数统计
第一个参数:wordcount表示执行单词统计任务;
第二个参数:指定输入文件的路径;
第三个参数:指定输出结果的路径(该路径不能已存在)
[root@node1 mapreduce]# pwd
/export/server/hadoop-3.3.0/share/hadoop/mapreduce
[root@node1 mapreduce]# hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount
/input /output
上传到文件系统
执行结果
第一个success没用 只是一个成功失败的标识 第二个part才是真正的结果
第一阶段:把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划。 默认Split size = Block size(128M),每一个切片由一个MapTask处理。(getSplits)
第二阶段:对切片中的数据按照一定的规则读取解析返回对。 默认是按行读取数据。key是每一行的起始位置偏移量,value是本行的文本内容。(TextInputFormat)
第三阶段:调用Mapper类中的map方法处理数据。 每读取解析出来的一个 ,调用一次map方法。
第四阶段:按照一定的规则对Map输出的键值对进行分区partition。默认不分区,因为只有一个reducetask。 分区的数量就是reducetask运行的数量。
第五阶段:Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。溢出spill的时候根据key进行排序sort。 默认根据key字典序排序。
第六阶段:对所有溢出文件进行最终的merge合并,成为一个文件。
第一阶段:ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据。
第二阶段:把拉取来数据,全部进行合并merge,即把分散的数据合并成一个大的数据。再对合并后的数据排序 。
第三阶段是对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对 写入到HDFS文件中。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章