之前一直在windows上,通过VMware软件搭建hadoop集群,尝试过使用docker进行搭建,在 Windows 环境下跑程序,需要winutils.exe ,hadoop.dll 遇到了种种问题。本着尝试的原则使用了黑苹果。搭建后的问题都没有啦。总算是解决了环境的问题。下面就记录下。

准备

  • VMware Fusion:虚拟机
  • Termius:连接虚拟机,mac自带的终端也不错
  • Transmit:ftp连接虚拟机
  • 软件工具包:
    • java8-linux.tar.gz
    • Hadoop3.2.1.tar.gz
    • CentOS 镜像文件

虚拟机安装CentOS

推荐先创建一个CentOS,配置好下面的所有内容(包括hadoop的安装)后,再克隆出3份。

  1. 使用VMwae Fusion 创建CentOS的虚拟机,之后要克隆2个,我要搭建完全分布式。

  2. 修改ip地址为静态IP

  3. 修改主机名分别为 hadoop01, hadoop02, hadoop03

  4. 关闭防火墙和selinux (自己学习为了简单)

  5. Yum 换国内源 ,安装 vim, tree, net-tools等常用工具

  6. 配置ssh免密登录

    1
    2
    3
    4
    $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
    $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    $ chmod 0600 ~/.ssh/authorized_keys
    ssh localhost(首次需输入yes)

搭建集群

安装java环境

  1. 使用Transmit或SFTP工具上传java文件到目录下,tar -zxvf XXX -C /usr/local/ 解压。

  2. /etc/profile下配置JAVA_HOME

    1
    2
    export JAVA_HOME=/usr/local/jdk1.8.0_221
    export PATH=$JAVA_HOME/bin:$PATH

安装hadoop

  1. 使用Transmit工具上传hadoop文件到目录下,tar -zxvf XXX -C /usr/local/ 解压。

  2. /etc/profile下配置HADOOP_HOME

    1
    2
    export HADOOP_HOME=/usr/local/hadoop3.2.1
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

测试 hadoop -version,之后就是配置hadoop的配置文件

这里先提前解决启动错误,我搭建的时候没有添加export环境变量。启动的时候出现如下的错误:

1
2
3
4
5
6
7
8
9
10
[root@hadoop01 ~]# $HADOOP_HOME/sbin/start-dfs.sh
Starting namenodes on [hadoop01]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [hadoop01]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.

解决在 hadoop-env.sh 下添加环境变量

hadoop-env.sh

打开注释,修改JAVA_HOME的路径

1
2
3
4
5
6
7
export JAVA_HOME=/usr/local/java1.8
# 解决上面出现的错误,放置开头
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"

core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>

<property>
<name>io.file.buffer.size</name>
<value>131072</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
27
28
29
<configuration>
<!-- Configurations for NameNode: -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/hdfs/name/</value>
</property>

<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>

<property>
<name>dfs.namenode.handler.count </name>
<value>100</value>
</property>

<!-- Configurations for DataNode: -->

<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/hdfs/data/</value>
</property>

<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>

yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- Configurations for ResourceManager and NodeManager: -->
<!-- Configurations for ResourceManager: -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<!-- 配置外网只需要替换外网ip为真实ip,否则默认为 localhost:8088 -->
<!-- <property>
<name>yarn.resourcemanager.webapp.address</name>
<value>外网ip:8088</value>
</property> -->
<!-- Configurations for NodeManager: -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- Configurations for History Server (Needs to be moved elsewhere): -->
</configuration>

mapred-site.xml

1
2
3
4
5
6
7
<configuration>
<!-- Configurations for MapReduce Applications: -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

workers

1
2
hadoop02
hadoop03

常用的配置文件中的重要参数。

etc/hadoop/core-site.xml

参数 说明
fs.defaultFS NameNode URI hdfs://host:port/
io.file.buffer.size 131072 队列文件中的读/写缓冲区的大小。

etc/hadoop/hdfs-site.xml

  • NameNode配置:
