您的位置:首页 > 运维架构

Hadoop第3周练习--Hadoop2.X编译安装和实验

2015-08-31 16:49 651 查看
转载:http://www.cnblogs.com/shishanyuan/p/4164104.html

1 作业题目
2 编译HADOOP2.X 64BIT
2.1 运行环境说明
2.1.1 硬软件环境
2.1.2 集群网络环境
2.2 环境搭建
2.2.1 JDK安装和Java环境变量配置
2.2.2 安装并设置maven
2.2.3 以root用户使用yum安装svn
2.2.4 以root用户使用yum安装autoconf automake libtool cmake
2.2.5 以root用户使用yum安装ncurses-devel
2.2.6 以root用户使用yum安装openssl-devel
2.2.7 以root用户使用yum安装gcc*
2.2.8 安装并设置protobuf
2.3 编译Hadoop
2.3.1 下载Hadoop源代码 Release2.2.0
2.3.2 编译Hadoop源代码
2.3.3 验证编译是否成功
3 HADOOP2.X 64BIT安装
3.1 运行环境说明
3.1.1 硬软件环境
3.1.2 集群网络环境
3.1.3 安装使用工具
3.2 环境搭建
3.2.1 配置本地环境
3.2.2 设置操作系统环境
3.3 配置Hadooop设置
3.3.1 下载并解压hadoop安装包
3.3.2 在Hadoop目录下创建子目录
3.3.3 配置hadoop-env.sh
3.3.4 配置yarn-env.sh
3.3.5 配置core-site.xml
3.3.6 配置hdfs-site.xml
3.3.7 配置mapred-site.xml
3.3.8 配置yarn-site.xml
3.3.9 配置slaves文件
3.3.10向各节点分发hadoop程序
3.3.11格式化namenode
3.3.12启动hdfs
3.3.13验证当前进行
3.3.14启动yarn
3.3.15验证当前进行
4 实验性问题解决
4.1 运行环境说明
4.1.1 硬软件环境
4.1.2 集群网络环境
4.2 问题1--给web监控界面加上安全机制
4.2.1 修改Core-Site.xml文件
4.2.2 手动创建signature-secret文件
4.2.3 把该文件分发到两个datanode中
4.2.4 重新启动hadoop
4.2.5 验证访问
4.3 问题2--模拟namenode崩溃并恢复
4.3.1 删除NameNode中Name目录下所有文件,模拟崩溃
4.3.2 重启Hadoop
4.3.3 格式化NameNode
4.3.4 获取DataNode的namespaceID
4.3.5 修改NameNode的namespaceID
4.3.6 删除NameNode的fsimage
4.3.7 从SSN中拷贝fsimage到NN中
4.3.8 重启Hadoop
4.4 问题3--改变HDFS块大小
4.4.1 在Hadoop中建立/input文件夹
4.4.2 查看当前blocksize
4.4.3 修改hdfs-site.xml配置文件
4.4.4 重启Hadoop
4.4.5 再次查看当前blocksize
4.5 问题4--SNN与NN的分离
4.5.1 复制虚拟机
4.5.2 设置SNN虚拟机IP地址
4.5.3 设置SNN虚拟机名称
4.5.4 所有节点hosts 文件加入SNN的 IP对应信息
4.5.5 所有节点masters文件加入SNN信息
4.5.6 所有节点中修改hdfs-site.xml
4.5.7 重启所有虚拟机
4.5.8 配置ssh免密码登录
4.5.9 重新格式化NameNode
4.5.10启动Hadoop
4.5.11验证
4.6 问题5--再次格式化namenode,此时datanode是否能加入
4.6.1 停止Hadoop并格式化
4.6.2 启动Hadoop,并查看datanode状态
4.6.3 查看datanode日志
4.6.4 解决办法
4.6.5 重启集群,查看datanode状态
4.7 问题6--控制namenode检查点发生的频率
4.7.1 在core-site.xml中修改检查点频率
4.7.2 重启集群,查看检查点更新频率
4.7.3 观察checkpoint 前后 namenode的变化
4.7.4 基本原理
5 问题解决
5.1 安装CentOS64位虚拟机 This host supports Intel VT-x, but Intel VT-x is disabled
5.2 *** is not in the sudoers file解决方法
5.3 yum无法下载
5.4 CentOS 64bit安装Hadoop2.2.0中出现文件编译位数异常
5.5 编译Hadoop2.2.0出现代码异常

1 作业题目

1. 部署Hadoop 2.x,建议尝试64位系统下进行本地编译的安装方式
2. 在Hadoop 1.x上进行探索性的实验研究,以下问题6选2
(1) 能否给web监控界面加上安全机制,怎样实现?抓图过程
(2)模拟namenode崩溃,例如将name目录的内容全部删除,然后通过secondary namenode恢复namenode,抓图实验过程
(3) 怎样改变HDFS块大小?实验验证并抓图过程
(4) 把secondary namenode和namenode分离,部署到单独的节点,抓图实验过程
(5) 在Hadoop集群实施成功后,再次格式化名称节点,请问此时datanode还能加入集群不?如果不能加入怎样解决?模拟过程并抓图
(6) 怎样控制namenode检查点发生的频率,用实验模拟检查点发生的前后过程,并抓图发生前和发生后的元数据情况进行比较,说明之

2 编译Hadoop2.X 64bit

2.1 运行环境说明

2.1.1硬软件环境

l 主机操作系统:Windows 64 bit,双核4线程,主频2.2G,6G内存
l 虚拟软件:VMware® Workstation 9.0.0 build-812388
l 虚拟机操作系统:CentOS 6.5 64位,单核,1G内存
l JDK:1.7.0_55 64位
l Hadoop:Release 2.3.0 source

2.1.2集群网络环境

集群只包含一个节点,设置IP地址为192.168.1.200。

2.2 环境搭建

2.2.1JDK安装和Java环境变量配置

1. 下载JDK1.7 64bit安装包
打开JDK1.7 64bit安装包下载链接为: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 打开界面之后,先选中 Accept License Agreement ,然后下载 jdk-7u55-linux-x64.tar.gz,如下图所示:




2. 赋予hadoop用户/usr/lib/java目录可读写权限,使用命令如下:
sudo chmod -R 777 /usr/lib/java



3. 把下载的安装包,使用ssh工具上传到/usr/lib/java 目录下,使用如下命令进行解压
tar -zxvf jdk-7u55-linux-x64.tar.gz



解压后目录如下图所示:



4. 使用root用户配置 /etc/profile,该设置对所有用户均生效
vi /etc/profile



export JAVA_HOME=/usr/lib/java/jdk1.7.0_55
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar



5. 重新登录并验证
logout
java -version



2.2.2安装并设置maven

1. 下载maven安装包,建议安装3.0以上版本,本次安装选择的是maven3.0.5的二进制包,下载地址如下 http://mirror.bit.edu.cn/apache/maven/maven-3/


2. 使用ssh工具把maven包上传到/home/hadoop/Downloads目录



3. 解压缩apache-maven-3.0.5-bin.tar.gz包
tar -zxvf apache-maven-3.0.5-bin.tar.gz



4. 把apache-maven-3.0.5目录移到/usr/local目录下
sudo mv apache-maven-3.0.5 /usr/local



5. 在/etc/profile配置文件中加入如下设置
export PATH=$JAVA_HOME/bin:/usr/local/apache-maven-3.0.5/bin:$PATH



6. 编辑/etc/profile文件并验证配置是否成功:
source /etc/profile
mvn -version



2.2.3以root用户使用yum安装svn

yum install svn






2.2.4以root用户使用yum安装autoconf automake libtool cmake

yum install autoconf automake libtool cmake






2.2.5以root用户使用yum安装ncurses-devel

yum install ncurses-devel



2.2.6以root用户使用yum安装openssl-devel

yum install openssl-devel






2.2.7以root用户使用yum安装gcc*

yum install gcc*






2.2.8安装并设置protobuf

注:该程序包需要在gcc安装完毕后才能安装,否则提示无法找到gcc编译器。
1. 下载protobuf安装包
下载链接为: https://code.google.com/p/protobuf/downloads/list


2. 使用ssh工具把protobuf-2.5.0.tar.gz包上传到/home/hadoop/Downloads目录



3. 解压安装包
tar -zxvf protobuf-2.5.0.tar.gz






4. 把protobuf-2.5.0目录转移到/usr/local目录下
sudo mv protobuf-2.5.0 /usr/local



5. 进行目录运行命令
进入目录以root用户运行如下命令:
./configure
make
make check
make install






6. 验证是否安装成功
运行成功之后,通过如下方式来验证是否安装成功
protoc



2.3 编译Hadoop

2.3.1下载Hadoop源代码 Release2.2.0

通过SVN获取Hadoop2.2.0源代码,在/home/hadoop/Downloads目录下命令:
svn checkout http://svn.apache.org/repos/asf/hadoop/common/tags/release-2.2.0 获取时间较长,大小约75.3M



2.3.2编译Hadoop源代码

:) 由于hadoop2.2.0在svn中pom.xml有点问题,会造成编译中出错,可先参考5.5修复该问题。在Hadoop源代码的根目录执行如下命令:
mvn package -Pdist,native -DskipTests –Dtar
(注意:这行命令需要手工输入,如果复制执行会报异常!)



耗费的时间较长,总共花费了32分钟,在编译过程需要联网,从网络中下载所需要的资料。






2.3.3验证编译是否成功

到 hadoop-dist/target/hadoop-2.2.0/lib/native 目录中查看libhadoop.so.1.0.0属性:
file ./libhadoop.so.1.0.0
该文件为ELF 64-bit LSB则表示文件成功编译为64位



在hadoop-dist/target目录中已经打包好了hadoop-2.2.0.tar.gz,该文件作为Hadoop2.X 64位安装包。



3 Hadoop2.X 64bit安装

3.1 运行环境说明

3.1.1硬软件环境

l 主机操作系统:Windows 64 bit,双核4线程,主频2.2G,6G内存
l 虚拟软件:VMware® Workstation 9.0.0 build-812388
l 虚拟机操作系统:CentOS 64位,单核,1G内存
l JDK:1.7.0_55 64位
l Hadoop:2.2.0

3.1.2集群网络环境

集群包含三个节点:1个namenode、2个datanode,其中节点之间可以相互ping通。节点IP地址和主机名分布如下:
序号
IP地址
机器名
类型
用户名
1
10.88.147.226
hadoop1
名称节点
hadoop
2
10.88.147.227
hadoop2
数据节点
hadoop
3
10.88.147.228
hadoop3
数据节点
hadoop
所有节点均是CentOS6.5 64bit系统,防火墙均禁用,所有节点上均创建了一个hadoop用户,用户主目录是/usr/hadoop。所有节点上均创建了一个目录/usr/local/hadoop,并且拥有者是hadoop用户。因为该目录用于安装hadoop,用户对其必须有rwx权限。(一般做法是root用户在/usr/local下创建hadoop目录,并修改该目录拥有者为hadoop(chown –R
hadoop /usr/local/hadoop),否则通过SSH往其他机器分发Hadoop文件会出现权限不足的提示。

3.1.3安装使用工具

3.1.3.1Linux文件传输工具

向Linux系统传输文件推荐使用SSH Secure File Transfer,该工具顶部为工具的菜单和快捷方式,中间部分左面为本地文件目录,右边为远程文件目录,可以通过拖拽等方式实现文件的下载与上传,底部为操作情况监控区,如下图所示:



3.1.3.2Linux命令行执行工具

l SSH Secure Shell
SSH Secure工具的SSH Secure Shell提供了远程命令执行,如下图所示:




l SecureCRT
SecureCRT是常用远程执行Linux命令行工具,如下图所示:




3.2 环境搭建

本次安装集群分为三个节点,节点设置按照2.1.2章节进行设置。环境搭建分为两部分,具体为配置本地环境和设置操作系统环境。

3.2.1配置本地环境

该部分对服务器的配置需要在服务器本地进行配置,配置完毕后需要重启服务器确认配置是否生效,特别是远程访问服务器需要设置固定IP地址。

3.2.1.1设置IP地址

1. 点击System-->Preferences-->Network Connections,如下图所示:



2. 修改或重建网络连接,设置该连接为手工方式,设置如下网络信息:
IP地址: 10.88.147.*
子网掩码: 255.255.255.0
网关: 10.88.*.*
DNS: 10. **.***.** (上网需要设置DNS服务器)
注意:网关、DNS等根据所在网络实际情况进行设置,并设置连接方式为"Available to all users",否则通过远程连接时会在服务器重启后无法连接服务器



3. 在命令行中,使用ifconfig命令查看设置IP地址信息,如果修改IP不生效,需要重启机器再进行设置(如果该机器在设置后需要通过远程访问,建议重启机器,确认机器IP是否生效):



3.2.1.2设置机器名

以root用户登录,使用 vi /etc/sysconfig/network 打开配置文件,根据实际情况设置该服务器的机器名,新机器名在重启后生效



3.2.1.3设置Host映射文件

1. 使用root身份编辑/etc/hosts映射文件,设置IP地址与机器名的映射,设置信息如下:
vi /etc/hosts
l 10.88.147.226 hadoop1
l 10.88.147.227 hadoop2
l 10.88.147.228 hadoop3



2. 使用如下命令对网络设置进行重启
/etc/init.d/network restart



3. 验证设置是否成功



3.2.1.4上网配置

第一步 以root用户使用vi /etc/profile命令打开配置文件,如下图所示:



第二步 在该文件设置如下配置:
export http_proxy=proxy.*****:8080
export no_proxy="localhost,10.88.*,hadoop*"
export https_proxy=proxy.*****:8080



3.2.2设置操作系统环境

3.2.2.1关闭防火墙

在Hadoop安装过程中需要关闭防火墙和SElinux,否则会出现异常
1. service iptables status 查看防火墙状态,如下所示表示iptables已经开启



2. 以root用户使用如下命令关闭iptables
chkconfig iptables off



3.2.2.2关闭SElinux

1. 使用getenforce命令查看是否关闭



2. 修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled,执行该命令后重启机器生效



3.2.2.3JDK安装及配置

7. 下载JDK1.7 64bit安装包
打开JDK1.7 64bit安装包下载链接为: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 打开界面之后,先选中 Accept License Agreement ,然后下载 jdk-7u55-linux-x64.tar.gz,如下图所示:




8. 赋予hadoop用户/usr/lib/java目录可读写权限,使用命令如下:
sudo chmod -R 777 /usr/lib/java



该步骤有可能遇到问题5.2,可参考解决办法处理
9. 把下载的安装包,使用2.1.3.1介绍的ssh工具上传到/usr/lib/java 目录下,使用如下命令进行解压
tar -zxvf jdk-7u55-linux-x64.tar.gz



解压后目录如下图所示:



10. 使用root用户配置 /etc/profile,该设置对所有用户均生效
vi /etc/profile



export JAVA_HOME=/usr/lib/java/jdk1.7.0_55
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar



11. 重新登录并验证
logout
java -version



3.2.2.4更新OpenSSL

C自带的OpenSSL存在bug,如果不更新OpenSSL在Ambari部署过程会出现无法通过SSH连接节点,使用如下命令进行更新:
yum update openssl







该步骤有可能遇到问题5.3,可参考解决办法处理

3.2.2.5SSH无密码验证配置

1. 以root用户使用vi /etc/ssh/sshd_config,打开sshd_config配置文件,开放三个配置,如下图所示:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys



2. 配置后重启服务
service sshd restart



3. 完成以上步骤后,复制该虚拟机两份,分别为hadoop2和hadoop3数据节点,IP设置参见1.2章节
4. 使用hadoop用户登录在三个节点中使用如下命令生成私钥和公钥;
ssh-keygen -t rsa



5. 进入/home/hadoop/.ssh目录在三个节点中分别把公钥命名为authorized_keys_hadoop1、authorized_keys_hadoop2和authorized_keys_hadoop3,使用命令如下:
cp id_rsa.pub authorized_keys_hadoop1



6. 把两个从节点(hadoop2、hadoop3)的公钥使用scp命令传送到hadoop1节点的/home/hadoop/.ssh文件夹中;
scp authorized_keys_hadoop2 hadoop@hadoop1:/home/hadoop/.ssh






7. 把三个节点的公钥信息保存到authorized_key文件中
使用cat authorized_keys_hadoop1 >> authorized_keys 命令



8. 把该文件分发到其他两个从节点上
使用scp authorized_keys hadoop@hadoop2:/home/hadoop/.ssh把密码文件分发出去






9. 在三台机器中使用如下设置authorized_keys读写权限
chmod 400 authorized_keys



10. 测试ssh免密码登录是否生效



3.3 配置Hadooop设置

3.3.1下载并解压hadoop安装包

1. 在Apache网站上提供Hadoop2.X安装包只支持32位操作系统安装,在64位服务器安装会出现5.4的错误异常。我们使用上一步骤编译好的hadoop-1.1.2-bin.tar.gz文件作为安装包(也可以从网上下载native文件夹或者打包好的64位hadoop安装包),使用2.1.3.1介绍的ssh工具上传到/home/hadoop/Downloads 目录下



2. 在主节点上解压缩
cd /home/hadoop/Downloads/
tar -xzvf hadoop-2.2.0.tar.gz






3. 把hadoop-2.2.0目录移到/usr/local目录下
sudo mv hadoop-2.2.0 /usr/local
cd /usr/local
ls



4. 使用chown命令遍历修改hadoop-1.1.2目录所有者为hadoop
sudo chown -R hadoop /usr/local/hadoop-2.2.0




3.3.2在Hadoop目录下创建子目录

使用hadoop用户在hadoop-2.2.0目录下创建tmp、name和data目录,保证目录所有者为hadoop
mkdir tmp
mkdir name
mkdir data
ls



3.3.3配置hadoop-env.sh

1. 打开配置文件hadoop-env.sh
cd etc/hadoop
sudo vi hadoop-env.sh



2. 加入配置内容,设置了hadoop中jdk和hadoop/bin路径
export JAVA_HOME=/usr/lib/java/jdk1.7.0_55
export PATH=$PATH:/usr/local/hadoop-2.2.0/bin



3. 编译配置文件hadoop-env.sh,并确认生效
source hadoop-env.sh
hadoop version



3.3.4配置yarn-env.sh

1. 在/usr/local/hadoop-2.2.0/etc/hadoop打开配置文件yarn-env.sh
cd /usr/local/hadoop-2.2.0/etc/hadoop
sudo vi yarn-env.sh



2. 加入配置内容,设置了hadoop中jdk和hadoop/bin路径
export JAVA_HOME=/usr/lib/java/jdk1.7.0_55



3. 编译配置文件yarn-env.sh,并确认生效
source yarn-env.sh



3.3.5配置core-site.xml

1. 使用如下命令打开core-site.xml配置文件
sudo vi core-site.xml



2. 在配置文件中,按照如下内容进行配置
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop-2.2.0/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>hadoop.proxyuser.hduser.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hduser.groups</name>
<value>*</value>
</property>
</configuration>



3.3.6配置hdfs-site.xml

1. 使用如下命令打开hdfs-site.xml配置文件
sudo vi hdfs-site.xml



2. 在配置文件中,按照如下内容进行配置
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop-2.2.0/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop-2.2.0/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>



3.3.7配置mapred-site.xml

1. 默认情况下不存在mapred-site.xml文件,可以从模板拷贝一份
cp mapred-site.xml.template mapred-site.xml



2. 使用如下命令打开mapred-site.xml配置文件
sudo vi mapred-site.xml



3. 在配置文件中,按照如下内容进行配置
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
</configuration>



3.3.8配置yarn-site.xml

1. 使用如下命令打开yarn-site.xml配置文件
sudo vi yarn-site.xml



2. 在配置文件中,按照如下内容进行配置
<configuration>
<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.resourcemanager.address</name>
<value>hadoop1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop1:8088</value>
</property>
</configuration>



3.3.9配置slaves文件

1. 设置从节点
sudo vi slaves
hadoop2
hadoop3






3.3.10 向各节点分发hadoop程序

1. 在hadoop2和hadoop3机器中创建/usr/local/hadoop-2.2.0目录,然后修改该目录所有权限
sudo mkdir /usr/local/hadoop-2.2.0
sudo chown –R hadoop /usr/local/hadoop-2.2.0



2. 在hadoop1机器上进入/usr/local/hadoop-2.2.0目录,使用如下命令把hadoop文件夹复制到hadoop2和hadoop3机器
使用命令scp -r * hadoop@hadoop2:/usr/local/hadoop-2.2.0




3. 在从节点查看是否复制成功



3.3.11 格式化namenode

./bin/hdfs namenode -format








3.3.12 启动hdfs

cd hadoop-2.2.0/sbin
./start-dfs.sh



如果服务器操作系统为32位时,出现问题5.4异常,可以参考解决

3.3.13 验证当前进行

此时在hadoop1上面运行的进程有:namenode,secondarynamenode



hadoop2和hadoop3上面运行的进程有:datanode



3.3.14 启动yarn

./start-yarn.sh



3.3.15 验证当前进行

此时在hadoop1上运行的进程有:namenode,secondarynamenode,resourcemanager



hadoop2和hadoop3上面运行的进程有:datanode,nodemanager






4 实验性问题解决

4.1 运行环境说明

以下实验性问题解决是在第1~2周搭建的环境下进行解决,即在Hadoop1.1.2版本下模拟问题的发生和解决。

4.1.1硬软件环境

l 主机操作系统:Windows 64 bit,双核4线程,主频2.2G,6G内存
l 虚拟软件:VMware® Workstation 9.0.0 build-812388
l 虚拟机操作系统:三个节点均为CentOS6.5 64位,单核,1G内存
l JDK:1.7.0_55 64位
l Hadoop:1.1.2

4.1.2集群网络环境

集群包含三个节点:1个namenode、2个datanode,其中节点之间可以相互ping通。节点IP地址和主机名分布如下:
序号
IP地址
机器名
类型
用户名
运行进程
1
10.88.147.221
hadoop1
名称节点
hadoop
NN、SNN、JobTracer
2
10.88.147.222
hadoop2
数据节点
hadoop
DN、TaskTracer
3
10.88.147.223
hadoop3
数据节点
hadoop
DN、TaskTracer
所有节点均是CentOS系统,防火墙均禁用,所有节点上均创建了一个hadoop用户,用户主目录是/usr/hadoop。所有节点上均创建了一个目录/usr/local/hadoop,并且拥有者是hadoop用户。

4.2 问题1--给web监控界面加上安全机制

4.2.1修改Core-Site.xml文件




以下为配置添加部分:
<property>
<name>hadoop.http.filter.initializers</name>
<value>org.apache.hadoop.security.AuthenticationFilterInitializer</value>
<description>HTTP Authentication document in hadoop tar file</description>
</property>
<property>
<name>hadoop.http.authentication.type</name>
<value>simple</value>
<description>authentication type for web UI</description>
</property>
<property>
<name>hadoop.http.authentication.token.validity</name>
<value>36000</value>
<description>how long authentication token is valid before it needs to be renewed</description>
</property>
<property>
<name>hadoop.http.authentication.signature.secret.file</name>
<value>/usr/local/hadoop-1.1.2/signature-secret</value>
<description>signature secret for signing authentication tokens</description>
</property>
<property>
<name>hadoop.http.authentication.cookie.domain</name>
<value></value>
<description>domain to use for the http cookie that stores authentication token</description>
</property>
<property>
<name>hadoop.http.authentication.simple.anonymous.allowed</name>
<value>false</value>
<description>anonymous web UI requests enabled or disabled</description>
</property>

4.2.2手动创建signature-secret文件

在/usr/local/hadoop-1.1.2目录下创建signature-secret文件,使用如下命令:
echo hadoop >signature-secret




4.2.3把该文件分发到两个datanode中

在namenode创建需要把这个文件分发到各个datanode,使用如下命令:
scp signature-secret hadoop@hadoop2:/usr/local/hadoop-1.1.2



4.2.4重新启动hadoop




4.2.5验证访问

使用http://10.88.147.221:50030/jobtracker.jsp访问jobtracker页面出现如下错误:



在http访问地址加入?user.name=hadoop就能够访问了,不过存在问题是user.name是可以随意输入,在http中明码传递,还是不安全!



4.3 问题2--模拟namenode崩溃并恢复

4.3.1删除NameNode中Name目录下所有文件,模拟崩溃

在NameNode节点中name目录为 /usr/local/hadoop-1.1.2/hdfs/name,使用如下命令删除该文件夹下所有文件:
cd /usr/local/hadoop-1.1.2/hdfs/name
rm -R *



4.3.2重启Hadoop

使用./stop-all.sh停止Hadoop,然后使用./start-all.sh启动Hadoop,通过jps命令可以看到namenode进程无法启动
cd /usr/local/hadoop-1.1.2/bin
./stop-all.sh
./start-all.sh



通过hadoop命令查看hdfs文件时无法连接,如下图所示:
hadoop fs -ls



查看logs文件夹下NameNode对应日志文件hadoop-hadoop-jobtracker-hadoop1.log,出现如下错误:
INFO org.apache.hadoop.mapred.JobTracker: Problem connecting to HDFS Namenode... re-trying
java.net.ConnectException: Call to hadoop1/10.88.147.221:9000 failed on connection exception: java.net.ConnectException: Connection refused



4.3.3格式化NameNode

停止Hadoop后,通过如下命令格式化Hadoop:
./stop-all.sh
./hadoop namenode -format



4.3.4获取DataNode的namespaceID

通过ssh连接到hadoop2节点,进入DataNode存放数据的文件夹 /usr/local/hadoop-1.1.2/hdfs/data/current,通过如下命令查看VERSION文件内容:
ssh hadoop2
cd /usr/local/hadoop-1.1.2/hdfs/data/current
ls
cat VERSION
获取namespaceID值



4.3.5修改NameNode的namespaceID

修改hadoop1机器NameNode目录/usr/local/hadoop-1.1.2/hdfs/name/current中VERSION文件中namespaceID值为上一步骤DataNode所对应的值,结果如下图所示:
cd /usr/local/hadoop-1.1.2/hdfs/name/current
vi VERSION






4.3.6删除NameNode的fsimage

通过如下命令删除NameNode中fsimage:
cd /usr/local/hadoop-1.1.2/hdfs/name/current
rm fsimage



4.3.7从SSN中拷贝fsimage到NN中

在NameNode中SSN路径为/usr/local/hadoop-1.1.2/tmp/dfs/namesecondary,把current文件夹下得fsimage拷贝到NN所在路径中,命令如下:
cd /usr/local/hadoop-1.1.2/tmp/dfs/namesecondary
cp fsimage /usr/local/hadoop-1.1.2/hdfs/name/current/



4.3.8重启Hadoop

启动Hadoop,使用jps命令查看,namenode进程正常启动
cd /usr/local/hadoop-1.1.2/bin
./start-all.sh



4.4 问题3--改变HDFS块大小

4.4.1在Hadoop中建立/input文件夹

使用如下命令在Hadoop中创建/input文件夹,把start开始的sh脚本文件放到该文件中:
cd /usr/local/hadoop-1.1.2/bin
./hadoop fs -mkdir /input
./hadoop fs -put *.sh /input
./hadoop fs -ls /input



4.4.2查看当前blocksize

查看hadoop2节点数据块大小情况,如下图所示:



4.4.3修改hdfs-site.xml配置文件

在NameNode节点hadoop1中修改hdfs-site.xml配置文件,加入如下配置:
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>



4.4.4重启Hadoop

重新启动Hadoop程序
./stop-all.sh
./start-all.sh



4.4.5再次查看当前blocksize

使用如下命令在Hadoop中创建/input1文件夹并复制文件到该文件夹覆盖之前操作的文件:
./hadoop fs -mkdir /input1
./hadoop fs -put *.sh /input1
再次在查看block size,如下图所示



4.5 问题4--SNN与NN的分离

4.5.1复制虚拟机

复制NameNode节点所在虚拟机作为SecondaryNameNode运行虚拟机



4.5.2设置SNN虚拟机IP地址

设置该虚拟机IP地址为:10.88.147.224



4.5.3设置SNN虚拟机名称

设置SNN虚拟机名称为:hadoop4
sudo vi /etc/sysconfig/network






4.5.4所有节点hosts 文件加入SNN的 IP对应信息

在所有节点/etc/hosts文件中加入SNN的IP地址10.88.147.224对应hadoop4
sudo vi /etc/hosts



4.5.5所有节点masters文件加入SNN信息

在所有节点masters文件中加入SNN机器名信息,使用如下命令:
sudo vi /usr/local/hadoop-1.1.2/conf/masters
在master文件中加入SNN机器名



4.5.6所有节点中修改hdfs-site.xml

使用如下命令编辑hdfs-site.xml配置文件:
sudo vi /usr/local/hadoop-1.1.2/conf/hdfs-site.xml
在hdfs-site.xml文件中加入如下信息:
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop4:50090</value>
</property>



4.5.7重启所有虚拟机




4.5.8配置ssh免密码登录

1. 在hadoop4(10.88.147.244)节点中使用ssh-keygen -t rsa生成私钥和公钥;



2. 把hadoop4(10.88.147.244)节点中公钥信息加入到authorized_keys文件中;
ll
chmod 400 -R /home/hadoop/.ssh
cat id_rsa.pub >> authorized_keys
cat authorized_keys



3. 把authorized_keys分发到各个节点上;
scp authorized_keys hadoop@hadoop1:/home/hadoop/.ssh



4. 验证是否能够免登录到各个节点;



4.5.9重新格式化NameNode

在/usr/local/hadoop-1.1.2/bin目录下使用如下命令进行格式化:
./hadoop namenode -format



4.5.10 启动Hadoop

使用如下命令启动Hadoop:
cd /usr/local/hadoop-1.1.2/bin
./start-all.sh



4.5.11 验证

1. 在hadoop1(NN)查看进程情况,启动了NameNode、JobTracker两个进程:



2. 在hadoop2、hadoop3查看进程情况,启动了TraskTracker进程:



(注意这个节点上DataNode并没有启动,这个问题是由于NameNode和DataNode之间的namespaceID不一致造成的,该问题的解决方法如4.6所描述)
3. 在hadoop4(SNN)查看进程情况,启动了SecondaryNameNode进程:



4.6 问题5--再次格式化namenode,此时datanode是否能加入

4.6.1停止Hadoop并格式化

使用如下命令停止Hadoop并格式化:
./stop-all.sh
./hadoop namenode -format



4.6.2启动Hadoop,并查看datanode状态

使用./start-all.sh启动Hadoop:



在datanode中使用jps查看启动状态:



4.6.3查看datanode日志

查看datanode节点hadoop2日志文件夹下日志内容:
cd /usr/local/hadoop-1.1.2/logs
cat hadoop-hadoop-datanode-hadoop2.log



报错信息为namenode与datanode之间的namespaceID不一致:
2014-09-30 10:04:41,890 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in
/usr/local/hadoop-1.1.2/hdfs/data: namenode namespaceID = 87263132; datanode namespaceID = 1318122769
at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:232)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:147)
at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:399)
at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:309)
at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1651)
at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1590)
at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1608)
at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1734)
at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1751)

4.6.4解决办法

有两个解决办法:
Ø 修改所有datanode中/usr/local/hadoop-1.1.2/tmp/dfs/data/current/VERSION 文件的namespaceID 为 namenode的namespaceID(采用该方法)
Ø 删除datanode 中 /usr/local/hadoop-1.1.2/tmp/dfs/data 目录

登录到hadoop1节点上,获取该节点NameNode的namespaceID:
cd /usr/local/hadoop-1.1.2/hdfs/name/current
cat VERSION



登录到hadoop2和hadoop3节点上,修改DataNode的namespaceID为NameNode的namespaceID的值:
cd /usr/local/hadoop-1.1.2/hdfs/data/current
vi VERSION



4.6.5重启集群,查看datanode状态

在namenode节点hadoop1使用./start-all.sh启动Hadoop:
./start-all.sh



在datanode节点hadoop2中使用jps查看启动状态:



datanode进程已经启动

4.7 问题6--控制namenode检查点发生的频率

4.7.1在core-site.xml中修改检查点频率

系统默认为1个小时即3600秒,在namenode节点中修改core-site.xml文件,加入如下配置内容:
<property>
<name>fs.checkpoint.period</name>
<value>180</value>
</property>



4.7.2重启集群,查看检查点更新频率

在namenode节点的目录 /usr/local/hadoop-1.1.2/hdfs/name/current中 fsimage、edits等的更新频率。每隔4分钟查看,发现namenode 每隔 180 秒 checkpoint 进行更新一次:



4.7.3观察checkpoint 前后 namenode的变化

1. 检查点发生前:
l namenode的fsimage和edits 最后修改时间为16:39。
l 16:40 向hdfs系统加入 input 文件,namenode 中的edits 记录这次操作,其修改时间为16:40
2. 检查点发生后
l namenode 中的fsimage、fsimage、fstime、VERSION等文件在16:42进行了检查点更新




4.7.4基本原理

当距离上个checkpoint 时间 为${fs.checkpoint.period} 时:
1. SSN请求NN滚动edits文件,使新的edits log 放到另一个新生成的edits文件。
2. SSN通过 HTTP GET 获取NN的fsimage和edits文件
3. SSN将fsimage文件载入内存,并应用edits 文件中的每一项操作,这样就创建了一个新的合成的fsimage 文件。
4. SSN采用 HTTP POST 方式 将刚合成的fsimage 发送回NN
5. NN用刚从SSN收到的fsimage代替老一版本的fsimage, 并用第一步中产生的edits 代替原先的edits,同时将fctime文件更新到checkpoint发生的时间
最终,名称节点就有了一份最新的fsimage文件和一个更短的edits文件(该edits文件不一定空,当SSN在执行checkpoint操作时,edits 可能已经记录下了一些hdfs系统的操作)

5 问题解决

5.1 安装CentOS64位虚拟机 This host supports Intel VT-x, but Intel VT-x is disabled

在进行Hadoop2.X 64bit编译安装中由于使用到64位虚拟机,安装过程中出现下图错误:



按F1 键进入BIOS 设置实用程序 使用箭头键security面板下找virtualization按Enter 键 进去Intel VirtualizationTechnology改成Enabled按F10 键保存并退出 选择Yes按Enter 键 完全关机(关闭电源)等待几秒钟重新启动计算机此Intel虚拟化技术开启成功

5.2 *** is not in the sudoers file解决方法

当使用hadoop用户需要对文件夹进行赋权,使用chmod命令出现“hadoop is not in the sudoers file. This incident will be reported”错误,如下所示:




1. 使用su命令进入root用户



2. 添加文件的写权限,操作命令为:chmod u+w /etc/sudoers



3. 编辑/etc/sudoers文件,使用命令"vi /etc/sudoers"进入编辑模式,找到:"root ALL=(ALL) ALL"在起下面添加"hadoop ALL=(ALL) ALL",然后保存退出。



5.3 yum无法下载

1. 在/etc/yum.conf中加入proxy=htt://XX.XXX.XX:PORT



2. 重启网络



3. 再次运行yum install ambari-server则能够正常下载



5.4 CentOS 64bit安装Hadoop2.2.0中出现文件编译位数异常

在安装hadoop2.2.0过程中出现如下异常:Unable to load native-hadoop library for your platform... using builtin-java classes where applicable



通过分析是由于lib/native目录中有些文件是在32位编译,无法适应CentOS 64位环境造成



有两种办法解决:
l 重新编译hadoop,然后重新部署
l 暂时办法是修改配置,忽略有问题的文件



5.5 编译Hadoop2.2.0出现代码异常

目前的2.2.0 的Source Code 压缩包解压出来的code有个bug 需要patch后才能编译。否则编译hadoop-auth 会提示下面错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:testCompile (default-testCompile) on project hadoop-auth: Compilation failure: Compilation
failure:
[ERROR] /home/hadoop/Downloads/release-2.2.0/hadoop-common-project/hadoop-auth/src/test/java/org/apache/hadoop/security/authentication/client/AuthenticatorTestCase.java:[88,11]
error: cannot access AbstractLifeCycle
[ERROR] class file for org.mortbay.component.AbstractLifeCycle not found
[ERROR] /home/hadoop/Downloads/release-2.2.0/hadoop-common-project/hadoop-auth/src/test/java/org/apache/hadoop/security/authentication/client/AuthenticatorTestCase.java:[96,29]
error: cannot access LifeCycle
[ERROR] class file for org.mortbay.component.LifeCycle not found



直接修改hadoop-common-project/hadoop-auth/pom.xml,其实就是少了一个包,添加一个dependency:
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
<scope>test</scope>
</dependency>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: