因为课程实验的需要,需要搭建hadoop伪分布式环境,经过了一天的探索,终于成功搭建好了,并整理成文。
首先要了解一下Hadoop的运行模式:
单机模式(standalone)
单机模式是Hadoop的默认模式。当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选择了最小配置。在这种默认模式下所有3个XML文件均为空。当配置文件为空时,Hadoop会完全运行在本地。因为不需要与其他节点交互,单机模式就不使用HDFS,也不加载任何Hadoop的守护进程。该模式主要用于开发调试MapReduce程序的应用逻辑。
伪分布模式(Pseudo-Distributed Mode)
伪分布模式在“单节点集群”上运行Hadoop,其中所有的守护进程都运行在同一台机器上。该模式在单机模式之上增加了代码调试功能,允许你检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。
全分布模式(Fully Distributed Mode)
Hadoop守护进程运行在一个集群上。
版本:Ubuntu 15.10 ;Hadoop 1.1.2 ; Java 1.6.0_27
- 配置主机
设置静态ip地址以及修改主机名
依次顺序为:点击网络连接->编辑->ipv4设置->方法改为:手动,然后填上自己的静态ip地址。如下图:
修改完静态ip后,再修改hostname,第一步就算完成了。指令也很简单
sudo vim /etc/hostname
然后将此内容改为你想要的主机名即可,如下图:
当你输入hostname,显示以下内容时,说明已修改成功:
然后需要在hosts添加上master机以及slave机,输入sudo vim /etc/hosts
进行修改。其中NvRom-Hadoop表示master机,而XiaJingJing表示slave机,保存即可。
这时候我们需要确认第一步骤是否已成功设置好了,输入ping -c 4 NvRom-Hadoop
,当出现以下情况时,说明配置成功。
- 安装ssh
由于hadoop需要用ssh进行通信,因此我们需要安装ssh。因为Ubuntu已经默认安装ssh client,所以只需要启动ssh server即可
sudo apt-get install openssh-server
假设服务已安装完成后,启动服务:
sudo /etc/init.d/ssh start
作为一个安全通信协议(ssh生成密钥有rsa和dsa两种生成方式,默认情况下采用rsa方式),使用时需要密码,因此可以要设置成免密码登录,生成私钥和公钥:
ssh-keygen -t rsa -P ""
进入~/.ssh/目录下,将公钥id_rsa.pub追加到authorized_keys授权文件中,开始是没有authorized_keys文件的(authorized_keys用于保存所有允许以当前用户身份登录到ssh客户端用户的公钥内容)
cp .ssh/id_rsa.pub .ssh/authorized_keys
然后就可以无密码登陆了。如果一切顺利,最终结果应该如下图所示:
这里可能会有几个问题:
1:可能会提示当前目录下没有.ssh这个文件目录,那是因为.ssh是在主目录下,可以输入如下内容:
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
2:下载ssh server时可能进行不下去,输入即可解决
sudo apt-get updata
- 安装java开发环境
假设我们已经有了需要的文件,首先将文件放入/usr/local目录下,然后修改环境变量。
Ubuntu中有几个环境变量文件:
/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。
/etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。
~/.profile:在登录时用到的第三个文件是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
输入sudo vim /etc/profile
往里面添加如下语句:
需要强调的是,PATH是大写!其余内容与windows下配置差不多。然后输入source /etc/profile
修改的文件立即生效。
做好之后,当我们输入java -version
,如下图所示,说明配置成功。
- 安装Hadoop
到官网下载hadoop源文件,解压并放到/usr/local/hadoop,然后进入hadoop目录,打开conf,在hadoop-env.sh添加以下信息:
//JAVA_HOME视java安装路径而定
export JAVA_HOME=/usr/local/jdk1.6.0_27
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:/usr/local/hadoop/bin
然后让配置文件立即生效source hadoop-env.sh
这时候hadoop的单机模式就完成了。我们可以用hadoop自带的WorldCount来感受下MapReduce过程。在hadoop目录下,新建一个目录test,并将conf文件里的文件全部复制到test中,输入:
bin/hadoop jar hadoop-examples-1.1.2.jar wordcount test output
然后再cat output/*
可查看结果
可能会出现以为权限问题而不能正确执行WorldCount的问题,只需要在前面加个sudo或是切换到root权限下即可。
- 伪分布式安装
这里需要设定3个文件:core-site.xml,hdfs-site.xml,mapred-site.xml,都在/usr/local/hadoop/conf目录下
core-site.xml: Hadoop Core的配置项,例如HDFS和MapReduce常用的I/O设置等。
hdfs-site.xml: Hadoop 守护进程的配置项,包括namenode,辅助namenode和datanode等。
mapred-site.xml: MapReduce 守护进程的配置项,包括jobtracker和tasktracker。
首先在hadoop目录下新建几个文件夹
mkdir tmp hdfs
mkdir hdfs/name hdfs/data
然后依次修改这三个文件:
core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/hdfs/data</value>
</property>
</configuration>
mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
通过以上步骤,我们已经设定好Hadoop单机测试到环境,接着就是启动Hadoop到相关服务,格式化namenode,secondarynamenode,tasktracker:
source /usr/local/hadoop/conf/hadoop-env.sh
hadoop namenode -format
然后依次将secondarynamenode,tasktracker都格式化。
可能会因为权限问题提示错误java.io.FileNotFoundException:这时候只需要将输入改成sudo ./bin/hadoop namenode -format
即可
接着执行start-all.sh来启动所有服务,包括namenode,datanode,start-all.sh脚本用来装载守护进程。
这里可能会出现两个问题:
1:输入sudo ./bin/start-all.sh
时,提示我们需要输入localhost的密码;
2:当我们输入start-all.sh
时,提示权限不够。
其实是这样子的,
ssh在登录其他主机时采用的“ ssh 目的主机用户名@目的主机的ip”的模式,如这里“ssh hadoop@192.168.85.100”,ip确定唯一主机,用户名确定主机上的有效用户,密码用于切换到该用户目录下。在hadoop的集群中,slave文件中给的是datanode的主机ip,在启动hadoop的时候,hadoop会依照该文件提供的ip地址逐个启动datanode节点上的tasktracker和datanode守护进程,但是由于没有提供datanode主机的用户名,因而ssh默认以当前用户(假设为namenode)做为目标主机的用户(假设为datanode),但ssh不会检测目标主机是否存在该用户(这显然不是它的工作),在本机~/.ssh/known_hosts中没有存放有namenode@datanode‘s ip,因而需要输入密码,但是由于目标主机没有namenode用户,因而无论怎么输入密码都是错的,或者提示权限不够
这个问题困扰了我很久很久,终于想到了解决办法:将hadoop目录下的所有文件权限从root变成普通用户。
sudo chown -R nvrom:nvrom ./hadoop
然后再执行start-all.sh
用Java的jps命令列出所有守护进程来验证安装成功
所有的设置已完成,Hadoop也启动了,现在可以通过下面的操作来查看服务是否正常,在Hadoop中用于监控集群健康状态的Web界面:
http://localhost:50030/ - Hadoop 管理介面
http://localhost:50060/ - Hadoop Task Tracker 状态
http://localhost:50070/ - Hadoop DFS 状态
Hadoop 管理介面:
Hadoop Task Tracker 状态
Hadoop DFS 状态
- 小结
在ubuntu上搭建hadoop成功,特别是解决了困扰我好久的问题时,有点小兴奋呢。