目录

Hadoop 2.9.1 集群安装

本文章翻译自Hadoop官方文档:https://hadoop.apache.org/docs/r2.9.1/hadoop-project-dist/hadoop-common/ClusterSetup.html

目的

本文描述了如何安装、配置和管理有实际意义的Hadoop集群,其规模可从几个节点的小集群到几千个节点的超大集群。

本文档中不包含高级话题例如安全和高可用。

先决条件

  1. 确保在你集群中的每个节点上都安装了所有必需软件。
  2. 获取Hadoop软件包。

安装

安装Hadoop集群通常要将安装软件解压到集群内的所有机器上。

通常,集群里的一台机器被指定为NameNode,另一台不同的机器被指定为ResourceManager。这些机器是masters。其他的服务(例如WebAppProxy ServerMapReduce JobHistory Server)通常根据负载需要安装在专有机器上或者共享的设备上。

集群中剩下的节点既作为DataNode也作为NodeManager,他们是slaves

非安全模式下配置Hadoop

Hadoop的java配置分为两部分重要的配置文件

  • 默认只读配置 core-default.xml, hdfs-default.xml, yarn-default.xmlmapred-default.xml
  • 集群特有的配置 etc/hadoop/core-site.xml, etc/hadoop/hdfs-site.xml, etc/hadoop/yarn-site.xmletc/hadoop/mapred-site.xml

另外,你可以通过设置etc/hadoop/hadoop-env.shetc/hadoop/yarn-env.sh的变量为集群特有的值来控制*/bin*目录下的hadoop脚本。

要配置Hadoop集群,你需要设置Hadoop守护进程的运行环境和Hadoop守护进程的运行参数

HDFS的守护进程有NameNode, SecondaryNameNodeDataNode。YARN的守护进程有ResourceManager, NodeManagerWebAppProxy。如果要使用MapReduce, MapReduce JobHistory Server也会运行。在大型集群的安装中,这些服务都被安装在不同的机器上。

配置Hadoop守护进程运行环境

管理员应该修改etc/hadoop/hadoop-env.sh, etc/hadoop/yarn-env.sh和可选的etc/hadoop/mapred-env.sh, 添加集群特有的值来定制Hadoop守护进程的运行环境。

在最后,你必须在每个节点配置好正确的JAVA_HOME

管理员可以使用下面表格中的配置变量来配置指定守护进程的运行环境:

守护进程 环境变量
NameNode HADOOP_NAMENODE_OPTS
DataNode HADOOP_DATANODE_OPTS
Secondary NameNode HADOOP_SECONDARYNAMENODE_OPTS
ResourceManager YARN_RESOURCEMANAGER_OPTS
NodeManager YARN_NODEMANAGER_OPTS
WebAppProxy YARN_PROXYSERVER_OPTS
Map Reduce Job History Server HADOOP_JOB_HISTORYSERVER_OPTS

例如,为了让NameNode使用并行垃圾回收器,需要在hadoop-env.sh中添加下面的配置:

1
export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC"

可以在etc/hadoop/hadoop-env.sh中看其他的一些设置的示例。

还有其他的一些有用的配置变量如:

  • HADOOP_PID_DIR - 存储守护进程ID文件的目录

  • HADOOP_LOG_DIR - 守护进程日志存放的位置。如果日志文件不存在会自动创建。

  • HADOOP_HEAPSIZE / YARN_HEAPSIZE - 最大堆大小,单位MB。例如变量设置为1000,堆大小会设置为1000MB。这个变量用于配置守护进程的堆大小。默认值是1000。如果你需要为每个守护进程单独设置堆大小可以使用这个堆变量。

    守护进程 环境变量
    ResourceManager YARN_RESOURCEMANAGER_HEAPSIZE
    NodeManager YARN_NODEMANAGER_HEAPSIZE
    WebAppProxy YARN_PROXYSERVER_HEAPSIZE
    Map Reduce Job History Server HADOOP_JOB_HISTORYSERVER_HEAPSIZE

在大多数情况下,你应该指定HADOOP_PID_DIRHADOOP_LOG_DIR目录,以便它们只能由运行守护进程的用户写入。否则就有可能发生符号链接攻击^1^。

还有一个传统的做法是在系统shell环境变量中配置HADOOP_PREFIX, 例如在/etc/profile.d里添加一个简单的脚本

1
2
HADOOP_PREFIX=/path/to/hadoop
export HADOOP_PREFIX

符号链接攻击示例

示例1

应用A在/tmp目录下创建一个文件,它假设因为文件名不常见或者因为它编码A的名字或者pid作为文件名,所以无需检查文件是否已经存在

攻击者创建一个指向重要文件F的名字相同的符号链接(软连接)。当root用户执行A的时候,F会被覆盖重写

示例2

用户A运行一个应用创建了一个文件/tmp/x,准备一会更新它。

用户B攻击这个应用,把/tmp/x移走,创建了一个指向重要文件F的软连接/tmp/x

配置Hadoop守护进程

这一节重点介绍配置文件中指定的重要参数

  • etc/hadoop/core-site.xml

    Parameter Value Notes
    fs.defaultFS NameNode URI hdfs://host:port
    io.file.buffer.size 131072 Size of read/write buffer used in SequenceFiles.
  • etc/hadoop/hdfs-site.xml

    • NameNode的配置
      Parameter Value Notes
      dfs.namenode.name.dir NameNode持久化存储命名空间和事务日志的本地文件系统路径 如果是逗号分隔的目录列表,则为了冗余,将name table复制到所有目录中
      dfs.hosts / dfs.hosts.exclude List of permitted/excluded DataNodes. If necessary, use these files to control the list of allowable datanodes.
      dfs.blocksize 268435456 HDFS blocksize of 256MB for large file-systems.
      dfs.namenode.handler.count 100 More NameNode server threads to handle RPCs from large number of DataNodes.