欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hadoop第一篇:hadoop2.7.5单机版安装

程序员文章站 2022-07-14 15:21:11
...

Hadoop第一篇:hadoop2.7.5单机版安装

简介

Hadoop主要完成两件事,分布式存储和分布式计算。

Hadoop主要由两个核心部分组成:

1.HDFS:分布式文件系统,用来存储海量数据。

2.MapReduce:并行处理框架,实现任务分解和调度。

HDFS

是一个分布式文件系统,用来存储和读取数据的。

文件系统都有最小处理单元,而HDFS的处理单元是块。HDFS保存的文件被分成块进行存储,默认的块大小是64MB。

并且在HDFS中有两类节点:

1.NameNode和DataNode。

NameNode:

NameNode是管理节点,存放文件元数据。也就是存放着文件和数据块的映射表,数据块和数据节点的映射表。

也就是说,通过NameNode,我们就可以找到文件存放的地方,找到存放的数据。

DataNode:

DataNode是工作节点,用来存放数据块,也就是文件实际存储的地方。

客户端向NameNode发起读取元数据的消息,NameNode就会查询它的Block Map,找到对应的数据节点。然后客户端就可以去对应的数据节点中找到数据块,拼接成文件就可以了。这就是读写的流程。

作为分布式应用,为了达到软件的可靠性,如图上所示,每个数据块都有三个副本,并且分布在两个机架上。

这样一来,如果某个数据块坏了,能够从别的数据块中读取,而当如果一个机架都坏了,还可以从另一个机架上读取,从而实现高可靠。

我们从上图还可以看到,因为数据块具有多个副本,NameNode要知道那些节点是存活的吧,他们之间的联系是依靠心跳检测来实现的。这也是很多分布式应用使用的方法了。

我们还可以看到,NameNode也有一个Secondary NameNode,万一NameNode出故障了,Secondary就会成替补,保证了软件的可靠性。

HDFS具有什么特点呢?

1.数据冗余,软件容错很高。

2.流失数据访问,也就是HDFS一次写入,多次读写,并且没办法进行修改,只能删除之后重新创建

3.适合存储大文件。如果是小文件,而且是很多小文件,连一个块都装不满,并且还需要很多块,就会极大浪费空间。

HDFS的适用性和局限性:

1.数据批量读写,吞吐量高。

2.不适合交互式应用,延迟较高。

3.适合一次写入多次读取,顺序读取。

4.不支持多用户并发读写文件。

了解完了HDFS,就轮到MapReduce了。

MapReduce是什么:

MapReduce是并行处理框架,实现任务分解和调度。

Hadoop第一篇:hadoop2.7.5单机版安装

其实原理说通俗一点就是分而治之的思想,将一个大任务分解成多个小任务(map),小任务执行完了之后,合并计算结果(reduce)。

首先我们需要先知道几个小概念:

1.job 2.task 3.jobTracker 4.taskTracker

job:在Hadoop内部,用Job来表示运行的MapReduce程序所需要用到的所有jar文件和类的集合,>这些文件最终都被整合到一个jar文件中,将此jar文件提交给JobTraker,MapReduce程序就会执行。

task:job会分成多个task。分为MapTask和ReduceTask。

jobTracker:管理节点。将job分解为多个map任务和reduce任务。

作用:
1.作业调度
2.分配任务,监控任务执行进度
3.监控TaskTracker状态

taskTracker:任务节点。一般和dataNode为同一个节点,这样计算可以跟着数据走,开销最小化。

作用:

1.执行任务

2.汇报任务状态

在MapReduce中,也有容错机制。

1.重复执行。一个job最多被执行4次。

2.推测执行。因为Map全部算完之后才会执行Reduce,如果其中一个Map很慢,就会多开一个task来完成同样的工作,哪个执行的快用哪个。

参考资料

重新认识Hadoop

基础配置

基础环境:Centos7.0 JDK1.8

关闭防火墙:

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动

修改hostname

sudo vim /etc/hosts
master  master

JAVA JDK安装目录

/mnt/java-1.8.0-232

安装hadooop

wget http://archive.apache.org/dist/hadoop/common/hadoop-2.7.5/hadoop-2.7.5.tar.gz
tar -zxvf hadoop-2.7.5.tar.gz
mv hadoop-2.7.5  /mnt

配置环境变量

[aaa@qq.com mnt]# vi /etc/profile
[aaa@qq.com mnt]# source /etc/profile

export HADOOP_HOME=/mnt/hadoop-2.7.5
export PATH=$PATH:$HADOOP_HOME/bin

查看版本

[aaa@qq.com mnt]# hadoop version
mkdir  /mnt/hadoop  
mkdir  /mnt/hadoop/tmp  
mkdir  /mnt/hadoop/var  
mkdir  /mnt/hadoop/dfs  
mkdir  /mnt/hadoop/dfs/name  
mkdir  /mnt/hadoop/dfs/data

修改配置文件

修改配置文件cd /mnt/hadoop2.7.5/etc/hadoop/

core-site.xml
hadoop-env.sh
hdfs-site.xml
mapred-site.xml

core-site.xml

vim core-site.xml 在下添加如下配置文件

<configuration>
<property>
        <name>hadoop.tmp.dir</name>
        <value>/mnt/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
   </property>
   <property>
        <name>fs.default.name</name>
        <value>hdfs://master:9000</value>
   </property>
</configuration>

说明: master可以替换为主机的IP(集群中多推荐hostname)

hadoop-env.sh

vim hadoop-env.sh
将${JAVA_HOME} 修改为自己的JDK路径

export   JAVA_HOME=/mnt/jdk1.8

hdfs-site.xml

修改 hdfs-site.xml
在添加:

<property>
   <name>dfs.name.dir</name>
   <value>/mnt/hadoop/dfs/name</value>
   <description>Path on the local filesystem where theNameNode stores the namespace and transactions logs persistently.</description>
</property>
<property>
   <name>dfs.data.dir</name>
   <value>/mnt/hadoop/dfs/data</value>
   <description>Comma separated list of paths on the localfilesystem of a DataNode where it should store its blocks.</description>
</property>
<property>
   <name>dfs.replication</name>
   <value>2</value>
</property>
<property>
      <name>dfs.permissions</name>
      <value>false</value>
      <description>need not permissions</description>
</property>

mapred-site.xml

修改mapred-site.xml,如果没有此文件,则 mv mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
修改这个新建的mapred-site.xml文件,在节点内加入配置:

<property>
    <name>mapred.job.tracker</name>
    <value>master:9001</value>
</property>
<property>
      <name>mapred.local.dir</name>
       <value>/mnt/hadoop/var</value>
</property>
<property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
</property>

Hadoop启动

第一次启动Hadoop需要初始化
切换到 /mnt/hadoop2.7.5/bin目录下

1.初始格式化

./hadoop  namenode  -format

初始化成功后,可以在/mnt/hadoop/dfs/name 目录下(该路径在hdfs-site.xml文件中进行了相应配置,并新建了该文件夹)新增了一个current 目录以及一些文件。

2.启动Hadoop
主要是启动HDFS和YARN
切换到/mnt/hadoop2.7.5/sbin目录
启动HDFS
输入:

start-dfs.sh

全程yes,输入密码

3.启动YARN
输入:

start-yarn.sh

可以输入 jps 查看是否成功启动

jps
57793 ResourceManager
57459 DataNode
57642 SecondaryNameNode
57355 NameNode
57885 NodeManager
57917 Jps

在浏览器输入:
http://master:8088/cluster
在浏览器输入:
http://master:50070

Hadoop启动命令汇总

1.第一种方式

启动:分别启动HDFS和MapReduce

命令如下:start-dfs.sh start-mapreted.sh

命令如下:stop-dfs.sh stop-mapreted.sh

2.第二种方式

全部启动或者全部停止

启动:

命令:start-all.sh

启动顺序:NameNode,DateNode,SecondaryNameNode,JobTracker,TaskTracker

停止:

命令:stop-all.sh

关闭顺序性:JobTracker,TaskTracker,NameNode,DateNode,SecondaryNameNode

3.第三种启动方式

每个守护线程逐一启动,启动顺序如下:

NameNode,DateNode,SecondaryNameNode,JobTracker,TaskTracker

命令如下:

启动:

  hadoop-daemon.shdaemon(守护进程)

hadoop-daemon.sh start namenode

hadoop-daemon.sh start datenode

hadoop-daemon.sh start secondarynamenode

hadoop-daemon.sh start jobtracker

hadoop-daemon.sh start tasktracker

关闭命令:

hadoop-daemon.sh stop tasktracker

hadoop-daemons.sh 启动多个进程

datanode与tasktracker会分不到多台机器上,从节点启动,就使用

HDFS常用命令

hdfs dfs -ls /
hdfs dfs -put file /
hdfs dfs -mkdir /dirname
hdfs dfs -text /filename
hdfs dfs -rm /filename

入门第一个程序WordCount

为了避免后面的测试出问题,请先修改如下配置
[aaa@qq.com hadoop-2.7.5]# vi etc/hadoop/yarn-site.xml

<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>

修改后重启hadoop

输入源

创建数据

[aaa@qq.com mnt]# mkdir input
[aaa@qq.com mnt]# cd input/
[aaa@qq.com input]# pwd
/mnt/input
[aaa@qq.com input]# echo "hello world">test1.txt
[aaa@qq.com input]# echo "hello hadoop">test2.txt


[aaa@qq.com input]# cd /mnt/hadoop-2.7.5

提交数据源到HDFS

[aaa@qq.com hadoop-2.7.5]# hadoop fs -mkdir -p /mnt/hadoop/input
[aaa@qq.com hadoop-2.7.5]# hadoop fs -ls /mnt/hadoop/input
[aaa@qq.com hadoop-2.7.5]# hadoop fs -put /mnt/input/* /mnt/hadoop/input/
[aaa@qq.com hadoop-2.7.5]# hadoop fs -ls /mnt/hadoop/input
Found 2 items
-rw-r--r--   2 root supergroup         12 2018-09-14 05:12 /mnt/hadoop/input/test1.txt
-rw-r--r--   2 root supergroup         13 2018-09-14 05:12 /mnt/hadoop/input/test2.txt

运行程序

[aaa@qq.com hadoop-2.7.5]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount /mnt/hadoop/input out

运行完成输出结果

[aaa@qq.com hadoop-2.7.5]# hadoop dfs -cat out/*
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

hadoop  1
hello 2
world 1

单机安装参考资料

Hadoop2.8.2单机版安装
https://www.cnblogs.com/xuwujing/p/8017108.html

遇到的问题

auxService:mapreduce_shuffle does not exist

Container launch failed for container_1536843899378_0001_01_000003 : org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService:mapreduce_shuffle does not exist
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

处理方式

[aaa@qq.com hadoop-2.7.5]# vi etc/hadoop/yarn-site.xml

<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>

重启hadoop

output already exists

除第一次运行外,每次运行时都会因为上次的运行产生一个输出路径,造成本次运行无法成功,因此需要手工删除该了路径才可以。

  org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://master:9000/user/root/out already exists
  at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:146)
  at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:266)
  at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:139)
  at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
  at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
  at java.security.AccessController.doPrivileged(Native Method)
  at javax.security.auth.Subject.doAs(Subject.java:422)
  at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1754)
  at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287)
  at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308)
  at org.apache.hadoop.examples.WordCount.main(WordCount.java:87)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:71)
  at org.apache.hadoop.util.ProgramDriver.run(ProgramDriver.java:144)
  at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:74)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
  at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

处理方式:就是把提示端口号9000后面的那个路径删除既可,注意路径不同

[aaa@qq.com hadoop-2.7.5]# ./bin/hadoop fs -rmr  /user/root/out
rmr: DEPRECATED: Please use 'rm -r' instead.
18/09/14 06:09:26 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
Deleted /user/root/out

文档资料参考

https://blog.csdn.net/a60782885/article/details/71308256

Hadoop配置文件参数详解
https://blog.csdn.net/kingxuexi/article/details/54909452

相关标签: hadoop