Hadoop第3周练习--Hadoop2.X编译安装和实验
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地址和主机名分布如下:
序号 |
机器名 |
类型 |
用户名 |
|
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>