各机器及角色信息:
共10台机器,hostname与ip地址映射在此不做赘述。此为模拟开发环境安装,所以不考虑将NameNode和SecondaryNameNode安装在同一台机器。
节点
角色
namenode01 namenode namenode02 secondarynamenode datanode01 datanode datanode02 datanode datanode03 datanode datanode04 datanode datanode05 datanode datanode06 datanode datanode07 datanode datanode08 datanode
步骤:
因为hadoop依赖JDK环境,必须先进行JDK安装,步骤另行参考资料。此处默认已经安装过JDK环境,并做过环境变量配置。
一、设置各节点ssh免密码登录
1.进入到当前用户的.ssh目录下
cd ~/.ssh
2.执行ssh公钥生成命令,出现确认选项直接回车即可
ssh-keygen –t rsa
3.生成:id-rsa、id-rsa.pub两个文件,执行命令将.pub文件放入到认证文件中
cat id-rsa.pub >> authorized_keys自此本机的ssh免密码登录已经设置完成,可以执行命令:ssh localhost 进行验证,不需密码直接登入即为成功。
4.剩下9台机器如法炮制。都完成本机ssh-免密码登录之后,将各节点的authorized_keys拷贝汇总到一台机器,分别追加到authorized_keys中。此处是将nn02以及dn0*全部拷贝到nn01上,执行:
cat authorized_keys_* >> authorized_keys
5.此时所有节点都可对nn01进行免密码登录,然后将nn01的authorized_keys拷贝到其余节点,覆盖原来的authorized_keys即可。
避免一台一台复制,可以写一个简单的脚本,实现群体复制,代码如下供参考:(脚本名称:scpFile 使用方法:脚本第一个参数表示源文件,第二个参数是要拷贝到其余节点的位置路径,ex: ./scpFile ~/.ssh/authorized_keys ~/.ssh/ )
#/bin/bash # HostName which is copying files to. ipNum="namenode02 datanode01 datanode02 datanode03 datanode04 datanode05 datanode06 datanode07 datanode08" # Path of source file #src="/home/sys/hadoop-2.6.1/etc/hadoop/hadoop-env.sh" src=$1 # Destination of the file moved #dest="/home/sys/hadoop-2.6.1/etc/hadoop/" dest=$2 # Execute copying operation for next in ${ipNum} do # echo ${next} scp -r ${src} root@$next:${dest} echo "Copy file to root@${next}:${dest} is done!~" done
二、关闭防火墙
1.暂时性关闭防火墙
service iptables stop2.设置开机不启动防火墙
chkconfig iptables off3.查看防火墙状态
service iptables status三、解压hadoop包,并修改配置
1.解压hadoop压缩包,指定到 /home/sys/ 目录
tar –zxvf hadoop-2.6.1.tar.gz –C /home/sys/2.增加hadoop的环境变量到 /etc/profile 中:
export HADOOP_HOME=/home/sys/hadoop-2.6.1 export PATH=.:$HADOOP_HOME/bin:$PATH3.修改配置文件,共8个(hadoop-env.sh、yarn-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、masters、slaves)
cd $HADOOP_HOME/etc/hadoop/在hadoop-env.sh和yarn-env.sh中指定 JAVA_HOME:
export JAVA_HOME=/home/sys/jdk1.8.0_65
编辑core-site.xml,增加如下内容:
<!-- hdfs的访问名称及端口 --> <property> <name>fs.defaultFS</name> <value>hdfs://namenode01:9000</value> <description>The name of the default file system.</description> </property> <!-- 临时目录 --> <property> <name>hadoop.tmp.dir</name> <value>/home/tmp</value> <description>A base for other temporary directories.</description> </property>编辑hdfs-site.xml,增加如下内容:
<property> <name>dfs.namenode.name.dir</name> <value>/home/dfs/name</value> <description> Directory where HDFS name node store the name table(fsimage). </description> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/dfs/data</value> <description> Directory where HDFS data node store blocks. </description> </property> <!-- NameNode和SecondaryNameNode分离的情况下,此项配置不可少,会影响SecondaryNameNode从NameNode拷贝镜像文件的存储,不配置的话,NameNode宕机,Secondary找不着备份的镜像文件 --> <property> <name>dfs.namenode.checkpoint.dir</name> <value>/home/dfs/namesecondary</value> <description> Determines where on the local filesystem the DFS secondary name node should store the temporary images to merge. </description> </property> <property> <name>dfs.replication</name> <value>2</value> <description> HDFS block replication. </description> </property> <property> <name>dfs.blocksize</name> <value>134217728</value> <description> HDFS storage blocksize. </description> </property> <!-- 将NameNode和SecondaryNameNode分离开的配置分别指定namenode和secondarynamenode的启动节点 --> <property> <name>dfs.namenode.http-address</name> <value>namenode01:50070</value> <description> The address and the base port where the dfs namenode web ui will listen on. </description> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>namenode02:50090</value> <description> The secondary namenode http server address and port. </description> </property> <property> <name>dfs.namenode.checkpoint.period</name> <value>3600</value> <description> The number of seconds between two periodic checkpoints. </description> </property>编辑mapred-site.xml,增加如下内容:
<property> <name>mapreduce.framework.name</name> <value>yarn</value> <description> The runtime framework for executing MapReduce jobs. Can be one of local, classic or yarn. </description> </property>编辑yarn-site.xml,增加如下内容:
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> <description> the valid service name should only contain a-zA-Z0-9_ and can not start with numbers </description> </property><!-- 指定resourcemanager的节点,若无此段配置,将会出现DataNode节点上的nodemanager进程启动一段时间之后自动消失的问题 --> <property> <description>The hostname of the RM.</description> <name>yarn.resourcemanager.hostname</name> <value>namenode01</value> </property>创建文件 masters,增加如下内容:(实现namenode和secondarynamenode分离)
namenode02修改文件 slaves,增加如下内容:
datanode01 datanode02 datanode03 datanode04 datanode05 datanode06 datanode07 datanode08
将hadoop文件夹拷贝到其他节点,使用上面的脚本scpFile
scpFile /home/sys/hadoop-2.6.1 /home/sys/二、集群启动
格式化操作,进入到namenode01的hadoop根目录下,执行:
bin/hadoop namenode –format出现Successfully字样的时候,即为格式化成功
注意:如果需要再次及多次格式化namenode,一定把hdfs-site.xml中dfs.datanode.data.dir目录清空一下,否则会造成重新格式化后DataNode启动不起来的问题。
因为该目录下有一个版本号,多次格式化可能导致DataNode和NameNode的版本号不一致。
启动dfs文件系统
sbin/start-dfs.sh
验证,jps命令查看:
namenode01上出现NameNode进程
namenode02上出现SecondaryNameNode进程
datanode0*上出现DataNode进程
即为启动dfs成功
启动yarn
sbin/start-yarn.sh
验证,jps命令查看:
namenode01上出现ResourceManager进程
datanode0*上出现NodeManager进程
即为启动yarn成功
三、修改hadoop启动日志目录
修改namenode、datanode节点默认日志目录
编辑hadoop-env.sh,修改HADOOP_LOG_DIR
export HADOOP_LOG_DIR=your path修改resourcemanager、nodemanager日志目录
编辑yarn-env.sh,修改YARN_LOG_DIR
if [ "$YARN_LOG_DIR" = "" ]; then YARN_LOG_DIR="your path"不可在hadoop-env.sh中看到‘# Where log files are stored. $HADOOP_HOME/logs by default.’就省略,默认的配置是/logs/,显然是
$HADOOP_HOME未生效,原因待查找,暂用绝对路径处理。
四、去除本地库加载失败的警告信息
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
原因:Apache提供的hadoop本地库是32位的,而在64位的服务器上就会有问题
修改加载本地库的日志级别
编辑 $HADOOP_HOME/etc/hadoop/log4j.properties,增加如下内容:
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR