安装完全分布式Hadoop

hadoop 2.7 + jdk1.8 + centOS6

cat /etc/hosts

10.20.100.101  namenode

10.20.100.102  datanode1

10.20.100.103  datanode2

10.20.100.104  datanode3


一、JDK环境 

设置JAVA_HOME  HADOOP_HOME 环境变量;

打通namenode datanode 之间ssh互信;

# JDK

export JAVA_HOME=/usr/local/java

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tool.jar

export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH

# hadoop 

export HADOOP_HOME=/opt/hadoop/bigdata/hadoop

export HADOOP_USER_NAME=hadoop

export PATH=$JAVE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH


二、官方下载目录

https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/

https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.0/hadoop-2.7.0.tar.gz


# tar -xf hadoop-2.7.0.tar.gz  -C /hadoop


三、集群配置

# cd /hadoop/etc/hadoop 

-- 切换到hadoop 目录:


# cat masters 

master

# cat etc/hadoop/slaves 

datanode1

datanode2

datanode3


四、主要配置文件修改参考

1、配置 hadoop-env.sh


# cat hadoop-env.sh

export JAVA_HOME=/usr/local/java


2、配置 core-site


# cat core-site.xml

<configuration>

<property>

       <name>fs.defaultFS</name>

  <!-- 指定hdfs的nameservice为master -->

       <value>hdfs://master:9000</value>

</property>

<property>

       <name>hadoop.tmp.dir</name>

  <!-- 指定hadoop临时目录 -->

       <value>/hadoop/data/hadoop/tmp</value>

</property>

</configuration>


3、配置 hdfs-site


# cat hdfs-site.xml

<configuration>

<property>

      <name>dfs.namenode.name.dir</name>

      <value>/hadoop/data/hadoop/hdfs/namedode</value>

</property>

<property>

<name>dfs.namenode.http-address</name>

<value>master:50070</value>

</property>

<property>

       <name>dfs.datanode.data.dir</name>

       <value>/hadoop/data/hadoop/hdfs/namenode</value>

</property>


<property>      

       <name>dfs.replication</name>

       <value>3</value>

</property>


<property>

       <name>dfs.namenode.secondary.http-address</name>

       <value>master:9001</value>

</property>

<property>

       <name>dfs.webhdfs.enabled</name>

       <value>true</value>

</property>


</configuration>


4、配置 maped-site

# cat mapred-site.xml

<configuration>

<property>

        <name>mapreduce.framework.name</name>

        <value>yarn</value>

    </property>


   <property>

        <name>mapreduce.jobhistory.address</name>

        <value>master:10020</value>

    </property>


    <property>

        <name>mapreduce.jobhistory.webapp.address</name>

        <value>master:19888</value>

    </property>

</configuration>



初始化数据节点,在master上执行如下命令

# hadoop namenode -format


5、启动Hadoop

在master节点上执行Hadoop的start-all.sh脚本即可实现启动整个集群。

# start-all.sh


访问 http://master:50070  查看集群状态;



如果要停止Hadoop的各进程,则使用stop-all.sh脚本即可。

在一个较大规模的集群环境中,NameNode节点需要在内在中维护整个名称空间中的文件和块的元数据信息,因此,其有着较大的内在需求;而在运行着众多MapReduce任务的环境中,JobTracker节点会用到大量的内存和CPU资源,因此,此场景中通常需要将NameNode和JobTracker运行在不同的物理主机上,这也意味着HDFS集群的主从节点与MapReduce的主从节点将分属于不同的拓扑。启动HDFS的主从进程则需要在NameNode节点上使用start-dfs.sh脚本,而启动MapReduce的各进程则需要在JobTracker节点上通过start-mapred.sh脚本进行。这两个脚本事实上都是通过hadoop-daemons.sh脚本来完成进程启动的。


五、hadoop 环境设定参考;

1、 内存设定

默认情况下,Hadoop为每个进程分配1000MB(1GB)的内存空间,但这可以在hadoop-env.sh文件中通过HADOOP_HEAPSIZE环境变量进行调整。此外,TaskTracker会为worker主机上的每个map或reduce任务的分别启动一个JVM,这些JVM都需要在进程的HEAP中申请用到内存空间。每个TaskTracker可同时运行的map任务总数和reduce任务总数分别由mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum这两个属性进行指定,而它们的默认值都为2。用于运行map或reduce任务的JVM可用内存大小可由mapred.child.java.opts属性指定,其默认设定为-Xmx200m,意指每个任务可以使用最多200MB的内存空间。由此算来,每个worker主机默认将使用2800MB的内存空间。


除了使用mapred.child.java.opts为每个JVM为map任务和reduce任务设定相同可用内存属性之外,还可以使用mapreduce.map.java.opts和mapreduce.reduce.java.opts分别设定map任务和reduce任务的JVM可用内存的属性。


在TaskTracker上可同时运行的任务数取决于其主机的CPU数量。由于MapReduce作业大多为I/O密集型应用,因此,让同行运行任务数多于CPU的个数可以提高资源利用效率,其可以多出的数量取决于实际的作业本身。这里有一个通用法则,即让同行运行的作业数量为CPU数量的1至2之间的数字倍数,比如作业数1.5倍于CPU数。与此同时,一定要注意系统上可用内存的数量是否符合任务数的设定,比如在一个4颗CPU的DataNode上,可以设定mapred.tasktracker.map.tasks.maximum和mapred.tasktrackers.reduce.tasks.maximum属性的值都为3(不是4个,因为datanode和tasktracker都是运行的任务,它们要占去两个名额),假设每个任务的可用内存为400MB,那么这些作业总共需要的内存数为6*400MB,即2.4GB,考虑到操作系统及其它进程所需用的内存等,这个数值可能需要更大。


在hadoop-env.sh文件中,可以使用HADOOP_NAMENODE_OPTS、HADOOP_SECONDARYNAMENODE_OPTS、HADOOP_DATANODE_OPTS、HADOOP_BALANCER_OPTS、HADOOP_JOBTRACKER_OPTS变量分别为对应的5类进程设定运行参数,比如可以使用HADOOP_NAMENODE_OPTS单独设定namenode进程使用不的HEAPSIZE大小。


2、 Hadoop日志


Hadoop的系统日志默认存放于其安装目录中的logs子目录,如果需要自定义其存储位置,可以在hadoop-env.sh中设定HADOOP_LOG_DIR环境变量来指定新位置。Hadoop的每个进程均会生成两个日志文件,一个是由log4j生成的并以.log为后缀的日志文件,另一个是以.out为后缀的日志文件,它负责记录发往标准输出和错误输出的信息。


大多数应用的日志住处均发送至.log类的文件中,因此在故障排查时其也是最需要关注的日志文件。然后,Hadoop为log4j提供的默认配置中,其每天会自动做一次日志滚动,并且永远不会删除日志文件,因此,管理员需要手动归档并删除老旧的日志文件。.out类的日志文件中很少出现信息,而且,Hadoop的每次重启都会导致日志自动滚动,并只会保存最至5次的滚动日志文件版本。


除了后缀不同之外,这两种日志文件的名称格式是一样的,默认均为hadoop-<username>-<processname>-<hostname>,比如hadoop-hadoop-namenode-master.magedu.com.log。可以在hadoop-env.sh文件中使用HADOOP_IDENT_STRING变量将日志文件名称格式中的<username>限制为所需要的字符串。


3、 SSH相关的设定


Hadoop运行时,它利用控制脚本(如start-dfs.sh)在master节点上基于SSH远程管理各worker节点上的进程,因此,为SSH设定合适的参数将用助于Hadoop的健壮性,如合适的连接超时时间(ConnectTimeout)将有助于Hadoop避免被失效的节点阻塞,将StrictHostKeyChecking设定为no将能够使得master自动添加各节点的主机密钥等。


Hadoop的控制脚本可以使用rsync将配置文件同步至集群中的其它节点,默认为禁用。如果需要,可以通过HADOOP_MASTER变量将其启用。不过,由于各点上HADOOP_MASTER默认均为禁用,因此,其第一次配置还是需要其它的方式进行。


其它各SSH相关参数说明及其用法在hadoop-env.sh中均有详细注释,因此,这里不再给出进一步信息。


Hadoop的其它常用属性


4、 缓冲大小(Buffer size)


Hadoop为其I/O操作使用了4KB的缓冲区容量,这个值是相当保守的。在当今的硬件和操作系统上,可以安全地增大此值以提高系统性能;一般说来,128KB(131072 bytes)是比较理想的设定。如果需要,可以在core-site.xml中通过io.file.buffer.size属性进行定义。


5、 HDFS块大小


HDFS默认块大小为64MB,然而128MB(134,217,728 bytes)是更常用的设定,甚至有些集群中使用了256MB。较大的块可以有效降低NameNode上的内存压力,并能支持使用更多的数据量。如果需要,可以在hdfs-site.xml文件中使用dfs.block.size属性进行定义。


6、 慢启动Reduce任务


在一个作业中,默认情况下调度器会在map任务完成5%时开始调度启动当前作业的reduce任务。对于较大的作业来说,过早地启动reduce会导致集群性能的下降。在mapred-site.xml文件中为mapred.reduce.slowstart.completed.maps属性来设定一个更大的值(比如0.8,即80%)可以在更晚的时间点启动reduce作业。