hadoop学习笔记-centos安装单节点及多节点集成(初稿,无图,无连接)
后续将会将软件下载地址,以及截图更新上来,由于此文档是在公司写的,所以只能用文字描述出操作的过程,请谅解。
前言:这一系列的文章好久没有写了,由于工作最近比较繁忙,于是就拖延了一段时间。于是上周日本人计划搭建一个比较真实的环境,由于之前一直是在windows下面模拟的,感觉不是很好,所以就用我那个只有4G的笔记本来跑跑几个虚拟机吧。
在安装之前需要以下几个软件
1) centos安装包,这个是必须的。我用的是centos6.3,是当前最新的版本。下载地址是:
2) virtualbox安装包,由于这个相对vm应该比较小巧,功能也比较简单,所以用于练习是比较好的选择。下载地址是:
3) xshell以及xftp安装包,这个是linux在windows端的工具软件,可以通过ssh来远程连接或者其他协议来连接linux服务器,并可以进行管理,类似于在linux的终端,而xftp是可以通过文件拖拉方式来进行windows端和linux端的文件传输,非常方便,下载地址为:
4) hadoop1.0.4的rpm的安装包,由于centos是类似red hat,所以可以下载hadoop1.0.4的rpm包。下载地址:
以上软件均是在搭建之前必须下载好的。接下来便进入安装步骤。
Centos的安装:
Centos的安装还是比较简单的,具体的步骤可以参考:
本人也是参考这个来进行安装的。
注意:centos在安装的时候,就已经替我们安装好了openjdk和ssh。本人建议不采用它自带的openjdk,下对它进行卸载,然后重新安装,操作步骤为:
操作之前需要将用户切换到root用户,su root ,然后输入你在安装系统的时候设置的密码
rpm -qa | grep java
于是可能会出现下面内容(不同机器会出现不同内容)
java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5
执行下面操作:
rpm -e --nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5
注意上面红色标记是相同的。
最后在重新安装openjdk
注意此时还是在root用户下
yuminstall java-1.6.0-openjdk java-1.6.0-openjdk-devel
执行这个命令,
那么jdk将会安装在/usr/jvm/java下面了。
设置环境变量:
echo "exportJAVA_HOME=/usr/lib/jvm/java" >> /etc/profile
然后再reboot一下。这是jdk就安装好了。最好是将$JAVA_HOME/bin加到$PATH下面,当然,这是可选的。
搭建单节点的hadoop:
启动virtualbox里面刚刚安装好的刚刚安装好的centos,记住在网络连接那里设置连桥方式,不然虚拟机可能连不上网。
到此你看看你是否已经安装好了xshell和xftp(windows)。通过xshell连接你虚拟机的centos,然后就可以不用在虚拟机里面操作了,从而避免总是在虚拟机和windows切换。
打开xshell,点击new一个新的连接,这里输入虚拟机里面的centos的ip。点击connect,那么就会提示你是以哪个用户登录,输入你设置的centos用户名,勾选记住名字,后面会提示输入对应用户的密码,输入即可,同时也勾选上记住密码。点击确定。于是就连接上了虚拟机里面的centos了。就会看到虚拟机的终端。
注意:以下操作均是在xshell操作。
第一步:在当前用户目录下新建一个opt目录
(这是本人的习惯,不同人可以自己考虑)。这个目录将会放hadoop的安装目录。然后cd ~/opt,于是就进入了opt目录,此时点击xshell导航栏的window选项,里面会看到new file transport,点击这个,如果你已经安装了xftp那么就会通过xftp打开对应centos的opt目录,如果没有安装,将会提醒你安装xftp。这时你就可以将你下载在windows的hadoop 1.0.4的rpm安装文件拖拉到centos的opt目录下。上传完毕后,当你再次回到xshell的终端,在opt下面ls一下就会看到刚刚拖拉的hadoop安装文件了。
第二步:解压hadoop安装包。
由于hadoop的安装包是rpm格式,所以tar不能解压。采用一下方式可以进行解压:
rpm2cpioxxx.rpm | cpio –div
xxx就是hadoop的安装包名。
于是就会再opt目录下会出现三个文件夹,etc,usr,var
Etc可以说是hadoop的配置模板,usr里面才是hadoop的主目录,里面主要的几个目录是:
bin:里面有hadoop工具以及taskcontroller
sbin:里面有hadoop的启动以及关闭等其他工具
logs:则是存放当前节点hadoop运行日志。
进入/opt/etc/hadoop目录
里面有哦hadoop的所有配置文档
主要是修改core-site.xml,mapred-site.xml,hadoop-env.sh,hdfs-site.xml
修改内容可以参考官方的关于1.0.4的文档,我这里把相关内容粘贴出来:
hadoop-env.sh
加入export JAVA_HOME=/usr/lib/jvm/java
core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
此时hadoop的基本配置已经完成。
注意刚刚说了,etc目录只是一个配置模板,而并非hadoop的真正配置的地方
我们需要将etc复制到usr里面去:
cp -retc ./usr(执行这条命令的目录是在opt下面)
这才算是真正的配置完了hadoop。
第三步:生成无密码登录ssh
由于hadoop需要无密码登录作为datanode的节点,而由于部署单节点的时候,当前节点既是namenode又是datanode,所以此时需要生成无密码登录的ssh。方法如下:
执行ssh-keygen –t rsa一路回车
然后cd ~/.ssh
ls一下会看到有两个文件,一个是id_rsa,另一个是id_rsa.pub
id_rsa是密钥,id_rsa.pub是公钥。我们在执行
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
测试是否设置成功:
ssh localhost
如果不需要输入密码即表示设置成功,否则失败。
第四步:附加操作
为了方便操作,最好是将hadoop的bin以及sbin放到PATH下面去,这样不要每次倒要进入对应目录下才能执行。
所以需要执行:
echo “PATH=/home/username/opt/usr/bin:/home/username/opt/usr/sbin:$PATH”>> /etc/profile
注意:上面命令需要切换到root用户,并且username是你当前用户的名字。到此就剩下启动hadoop了。
启动hadoop:
由于将hadoop的bin以及sbin路径放到了path中,所以可以再任何目录位置执行hadoop命令。
注意:只执行之前到sbin目录下ls一下,会发现有一部分文件没有执行的权限,那么就执行一个chmod 777 *便可以了。
第一步:格式化namenode
hadoop namenode format
此时会初始化好hadoop的文件系统。
执行完成之后会发现根目录下会有一个tmp目录
可以cd /tmp
然后ls
里面又会三个目录
Data:这边是datanode的信息存放目录了
Name:这是namenode的信息存放目录
Secondraynamenod:这个可以理解为namenode的一个备份。
这里就是hadoop的文件系统根目录了。你进去根本看不到你所谓的目录和文件,因为里面是hadoop的文件系统。不是我们操作系统的文件系统。所以只有通过hadoop才看看到目录和文件。
第二步:正式启动hadoop
忙活半天,这下终于可以启动hadoop,看看它的真面目了。
让我们执行start-all.sh
就会提示依次启动了namenode后面跟着它的日志存放目录
Datanode ,secondraynamenode,jobtracker以及tasktracker。
一般namenode会配备一个jobtracker用于处理用户的各种请求的。
而datanode会配备一个tasktracker用户处理由jobtracker分发过来的任务。
而secondraynamenode则是namenode的一个备份,会定时的将namenode的信息复制过来,当然,这个备份肯定不能解决namenode完全崩溃的时候。
一般一个hadoop里面最重要的是namenode,它相当于一个hadoop的管家,没有他,那么就不会知道文件怎么存放以及存放在哪等等信息。所以一般在一个hadoop的集群中只有一个namenode。集群可以理解为是多个datanode的集群,统一由namenode来管理。这里扯了一点hadoop的相关知识。
第三步:检查是否启动成功
对于一个单节点,那么当前节点应该有增加五个java进程,分别是namenode,datanode,secondraynamenode,jobtracker,tasktracker。通过jps就可以查看。如果看到这几个进程,表示你安装hadoop成功了。那么你就可以开始你的hadoop之旅了。
搭建集群的hadoop
前期配置:由于之前在virtualbox上面只是安装了一个centos,那么要集群,当然需要至少再安装一个centos。当然,这个centos的用户名最好喝另一个样,从而避免没必要的配置。
到此,假设你已经安装并完成了jdk的安装及配置。并且假设,开始安装的centos是作为master,刚刚安装的作为slaver。
注意:以下操作均是在xshell下操作的。
第一步:修改主机名及hosts文件
1) master:这个作为namenode节点(同时可以作为datanode)。
vi /etc/sysconfig/network
将里面的HOSTNAME修改成master
vi /etc/hosts
加上master对应的ip(既当前的节点ip)
例如:127.0.0.1 master
同时加上slaver的ip
2) slaver:这个是作为datanode节点,同上
vi /etc/sysconfig/network
将里面的HOSTNAME修改成master
vi /etc/hosts
加上master对应的ip(既当前的节点ip)
例如:127.0.0.1 master
同时加上slaver的ip
完成以上操作之后将master和slaver节点均reboot一下。
注意:以上操作均要在root下操作,不然会提示没有权限。
第二步:修改hadoop的配置文档
由于已经在master节点已经搭建好了单节点的hadoop,那么我们就先修改master的hadoop配置信息。同单节点一样,修改core-set.xml.mapred-site.xml
由于之前设置的都是master的ip或者是localhost,那么现在需要修改成在上一步配置好的hosts文件ip和hostname对应内容,我们将在这两个文件的ip都修改成master的hostname或者是ip。因为hostname在hosts文件中已经和ip有对应关系,所以用哪个都一样,不过本人建议用hostname,这样比较明了。
然后修改在etc/hadoop的master和slavers文件。
用vi打开可以看到里面只有localhost,这个hadoop的默认配置,表示当前节点既是master又是slaver,及既是namenode也是datanode。那么此处可以修改master文件将localhost修改成master的hostname(为什么可以,上面已经解释过)。修改slavers文件,将localhost修改成slaver的hostname也可以将master的hostname加进去(注意:一行只能有一个机器的hostname)。这样基本把master节点已经配置完毕。那么就要配置slaver节点了。
Slaver节点的配置很简单,那就是copy。通过tar将opt目录打包:
tar –cvfopt.zip ./opt
将opt打好包之后,通过scp将这个文件复制到slaver机器上。(注意当前位置问当前用户的主目录)
scp opt.zip slaver_hostname:./
(注意:红色标记表示slaver节点的主机名,ip也可以)
此时到slaver节点上,到用户主目录下,ls一下可以看到刚刚拷贝过来的opt.zip文件。
同样,用tar进行解压
tar –xvf opt.zip ./
解压完毕之后,在当前目录下会看到一个opt文件夹。
此时便安装好了hadoop了。
第三步:配置ssh无密码登录
由于master节点需要通过ssh登录到slaver节点去启动datanode。那么需要在slaver节点实现ssh无密码登录。为了防治意外发生,我们最好还是使得slaver和master都能够相互的ssh无密码登录。
我们在slaver节点执行ssh-keygen –t rsa,一路回车。
在master节点先删除~/.ssh目录,rm –fr ~/.ssh。然后重新生成私钥和公钥。ssh-keygen–t rsa(至于为什么要重新生成,是由于我们的主机名已经改变了,所以要重新生成)。
cd~/.ssh,里面就会有id_rsa,id_rsa.pub,这两个文件的意义上面已经介绍过了。下面就是要实现互通了。
我们在master的~/.ssh下有一个id_rsa.pub文件。我们将这个文件copy到slaver的.ssh目录。通过scp来复制。scp id_rsa.pubslaver_hostname:./.ssh/tmp.pub,然后回到slaver节点的终端。在.ssh目录下ls一下,会看到多出一个tmp.pub文件。
再次执行cat tmp.pub >>authorized_keys
我们对这个文件赋予权限:chmod 600authorized_keys。这样从master到slaver就实现了无密码ssh登录了。
我们在master端ssh slaver_hostname,如果成功了,那么就不会要求输入密码。
至于slaver到master生成无密码登录,和上面一样,只是是从slaver复制id_rsa.pub到master。,注意,是用cat命令将公钥添加到authorized_keys文件,而不是新建一个authorized_keys。
通过这些操作基本上已经完成了ssh无密码登录了。
第四步:启动hadoop
在启动hadoop之前,由于之前在master上搭建过了一个单节点的hadoop,那么此时需要将原来的/tmp下的所有文件都删除掉。然后执行hadoop namenode –format。
再启动之前,最好还是先要开放一下几个端口:
注意:此操作需要切换到root用户
配置防火墙
Master端:
/sbin/iptables -I INPUT -p tcp –dport 9000-j ACCEPT (这个是core-site.xml:
里面配置的端口名)
/sbin/iptables -I INPUT -p tcp –dport 9001-j ACCEPT (这个是mapred-site.xml:
里面配置的端口名)
/sbin/iptables -I INPUT -p tcp –dport 50030-j ACCEPT(JobTrackeradministrative web GUI JOBTRACKER的HTTP服务器和端口)
/sbin/iptables -I INPUT -p tcp –dport 50070-j ACCEPT(NameNode administrativeweb GUI NAMENODE的HTTP服务器和端口)
/sbin/iptables -I INPUT -p tcp –dport 50010 -j ACCEPT(DATANODE控制端口,主要用于DATANODE初始化时向NAMENODE提出注册和应答请求)
/sbin/iptables -I INPUT -p tcp –dport 50020-j ACCEPT(DATANODE的RPC服务器地址和端口)
/sbin/iptables -I INPUT -p tcp –dport 50060-j ACCEPT(TASKTRACKER的HTTP服务器和端口)
/sbin/iptables -I INPUT -p tcp –dport 50075-j ACCEPT(DATANODE的HTTP服务器和端口)
/sbin/iptables -I INPUT -p tcp –dport 50090-j ACCEPT(辅助DATANODE的HTTP服务器和端口)
保存这些配置信息:
/etc/rc.d/init.d/iptables save
重启防火墙:
/etc/init.d/iptables restart
查看防护墙信息:
/etc/init.d/iptables status
Slaver端:
/sbin/iptables -I INPUT -p tcp –dport 50030-j ACCEPT(JobTrackeradministrative web GUI JOBTRACKER的HTTP服务器和端口)
/sbin/iptables -I INPUT -p tcp –dport 50070-j ACCEPT(NameNode administrativeweb GUI NAMENODE的HTTP服务器和端口)
/sbin/iptables -I INPUT -p tcp –dport 50010 -j ACCEPT(DATANODE控制端口,主要用于DATANODE初始化时向NAMENODE提出注册和应答请求)
/sbin/iptables -I INPUT -p tcp –dport 50020-j ACCEPT(DATANODE的RPC服务器地址和端口)
/sbin/iptables -I INPUT -p tcp –dport 50060-j ACCEPT(TASKTRACKER的HTTP服务器和端口)
/sbin/iptables -I INPUT -p tcp –dport 50075-j ACCEPT(DATANODE的HTTP服务器和端口)
/sbin/iptables -I INPUT -p tcp –dport 50090-j ACCEPT(辅助DATANODE的HTTP服务器和端口)
保存这些配置信息:
/etc/rc.d/init.d/iptables save
重启防火墙:
/etc/init.d/iptables restart
查看防护墙信息:
/etc/init.d/iptables status
启动
通过漫长的配置终于到了启动阶段了
在master端,start-all.sh
1) 如果你的master既是namenode也是datanode,那么通过jps查看会看到六条数据:
分别是:
Psid JPS
Psid Namenode
Psid Datanode
Psid jobtracker
Psidsecondraynamenode
Psid tasktracker
顺序可能不是这样,但是会有这几个数据,如果少了某个,说明没有启动成功,那么就到logs目录去查看日子吧,看看是出现了什么异常。
2)如果master只是namenode,那么jps只有一四条数据,比上面少了tasktracker和datanode
到slaver查看一下datanode是否启动成功:
同样执行jps命令:正常情况会出现三条数据,JPS,datandoe,tasktracker。
到此,hadoop的集群安装已经结束。
扩展hadoop的节点
Hadoop是一个扩展性很高的分布式系统,那么当我们在我们hadoop的集群中添加一个新的datanode的时候,会不会需要重新安装一下hadoop呢?当然不要了。只需要将你新加的slaver的hostname加到master的slavers文件中,并且在master节点的hosts文件中加入新添加的slaver节点的pi和hostname对应信息。
当然,新增加的slaver节点一定要配置好jdk环境。然后将master的hadoop复制一份过去就可以了。
然后再master节点,关闭hadoop,stop-all.sh,然后再启动一下就可以了,start-all.sh.
那么新加的slaver节点就会成功启动datanode和tasktracker了。
安装过程中会出现的某些异常
当某个节点启动不成功的时候,要及时查看相应的logs下的日志。查看出现了什么异常。
例如,master的namenode无法启动,可能是你没有重新格式化hadoop的文件系统,或者是namenode的端口被其他程序占用了。
当slaver节点无法启动了,或者启动了一会,就停止了,可能是你的slaver无法访问master的namenode的节点,那么就可能是master没有关闭某个端口防火墙。例如问的配置,可能是9000端口被防火墙拦截了。那么就需要关闭这个端口的防火墙。
在一中情况就是slaver节点的额datanode的id和namenode的id不一致,会导致datanode无法启动。所以到slaver节点的/tmp/data/current/,有个一VERSION文件,吧里面的id修改成namenode的id一样,然后重启就可以了。(namenode的id信息在/tmp/name/current/VERSION里面)