参数 说明
dfs.namenode.name.dir NameNode持久存储名称空间和事务日志的本地文件系统上路径 如果这是一个逗号分隔的目录列表,那么将在所有目录中复制名称的表,以进行冗余。
dfs.hosts / dfs.hosts.exclude 包含/摒弃的数据存储节点清单 如果有必要,使用这些文件来控制允许的数据存储节点列表
dfs.blocksize 268435456 HDFS 块大小为256MB的大文件系统.
dfs.namenode.handler.count 100 多个NameNode服务器线程处理来自大量数据节点的rpc。
  • DataNode配置:
参数 说明
dfs.datanode.data.dir DataNode的本地文件系统上存储块的逗号分隔的路径列表。 如果这是一个逗号分隔的目录列表,那么数据将存储在所有命名的目录中,通常在不同的设备上。

etc/hadoop/yarn-site.xml

参数 说明
yarn.acl.enable true / false 允许ACLs?默认 false.
yarn.admin.acl Admin ACL 在集群上设置adminis。 ACLs are of for comma-separated-usersspacecomma-separated-groups.默认是指定值为*表示任何人。特别的是空格表示皆无权限。
yarn.log-aggregation-enable false Configuration to enable or disable log aggregation配置是否允许日志聚合。
  • ResourceManager配置:
参数 说明
yarn.resourcemanager.address ResourceManager host:port 用于客户端任务提交. 如果设置host:port ,将覆盖yarn.resourcemanager.hostname.host:port主机名。
yarn.resourcemanager.scheduler.address ResourceManager host:port 用于应用管理者向调度程序获取资源。 如果设置host:port ,将覆盖yarn.resourcemanager.hostname主机名
yarn.resourcemanager.resource-tracker.address ResourceManager host:port 用于NodeManagers. 如果设置host:port ,将覆盖yarn.resourcemanager.hostname的主机名设置。
yarn.resourcemanager.admin.address ResourceManager host:port 用于管理命令。 如果设置host:port ,将覆盖yarn.resourcemanager.hostname主机名的设置
yarn.resourcemanager.webapp.address ResourceManager web-ui host:port. 如果设置host:port ,将覆盖yarn.resourcemanager.hostname主机名的设置
yarn.resourcemanager.hostname ResourceManager host. 可设置为代替所有yarn.resourcemanager* address 资源的主机单一主机名。其结果默认端口为ResourceManager组件。
yarn.resourcemanager.scheduler.class ResourceManager 调度类. Capacity调度 (推荐), Fair调度 (也推荐),或Fifo调度.使用完全限定类名,如 org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler.
yarn.scheduler.minimum-allocation-mb 在 Resource Manager上为每个请求的容器分配的最小内存. In MBs
yarn.scheduler.maximum-allocation-mb 在Resource Manager上为每个请求的容器分配的最大内存 In MBs
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path 允许/摒弃的nodeManagers列表 如果必要,可使用这些文件来控制允许的NodeManagers列表
  • NodeManager配置:
参数 说明
yarn.nodemanager.resource.memory-mb 用于给定的NodeManager的资源,即可用的物理内存、内存容量。 用于运行容器的NodeManager上的全部可用资源定义。
yarn.nodemanager.vmem-pmem-ratio 任务可使用的虚拟内存的最大比率,可能超过物理内存限制。 每个任务的虚拟内存使用可能超过其物理内存限制。NodeManager上的任务所使用的虚拟内存总量可能会超过其物理内存使用量。
yarn.nodemanager.local-dirs 写中间数据的本地文件系统以逗号分隔的路径列表。 多个路径帮助扩展磁盘i/o。
yarn.nodemanager.log-dirs 写日志的本地文件系统以逗号分隔的路径列表 多个路径帮助扩展磁盘i/o。
yarn.nodemanager.log.retain-seconds 10800 默认时间(以秒为单位)保留NodeManager上的日志文件,仅适用于禁用日志聚合的情况。
yarn.nodemanager.remote-app-log-dir /logs 在应用程序完成时移动应用程序日志的HDFS目录。需要设置相应的权限。仅适用于启用日志聚合的情况
yarn.nodemanager.remote-app-log-dir-suffix logs 后缀附加到远程日志目录。日志将聚合到{yarn.nodemanager.remote-app-log-dir}/yarn.nodemanager.remote−app−log−dir/{user}/${thisParam}仅适用于启用日志聚合的情况
yarn.nodemanager.aux-services mapreduce_shuffle Shuffle service that needs to be set for Map Reduce applications.需要被设置Shuffle服务的Map Reduce应用程序
yarn.nodemanager.env-whitelist 环境变量通过从NodeManagers的容器继承的环境属性 对于mapreduce应用程序,除了默认值hadoop op_mapred_home应该被添加外。属性值还有JAVA_HOME HADOOP_COMMON_HOME、HADOOP_HDFS_HOME HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME HADOOP_MAPRED_HOME
  • History Server (需要转移到其他地方)配置:
参数 说明
yarn.log-aggregation.retain-seconds -1 保存多长时间之后删除聚合日志。-1禁用。要小心,设置值这个太小,这个节点将成为垃圾箱。
yarn.log-aggregation.retain-check-interval-seconds -1 检查聚合日志保留的间隔时间。如果将值设置为0或负值,则将值计算为聚合日志保留时间的十分之一。要小心,设置这个太小,这个节点将成为垃圾箱。

etc/hadoop/mapred-site.xml

  • MapReduce 应用程序配置:
参数 说明
mapreduce.framework.name yarn 设置执行的框架为 Hadoop YARN.
mapreduce.map.memory.mb 1536 Maps的资源限制
mapreduce.map.java.opts -Xmx1024M Maps的子jvm的堆大小设置
mapreduce.reduce.memory.mb 3072 Reduces的资源限制
mapreduce.reduce.java.opts -Xmx2560M reduces的子jvm的堆大小设置
mapreduce.task.io.sort.mb 512 更高的内存限制,同时对数据进行排序以提高效率。
mapreduce.task.io.sort.factor 100 在排序文件时,同时合并更多的流。
mapreduce.reduce.shuffle.parallelcopies 50 reduce通过运行更多的并行副本来取得大量的maps的输出结果
  • MapReduce JobHistory Server配置:
参数 说明
mapreduce.jobhistory.address MapReduce JobHistory 服务 主机:端口 默认端口为 10020.
mapreduce.jobhistory.webapp.address MapReduce JobHistory Server Web UI 主机:端口 默认端口为19888.
mapreduce.jobhistory.intermediate-done-dir /mr-history/tmp MapReduce jobs写历史文件的目录
mapreduce.jobhistory.done-dir /mr-history/done MR JobHistory Server管理的历史文件目录

NodeManagers健康监控

  • Hadoop提供了一种管理员可以通过配置NodeManager以便定期运行管理员提供的脚本,确定节点是否健康的机制。

  • 管理员可以通过他们选择的脚本中的任一检查来确定节点是否处于健康状态。

  • 如果脚本检测到节点处于不健康状态,它必须打印一行以ERRO开始的字符串并进行标准输出。

  • NodeManager会周期性地生成脚本并检查它的输出。如果脚本的输出包含字符串ERROR错误,如上所述,该节点的状态是不健康的,并且该节点将由ResourceManager在黑名单上列出来。并且将不会有新的任务分配给此节点

  • 无论如何,NodeManager还将继续运行此脚本,这样如果此节点恢复正常,它就会自动从ResourceManager上的黑名单节点中删除。该节点的健康信息将伴随脚本进行输出,(如果是不健康的),并通过ResourceManager web界面提供给管理员。该节点健康的时间也会显示在web界面上。

可以使用以下参数来控制etc/hadoop/yarn-site.xml中的节点健康监控脚本信息

参数 说明
yarn.nodemanager.health-checker.script.path 节点健康脚本 检查节点的健康状态。.
yarn.nodemanager.health-checker.script.opts 节点健康脚本选项 用于检查节点健康状态的脚本选项。
yarn.nodemanager.health-checker.interval-ms 节点健康脚本间隔时间 运行健康脚本的时间间隔。
yarn.nodemanager.health-checker.script.timeout-ms 节点健康脚本超时间隔。 用于健康脚本执行的超时。.

如果只有一些本地磁盘变得糟糕,那么health checker脚本不会出现ERROR错误信息。

NodeManager有能力定期检查本地磁盘的健康状况(特别是检查NodeManager -local-dirs和NodeManager -log-dirs),并且在达到了基于配置属性yarn.nodemanager.disk-health-checker的值设置的坏目录的阈值之后。如果整个节点都是不健康的,这个信息将被发送到资源管理器。由健康检查脚本来标识引导磁盘被检查还是引导磁盘上出现故障。

Web 界面说明

如果Hadoop集群启动并运行web ui组件进行检查,其如下所述:

守护进程 Web界面 说明
NameNode http://nn_host:port/ 默认HTTP端口为 9870
ResourceManager http://rm_host:port/ 默认HTTP端口为8088
MapReduce JobHistory Server http://jhs_host:port/ 默认HTTP端口为19888

Hadoop机架感知

许多Hadoop组件都是机架感知的,并利用网络拓扑来实现性能和安全性。Hadoop守护进程通过调用管理员配置的模块获取集群中工作人员的机架信息。有关更详细的信息,请参阅“机架感知”文档。

在启动HDFS之前,强烈建议配置机架感知。

日志

Hadoop使用Apache Commons日志框架的Apache log4j进行日志记录。

编辑the etc/hadoop/log4j.properties 文件来实现Hadoop守护进程日志配置(日志格式等)的定制化。

Hadoop集群操作

一旦完成所有必要的配置之后,将文件分发到所有机器上的HADOOP_CONF_DIR目录。这在所有机器上的目录是相同的。

正常情况下,建议将HDFS和YARN使用单独的用户运行。在大多数的安装情况中,HDFS 进程使用‘hdfs’账号,YARN 通常使用 ‘yarn’ 账号。

Hadoop启动

1
sbin/start-all.sh

启动HDFS

  • 格式化:启动Hadoop集群,您需要启动HDFS和YARN集群。

第一次打开HDFS时,必须对其进行格式化。将新的分布式文件系统格式化为hdfs

1
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format <cluster_name>
  • 在指定的节点上使用以下命令启动HDFS NameNode作为hdfs
1
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
  • 在每个指定节点上使用以下命令启动一个HDFS DataNode作为hdfs:
1
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
  • 如果etc/hadoop/workers和ssh可信访问已配置,那么所有的HDFS进程都可以使用一个通用脚本启动hdfs:
1
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh

启动YARN集群

  • 用下面的命令启动YARN,在指定的ResourceManager上运行YARN:
1
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager
  • 运行一个脚本,在每个指定的主机上启动一个NodeManager作为yarn
1
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
  • 启动一个独立的WebAppProxy服务器。作为运行在WebAppProxy服务器上的yarn。如果在负载均衡中使用多个服务器,则应该在每个服务器上运行:
1
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver
  • 如果etc/hadoop/workers和ssh可信访问被配置,那么所有的线程进程都可以从一个通用脚本开始yarn
1
[yarn]$ $HADOOP_HOME/sbin/start-yarn.sh
  • 使用下面的命令启动MapReduce JobHistory服务,运行指定的mapred服务:
1
[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver

Hadoop关闭

sbin/stop-all.sh

关闭HDFS

  • 用下面的命令停止在指定的NameNode上运行hdfs:
1
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode
  • 运行一个脚本来停止hdfs的DataNode。
1
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode
  • 如果etc/hadoop/workers和ssh可信访问被配置,那么所有的HDFS进程都可以用一个通用脚本停hdfs:
1
[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh

关闭Yarn集群

  • 使用下面的命令停止在指定的ResourceManager上运行yarn:
1
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager
  • 运行一个脚本,以停止yarn的NodeManager工作:
1
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager
  • 如果etc/hadoop/workers和ssh可信访问被配置,那么所有的yarn进程都可以用一个通用脚本停止:
1
[yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh
  • 停止WebAppProxy服务。运行在WebAppProxy服务上的yarn。如果在负载均衡中使用多个服务,则应该在每个服务器上运行停止WebAppProxy服务:
1
[yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver
  • 使用以下命令停止在指定的服务上运行mapred的MapReduce JobHistory服务:
1
[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver