前言:因为没有实体机做测试,要学习hadoop搭建环境,在本地笔记本做3台linux虚拟机是个蛮不错的选择。安装一个VMware,准备3台一样的linux虚拟机.
Linux虚拟机ISO:
虚拟机平台服务器版本:
PS:关于软件,软件描述如下所示:
本地笔记本:T420,8G内存,64位操作系统,配置如下:
1.安装虚拟机
1.1安装VMware-workstation,一路下一步即可,导入redhat系统,使用ISO方式搭建linux虚拟机
2.安装linux虚拟机
2.1安装VMware-workstation完成后,选择新建虚拟机,导入Red Hat Enterprise Linux 7.3,使用ISO方式搭建linux虚拟机
选择路径
选择多核
选择2G内存
选择桥连接的方式
选择磁盘I/O方式
创建全新的虚拟机
选择磁盘类型
虚拟机文件存储方式
设置虚拟机文件存放路径
完成打开,报错如下:
Could not prepare the install disc at E:\software\wmware\RedHat Enterprise Linux 7.3-bin-DVD1.iso. Make surethat you are using a valid Linux install disc. If the error persists,you mayneed to reinstall VMware Workstation.
原因是笔记本没有开启虚拟机功能选项,重启电脑,然后按住F1键,进入BIOS设置,找到Virtual选项,设置成enable,然后保存退出。
打开报错:EDD: Error8000 reading sector 2073976
原因是:VMware Workstation 9,版本太老,升级到10版本,就OK了。
设置虚拟机网络连接(固定IP)
设置连接方式为NAT模式
看下是否能上外网,左键点击笔记本右下角无线图标,再点击打开网络与共享中心,关闭VMnet01,只保留VMnet08,然后使用默认的IPv4的ip地址192.168.52.1
克隆另外一台完全一模一样的虚拟机
在虚拟机name02上右键弹出菜单里点击”管理(M)”,然后点击右边下拉菜单”克隆(C)”,如下所示:
继续下一步
选择创建完成克隆(F)
设置好名称和位置,点击完成
开始复制,时间较长,耐心等待,如下
点击关闭按钮,完成本次clone。
在使用同样的办法,clone另外一台data02出来,如下图所示:
OK,最后3台一模一样配置的虚拟机全部搭建完成,可以去搭建hadoop环境,可以开始大数据学习之旅了。
3.安装JDK7
3.1下载JDK安装包
安装版本:jdk-7u60-linux-x64.gz
查看最新:http://www.oracle.com/technetwork/java/javase/downloads/index.html
3.2解压安装
我们把JDK安装到这个路径:/usr/lib/jvm
如果没有这个目录,我们就新建一个目录
cd /usr/lib
sudo mkdir jvm
将jdk-7u45-linux-x64.tar.gz复制到linux桌面
tar zxvf jdk-7u45-linux-x64.tar.gz -C/usr/lib/jvm
3.3配置环境变量
(1)只对当前用户生效
vim ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_45
export JRE_HOME=$JAVA_HOME/jre
exportCLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
保存退出,然后输入下面的命令来使之生效
source ~/.bashrc
(2)对所有用户生效(root用户登录)
vim /etc/profile
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_45
export JRE_HOME=$JAVA_HOME/jre
exportCLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
exportHADOOP_PREFIX=/hd/hdinstall/hadoop-2.6.0/
exportHADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
exportHADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib"
保存退出,然后输入下面的命令来使之生效
source /etc/profile
3.4配置默认JDK(一般情况下这一步都可以省略)
由于一些Linux的发行版中已经存在默认的JDK,如OpenJDK等。所以为了使得我们刚才安装好的JDK版本能成为默认的JDK版本,我们还要进行下面的配置。
执行下面的命令:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0_45/bin/java300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.7.0_45/bin/javac300
注意:如果以上两个命令出现找不到路径问题,只要重启一下机器在重复上面两行代码就OK了。
执行下面的代码可以看到当前各种JDK版本和配置:
sudo update-alternatives --config java
3.5测试
在linux命令行,使用java -version来查看java版本,显示结果如下:
4安装hadoop2.6.0
4.1系统架构
集群角色:
主机名 ip地址 角色
server01 192.168.137.2 NameNode、ResourceManager(JobTracker)
server02 192.168.137.3 DataNode、NodeManager(TaskTracker)
server03 192.168.137.4 DataNode、NodeManager(TaskTracker)
系统环境:
Red Hat Enterprise Linux 7.3
硬盘:30G
内存:2G
4.2环境准备
a. 系统设置:
关闭iptables:
/sbin/serviceiptables stop
/sbin/chkconfig iptables off
关闭selinux: setenforce 0
sed "s@^SELINUX=enforcing@SELINUX=disabled@g"/etc/sysconfig/selinux
vi /etc/hosts
#localhost.localdomain=data01 #或者name01,data02
192.168.137.2 server01
192.168.137.3 server02
192.168.137.4 server03
hostname server01; hostname server02;hostname server03;
设置节点名称,所有节点执行
b. 用户目录创建 :
创建hadoop运行账户:
使用root登陆所有机器后,所有的机器都创建hadoop用户
useradd hadoop //添加用户
passwd hadoop //修改密码
#sudo useradd –s /bin/bash –d /home/hadoop –m hadoop –g hadoop –G admin
//添加一个zhm用户,此用户属于hadoop用户组,且具有admin权限。
#su hadoop //切换到zhm用户中
chown -R hadoop:hadoop /home
c.创建hadoop相关目录:
定义需要数据及目录的存放路径,定义代码及工具存放的路径
mkdir -p /home/hadoop/src
mkdir -p /home/hadoop/tools
chown -R hadoop.hadoop /home/hadoop/*
d. 定义数据节点存放的路径到跟目录下的hadoop文件夹, 这里是数据节点存放目录需要有足够的空间存放
mkdir -p /data/hadoop/hdfs
mkdir -p /data/hadoop/tmp
mkdir -p /var/logs/hadoop
chmod -R 777 /data/hadoop
chown -R hadoop.hadoop /data/hadoop/*
chown -R hadoop.hadoop /var/logs/hadoop
4.3 配置ssh免密码登陆
参考文章地址:http://blog.csdn.net/ab198604/article/details/8250461
SSH主要通过RSA算法来产生公钥与私钥,在数据传输过程中对数据进行加密来保障数
据的安全性和可靠性,公钥部分是公共部分,网络上任一结点均可以访问,私钥主要用于对数据进行加密,以防他人盗取数据。总而言之,这是一种非对称算法,
想要破解还是非常有难度的。Hadoop集群的各个结点之间需要进行数据的访问,被访问的结点对于访问用户结点的可靠性必须进行验证,hadoop采用的是ssh的方
法通过密钥验证及数据加解密的方式进行远程安全登录操作,当然,如果hadoop对每个结点的访问均需要进行验证,其效率将会大大降低,所以才需要配置SSH免
密码的方法直接远程连入被访问结点,这样将大大提高访问效率。
namenode节点配置免密码登陆其他节点,每个节点都要产生公钥密码,Id_dsa.pub为公钥,id_dsa为私钥,紧接着将公钥文件复制成authorized_keys文件,这个步骤是必须的,过程如下:
a. 每个节点分别产生密钥
# 提示:
(1):.ssh目录需要755权限,authorized_keys需要644权限;
(2):Linux防火墙开着,hadoop需要开的端口需要添加,或者关掉防火墙;
(3):数据节点连不上主服务器还有可能是使用了机器名的缘故,还是使用IP地址比较稳妥。
关闭防火墙
systemctl status firewalld
systemctl disable firewalld
关闭服务器的防火墙
在每台机器上运行
[root@localhost jdk1.7]# service iptablesstop
iptables: Flushing firewall rules: [ OK ]
iptables: Setting chains to policy ACCEPT:filter [ OK ]
iptables: Unloading modules: [ OK ]
[root@localhost jdk1.7]# service iptablesstatus
iptables: Firewall is not running.
[root@localhost jdk1.7]# chkconfig iptablesoff
[root@localhost jdk1.7]#
看下iptables状态
[root@localhost jdk1.7]# chkconfig --listiptables
iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@localhost jdk1.7]#
设置开机不自启动
chkconfig iptables off
创建用户组:groupadd hadoop
创建用户:useradd -g hadoop hadoop(用户归属weblogic组)
设置密码:passwd hadoop
[hadoop@localhost hadoop]$ su - root
密码:
su: 鉴定故障
[hadoop@localhost hadoop]$exit
b. name01(192.168.85.128)主库上面:
namenode主节点hadoop账户创建服务器登陆公私钥:
mkdir -p /home/hadoop/.ssh
chown hadoop.hadoop -R /home/hadoop/.ssh
chmod 755 /home/hadoop/.ssh
su - hadoop
cd /home/hadoop/.ssh
ssh-keygen -t dsa -P '' -f id_dsa
如果错误执行:setenforce 0
Id_dsa.pub为公钥,id_dsa为私钥,紧接着将公钥文件复制成authorized_keys文件,这个步骤是必须的,过程如下:
[hadoop@name01 .ssh]$ cat id_dsa.pub>> authorized_keys
data01和data02执行以上相同的操作,生产authorized_keys
c. 构造3个通用的authorized_keys
在name01(192.168.85.128)上操作:
su - hadoop
cd /home/hadoop/.ssh
scp hadoop@server02:/home/hadoop/.ssh/id_dsa.pub ./id_dsa.pub.server02
scphadoop@server03:/home/hadoop/.ssh/id_dsa.pub ./id_dsa.pub.server03
cat id_dsa.pub.server02 >> authorized_keys
cat id_dsa.pub.server03 >> authorized_keys
cat authorized_keys
看到authorized_keys文件里面有3行记录,分别代表了访问name01,data01,data02的公用密钥。把这个authorized_keys公钥文件copy到data01和data02上面同一个目录下。
copy文件 authorized_keys,然后通过hadoop远程彼此连接name01、data01、data02就可以免密码
scp authorized_keys hadoop@server02:/home/hadoop/.ssh/
scp authorized_keys hadoop@server03:/home/hadoop/.ssh/
然后分别在name01、data01、data02以hadoop用户执行权限赋予操作
su - hadoop
chmod 600 /home/hadoop/.ssh/authorized_keys
chmod 700 -R /home/hadoop/.ssh
测试ssh免秘钥登录,首次连接的时候,需要输入yes,之后就不用输入密码直接可以ssh过去了。
d. 验证name01、data01、data02任何ssh免密码登录
[hadoop@data02 ~]$ ssh name01
Last login: Thu Aug 21 02:38:46 2014 from data02
[hadoop@name01 ~]$ ssh data01
Last login: Thu Aug 21 02:30:35 2014 from localhost.localdomain
[hadoop@data01 ~]$ ssh data02
Last login: Thu Aug 21 02:32:57 2014 from localhost.localdomain
[hadoop@data02 ~]$ ssh data01
Last login: Thu Aug 21 02:39:55 2014 from name01
[hadoop@data01 ~]$ ssh name01
Last login: Thu Aug 21 02:39:51 2014 from data02
[hadoop@name01 ~]$ ssh data02
Last login: Thu Aug 21 02:39:58 2014 from data01
[hadoop@data02 ~]$
4.4安装部署hadoop环境
4.4.1 java环境准备
root账户下所有节点安装jdk
4.4.2安装hadoop
A.版本2.6.0安装
从本地copy到linux虚拟机桌面
tar zxvf hadoop-2.6.0-x64.tar.gz -C /home/hadoop/src/
B.配置环境变量:
使用root设置环境变量
vi /etc/profile
export HADOOP_HOME=/home/hadoop/src/hadoop-2.6.0
export JAVA_HOME= /usr/lib/jvm/jdk1.7.0_45
export PATH=/home/hadoop/src/hadoop-2.6.0/bin:/home/hadoop/src/hadoop-2.6.0/sbin:$PATH
source /etc/profile
4.4.3 hadoop配置文件
hadoop群集涉及配置文件:hadoop-env.shcore-site.xml hdfs-site.xml mapred-site.xml yarn-env.sh slaves yarn-site.xml
涉及到的配置文件有7个:
以下个别文件默认不存在的,可以复制相应的template文件获得。
cp /home/hadoop/src/hadoop-2.6.0/etc/hadoop
hadoop-env.sh
yarn-env.sh
slaves
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
a.修改hadoop-env.sh配置:
vim hadoop-env.sh
增加java环境变量(将注释去掉,添加jdk的路径)
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_45
b.修改yarn-env.sh配置:
vim yarn-env.sh
修改java_home值为 export JAVA_HOME="/usr/lib/jvm/jdk1.7.0_45"
/usr/lib/jvm/jdk1.7.0_45
c.修改slaves配置,写入所有从节点主机名:
vim slaves
server02
server03
d.修改core-site.xml配置文件:
<property>
<name>fs.defaultFS</name>
<value>hdfs://server01:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/root/tmp</value>
<description>Abase for other temporarydirectories.</description>
</property>
<property>
<name>hadoop.proxyuser.hduser.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hduser.groups</name>
<value>*</value>
</property>
e.修改hdfs-site.xml配置:
创建相关目录
mkdir -p /data/hadoop/name
chown -R hadoop.hadoop /data/hadoop/name
mkdir -p /data/hadoop/data
chown -R hadoop.hadoop /data/hadoop/data
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>server01:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/data/hadoop/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/data/hadoop/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
f.修改mapred-site.xml配置
#这个文件不存在,需要自己VIM创建
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>server01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>server01:19888</value>
</property>
g.修改yarn-site.xml配置:
<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>server01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value> server01:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>server01:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>server01:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>server01:8088</value>
</property>
所有节点采用相同的配置文件和安装目录,直接整个目录copy过去安装把server01上面的所有hadoop目录copy到server02上面去:
scp -r /home/hadoop/* hadoop@server02:/home/hadoop/
scp -r /data/hadoop/*hadoop@server02:/data/hadoop/
把server01上面的所有hadoop目录copy到server03上面去:
scp -r /home/hadoop/*hadoop@server03:/home/hadoop/
scp -r /data/hadoop/*hadoop@server03:/data/hadoop/
4.4.4格式化文件系统
在name01主库上面执行 hadoop namenode -format操作,格式化hdfs文件系统。
[root@master bin]# pwd
/home/hadoop/src/hadoop-2.6.0/bin
格式化namenode
./hdfs namenode –format
注意:上面只要出现“successfullyformatted”就表示成功了,只在第一次启动的时候格式化,不要每次启动都格式化。理解为我们新买了块移动硬盘,使用之前总要格式化硬盘。如果真的有必要再次格式化,请先把“$HADOOP_HOME/tmp”目录下的文件全部删除。
读者可以自己观察目录”$HADOOP_HOME/tmp”在格式化前后的变化情况。格式化操作很少有出现失败的情况。如果真出现了,请检查配置是否正确。
4.5讲述hadoop 启动的三种方式
4.5.1第一种,一次性全部启动
执行start-all.sh 启动hadoop,观察控制台的输出,可以看到正在启动进程,分别是namenode、datanode、secondarynamenode、jobtracker、tasktracker,一共5 个,待执行完毕后,并不意味着这5 个进程成功启动,上面仅仅表示系统正在启动进程而已。我们使用jdk 的命令jps 查看进程是否已经正确启动。执行以下jps,如果看到了这5 个进程,说明hadoop 真的启动成功了。如果缺少一个或者多个,那就进入到“Hadoop的常见启动错误”章节寻找原因了。
停止应用:
/home/hadoop/src/hadoop-2.6.0/sbin/stop-all.sh
启动应用:
/home/hadoop/src/hadoop-2.6.0/sbin/start-all.sh
检查后台各个节点运行的hadoop进程
[hadoop@name01 hadoop]$ jps
[hadoop@data01 ~]# jps
查看集群状态
[root@hd0 sbin]# cd../bin/
[root@hd0 bin]#./hdfs dfsadmin -report
14/07/21 05:10:55WARN util.NativeCodeLoader: Unable to load native-hadoop library for yourplatform... using builtin-java classes where applicable
Configured Capacity:10321133568 (9.61 GB)
Present Capacity:8232607744 (7.67 GB)
DFS Remaining:8232558592 (7.67 GB)
DFS Used: 49152 (48KB)
DFS Used%: 0.00%
Under replicatedblocks: 0
Blocks with corruptreplicas: 0
Missing blocks: 0
-------------------------------------------------
通过网站查看hadoop集群情况
进入http://192.168.52.128:50070/dfshealth.html#tab-overview,看集群基本信息,如下图所示:
4.5.2第二种,分别启动HDFS 和yarn
执行命令start-dfs.sh,是单独启动hdfs。执行完该命令后,通过jps 能够看到NameNode、DataNode、SecondaryNameNode 三个进程启动了,该命令适合于只执行hdfs
存储不使用yarn做资源管理。关闭的命令就是stop-dfs.sh 了。
3.4.3.1 先启动HDFS
[hadoop@name01 sbin]$ jps
3687 Jps
[hadoop@name01 sbin]$ pwd
/home/hadoop/src/hadoop-2.6.0/sbin
[hadoop@name01 sbin]$ start-dfs.sh
Starting namenodes on [name01]
name01: starting namenode, logging to /home/hadoop/src/hadoop-2.6.0/logs/hadoop-hadoop-namenode-name01.out
data01: starting datanode, logging to /home/hadoop/src/hadoop-2.6.0/logs/hadoop-hadoop-datanode-data01.out
data02: starting datanode, logging to /home/hadoop/src/hadoop-2.6.0/logs/hadoop-hadoop-datanode-data02.out
Starting secondary namenodes [name01]
name01: starting secondarynamenode, logging to /home/hadoop/src/hadoop-2.6.0/logs/hadoop-hadoop-secondarynamenode-name01.out
在name01节点下,查看后台的jps进程如下:
[hadoop@name01 sbin]$ jps
4081 Jps
3800 NameNode
3977 SecondaryNameNode
[hadoop@name01 sbin]$
[root@hadoop03 src]# jps
13894 Jps
13859 DataNode
去data01节点看下,后台的jps进程如下:
[hadoop@data01 ~]$ jps
3194 Jps
2863 DataNode
[hadoop@data01 ~]$
再启动yarn
执行命令start-yarn.sh,可以单独启动资源管理器的服务器端和客户端进程,关闭的命令就是stop-yarn.sh
[hadoop@name01 sbin]$ start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/src/hadoop-2.6.0/logs/yarn-hadoop-resourcemanager-name01.out
data01: starting nodemanager, logging to /home/hadoop/src/hadoop-2.6.0/logs/yarn-hadoop-nodemanager-data01.out
data02: starting nodemanager, logging to /home/hadoop/src/hadoop-2.6.0/logs/yarn-hadoop-nodemanager-data02.out
在name01节点下,查看后台的jps进程,多了一个ResourceManager进程,如下所示:
[hadoop@name01 sbin]$ jps
4601 ResourceManager
3800 NameNode
4853 Jps
3977 SecondaryNameNode
[hadoop@name01 sbin]$
去data01节点看下,后台的jps进程多了一个NodeManager进程,如下所示:
[hadoop@data01 ~]$ jps
3249 NodeManager
2863 DataNode
3365 Jps
[hadoop@data01 ~]$
依次关闭,先关闭yarn再关闭HDFS
[hadoop@name01 sbin]$ stop-yarn.sh
stopping yarn daemons
stopping resourcemanager
data01: stopping nodemanager
data02: stopping nodemanager
no proxyserver to stop
[hadoop@name01 sbin]$
[hadoop@name01 sbin]$ stop-dfs.sh
Stopping namenodes on [name01]
name01: stopping namenode
data01: stopping datanode
data02: stopping datanode
Stopping secondary namenodes [name01]
name01: stopping secondarynamenode
[hadoop@name01 sbin]$
PS:当然,也可以先启动MapReduce,再启动HDFS。说明HDFS 和MapReduce的进程之间是互相独立的,没有依赖关系。
4.5.3第三种,分别启动各个进程
[root@book0bin]# jps
14821 Jps
[root@book0 bin]# hadoop-daemon.sh start namenode
[root@book0 bin]# hadoop-daemon.sh start datanode
[root@book0 bin]# hadoop-daemon.sh start secondarynamenode
[root@book0 bin]# hadoop-daemon.sh start jobtracker
[root@book0 bin]# hadoop-daemon.sh start tasktracker
[root@book0 bin]# jps
14855 NameNode
14946 DataNode
15043 SecondaryNameNode
15196 TaskTracker
15115 JobTracker
15303 Jps
执行的命令是“hadoop-daemon.sh start [进程名称]”,这种启动方式适合于单独增加、删除节点的情况,在安装集群环境的时候会看到
4.6另外一种检查状态hadoop集群的状态
用"hadoop dfsadmin -report"来查看hadoop集群的状态
可参考文档
http://www.xuebuyuan.com/2196230.html