0%

三种运行模式

三种运行模式

hadoop分为三种运行模式,分别为单机模式、伪分布式模式和完全分布式模式

需要调整hadoop-env.sh文件

1
2
#设置JAVA_HOME(设置为自己的JAVA_HOME位置)
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home

单机模式(Standalone)

默认情况下为单机模式可以用来开发和调试

不需要对配置文件进行修改,使用的是本地的文件系统,Hadoop不会启动NameNode、DataNode、JobTracker、TaskTracker等守护线程,Map()和Reduce()任务作为同一个进程的不同部分来执行

wordcount示例

使用wordcount例子来演示一下hadoop,注意不需要改任何的配置文件

1
2
# hadoop-mapreduce-examples-3.3.0.jar该jar包为hadoop的一些示例代码  wordcount表示调用的是该jar包下的WordCount主类 wcinput为输入目录 wcoutput为输出目录
./hadoop jar /usr/local/Cellar/hadoop/3.3.0/libexec/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount wcinput wcoutput

输入目录中的文件内容

1
2
3
4
5
6
7
8
hadoop
hadoop
yarn
mapreduce
hadoop
hdfs hdfs
hdfs mapreduce
hdfs

输出结果

1
2
3
4
hadoop    3
hdfs 4
mapreduce 2
yarn 1

伪分布式模式(Pseudo-Distributed)

Hadoop在本地机器模拟一个集群,需要修改core-site.xml(作用于全部进程及客户端)、hdfs-site.xml(配置HDFS集群的工作属性)、mapred-site.xml(配置MapReduce集群的属性)

hdfs配置测试

配置文件

core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
<property>
<!-- hdfs的NameNode地址 -->
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- hadoop.tmp.dir文件系统依赖的基础配置,如果在hdfs-site.xml中不配置NameNode节点和DataNode节点的数据存放位置时,默认放在该目录下 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/data/hadoop/tmp</value>
</property>
</configuration>

hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<configuration>
<!-- namenode元数据存储位置 如果不配置则存储在hadoop.tmp.dir中
默认file://${hadoop.tmp.dir}/dfs/name
-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/data/hadoop/hdfs/name</value>
</property>
<!-- datanode数据存储位置 如果不配置则存储在hadoop.tmp.dir中
默认file://${hadoop.tmp.dir}/dfs/data
-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/data/hadoop/hdfs/data</value>
</property>
<!-- 副本个数,默认是3,取决于集群中的机器 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 关闭权限 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
启动

第一次启动的时候需要格式化,之后就不要格式化了(格式化之后所有的数据就没了)

1
2
3
hadoop namenode -format

./hdfs namenode -format

注意:在format过程中 要注意不要频繁地reformat namnode(格式化命令为 hdfs namenode -format)的ID信息。format过程中选择N(否)就是了。因为在每次hdfs namenode -format时都会为NameNode生成namespaceID,在hadoop.tmp.dir目录下的dataNode还是保留上次的namespaceID,因为namespaceID不一致,导致DataNode无法启动

1
2
# 启动namenodes和datanodes
sbin/start-dfs.sh

启动完之后使用jps来查看是否存在NameNode和DataNode

1
jps

访问localhost:9870可以查看hdfs的web页面

如果是3.X以下的对应的端口是50070

操作hdfs

1
2
3
4
# 在hdfs中创建目录
bin/hdfs dfs -mkdir /test/wordcount
# 将本地文件上传到hdfs中
bin/hdfs dfs -put bin/wcinput /test/wordcount
wordcount示例

再次操作一下wordcount的例子

1
2
# hadoop-mapreduce-examples-3.3.0.jar该jar包为hadoop的一些示例代码  wordcount表示调用的是该jar包下的WordCount主类 /test/wordcount/wcinput为输入目录(代表的是在hdfs上的目录位置) /test/wordcount/wcoutput为输出目录(代表的是在hdfs上的目录位置)
bin/hadoop jar /usr/local/Cellar/hadoop/3.3.0/libexec/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /test/wordcount/wcinput /test/wordcount/wcoutput

此时在/test/wordcount/wcoutput目录下就会有这次执行的结果

yarn配置测试

yarn要在hdfs配置启动好的基础上进行配置

配置文件

mapred-site.xml

1
2
3
4
5
6
7
8
9
10
<!-- 指定在哪运行计算,默认是local -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>

yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        <!-- nodemanager执行任务的方式 -->
<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>

<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
启动

注意:要在hdfs启动的基础上进行启动

1
sbin/start-yarn.sh

启动之后使用jps查看,需要存在NodeManager和ResourceManager

可以使用localhost:8088来查看ResourceManager的web页面

wordcount示例
1
bin/hadoop jar /usr/local/Cellar/hadoop/3.3.0/libexec/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /test/wordcount/wcinput /test/wordcount/yarn_wcoutput

此时在/test/wordcount/yarn_wcoutput目录下就会有这次执行的结果

完全分布式集群模式(Full-Distributed)

Hadoop运行在一个集群上,各主机间设置SSH免密码登录,把各从节点生成的公钥添加到主节点的信任列表,修改core-site.xml、hdfs-site.xml、maperd-site.xml,指定NameNode和JobTraker的位置和端口,设置文件的副本等参数

配置

首先是hdfs的NameNode和SecondaryNameNode不要放在一台服务器上,这两个占用的内存基本是1:1,然后是yarn的ResourceManager要避开上述的NameNode和SecondaryNameNode,放在另一台服务器上

core-site.xml

1
2
3
4
5
6
7
<configuration>
<property>
<!-- 配置集群hdfs的NameNode地址 -->
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
</configuration>

hdfs-site.xml

1
2
3
4
5
6
7
8

<configuration>
<property>
<!-- 配置集群hdfs的secondaryNameNode地址 -->
<name>dfs.namenode.secondary.http-address</name>
<value>hdfs://hadoop2:9868</value>
</property>
</configuration>

yarn-site.xml

1
2
3
4
5
6
7
8
9
10
<!-- nodemanager执行任务的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop3</value>
</property>

mapred-site.xml

1
2
3
4
5
<!-- 指定在哪运行计算,默认是local -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

节点文件配置 在etc/hadoop/workers文件配置各个节点的主机名(这个文件里配置的是datanode节点)

1
2
3
hadoop1
hadoop2
hadoop3

注意要配置ssh认证

启动集群

启动hdfs

1
/sbin/start-dfs.sh

在NameNode所在机器上启动

启动yarn

1
/sbin/start-yarn.sh

在resourcemanager所在机器上启动

欢迎关注我的其它发布渠道