最近一直捣鼓Mahout,终于在Hadoop下成功跑起来了。由于涉及的点比较多,这里先记录整理一下,做参考备忘使用。
一、操作系统
Ubuntu Desktop 13.04 (RaringRingtail)
官网地址:
http://releases.ubuntu.com/13.04/
国内镜像地址:
中科大 http://ubuntu1304.cdn.mirrors.ustc.edu.cn/ubuntu-releases/13.04/
网易 http://mirrors.163.com/ubuntu-releases/13.04/
二、需要安装的软件
编号 |
软件名称 |
版本 |
下载地址 |
1 |
Java |
jdk-6u45-linux-i586.bin |
http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html |
2 |
SSH |
1)openssh-client_6.1p1-4_i386.deb 2)openssh-server_6.1p1-4_i386.deb 3)ssh_6.1p1-4_all.deb |
https://launchpad.net/ubuntu/+source/openssh/1:6.1p1-4/+build/4401534 |
3 |
Hadoop |
hadoop-1.1.2.tar.gz |
http://mirror.bjtu.edu.cn/apache/hadoop/common/hadoop-1.1.2/ |
4 |
Maven |
Maven 3.0.5 |
http://maven.apache.org/download.cgi |
5 |
Mahout |
mahout-distribution-0.7-src.tar.gz |
http://mirror.bjtu.edu.cn/apache/mahout/0.7/ |
三、安装过程
1、配置用户
1) 为后续配置hadoop方便,添加hduser用户和hadoop组,并将hduser添加到hadoop组中。
$sudo addgroup hadoop
$sudo adduser–ingroup hadoop hduser
2)修改该目录访问权限,然后使用hduser用户将上述软件拷贝到/usr/local目录下。
$sudo chown 777/usr/local
以下操作均使用hduser进行。
2、安装JAVA
1) 在/usr/local目录下解压:
$./jdk-6u45-linux-i586.bin
此时java的安装路径为:/usr/local/jdk1.6.0_45;
2) 配置hduser主目录下(hduser@ubuntu:~$)的.bashrc文件,在该文件的最后添加如下两行:
exportJAVA_HOME=/usr/local/jdk1.6.0_45
exportPATH=$PATH:$JAVA_HOME/bin
4) 注销用户后重新登录,验证java安装是否正确:
$java –version
出现如下信息后说明安装正确,
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) Client VM (build 20.45-b01, mixed mode,sharing)
3、安装SSH
1) 安装openssh-client_6.1p1-4_i386.deb:
$sudo dpkg -iopenssh-client_6.1p1-4_i386.deb
2) 安装openssh-server_6.1p1-4_i386.deb:
$sudo dpkg -iopenssh-server_6.1p1-4_i386.deb
3) 安装ssh_6.1p1-4_all.deb:
$sudo dpkg -issh_6.1p1-4_all.deb
4) 为hduser生成公用密钥
$ssh-keygen –t rsa –P“”
5) 发布密钥
$cat~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
6) 测试连接localhost
$ssh localhost
hduser@ubuntu:~$ sshlocalhost
The authenticity of host'localhost (127.0.0.1)' can't beestablished.
ECDSA key fingerprintis4d:90:91:c7:d4:20:55:5f:2a:53:62:78:c0:43:ef:d8.
Are you sure you want tocontinue connecting (yes/no)?
输入yes,即可实现无密码访问localhost,这是后来配置集群模式的基础。
4、安装Hadoop
以下五步操作对单节点和集群是相同的,每台机器都需要操作。
1) 在/usr/local目录下解压
$sudo tarxvzfhadoop-1.1.2.tar.gz
2) 为方便管理,修改目录名
$mv hadoop-1.1.2hadoop
3) 更新.bashrc文件,在该文件的最后添加如下两行:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
4) 配置/usr/local/hadoop/conf/hadoop-env.sh文件
将文件中下面行进行修改,
#exportJAVA_HOME=/usr/lib/j2sdk1.5-sun
修改为,
exportJAVA_HOME=/usr/local/jdk1.6.0_45
5) 为hadoop建立临时工作目录,赋予hduser的权限
$sudo mkdir–p/app/hadoop/tmp
$sudochownhduser:hadoop /app/hadoop/tmp
以下的步骤区分单节点和集群,为调试方便,先配置单节点,单节点成功后再修改为集群方式。
4.1 单节点安装
下面文件都在/usr/local/hadoop/conf目录。
1) 配置core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/app/hadoop/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:54310</value>
</property>
</configuration>
2) 配置mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:54311</value>
</property>
</configuration>
3) 配置hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
4) 格式化HDFS
$hadoopnamenode–format
终端输出信息如下所示:
13/05/0218:01:43INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG:StartingNameNode
STARTUP_MSG: host = ubuntu/127.0.1.1
STARTUP_MSG: args = [–format]
STARTUP_MSG: version = 1.1.2
STARTUP_MSG: build =https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.1 -r1440782;compiled by 'hortonfo' on Thu Jan 31 02:03:24 UTC 2013
************************************************************/
Usage:javaNameNode [-format [-force ] [-nonInteractive]] | [-upgrade] | [-rollback] |[-finalize]| [-importCheckpoint] | [-recover [ -force ] ]
13/05/0218:01:43INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG:Shuttingdown NameNode at ubuntu/127.0.1.1
************************************************************/
5) 启动hadoop
$start-all.sh
6) 查看hadoop状态
方法1:使用jps命令,终端输出信息如下所示,注意不能缺项。
$jps
7554NameNode
7759DataNode
8317Jps
8049JobTracker
8251TaskTracker
7968SecondaryNameNode
方法2:使用浏览器
查看namenode状态:http://localhost:50070
查看JobTracker状态:http://localhost:50030
查看TaskTracker状态:http://localhost:50060
7) 在/usr/local/hadoop/下运行一个简单的MapReduce任务
$bin/hadoopfs -put conf input
$bin/hadoopjarhadoop-examples-*.jar grep input output 'dfs[a-z.]+’
查看运行结果:
$bin/hadoop fs -get output output
$catoutput/*
终端输出信息如下:
cat:output/_logs:Is a directory
1 dfs.replication
1 dfs.server.namenode.
1 dfsadmin
4.2 多节点安装
1) 节点信息:2个节点,其中一个节点为master,另一个节点为slave,master节点的IP地址是:192.168.233.132,slave节点的IP地址是:192.168.233.135。
2)配置各节点主机信息
修改每个节点的主机信息,在/etc/hosts文件中增添如下两行:
192.168.233.132master
192.168.233.135 slave
3)将master节点ssh公钥向slave节点发布
$ssh-copy-id -i$HOME/.ssh/id_rsa.pubhduser@slave
发布后使用ssh slave命令确认一下从master向slave连接不需要输入用户名和密码。
4) 配置master节点的conf/masters文件
该文件指定启动SecondaryNameNode的节点。另外,运行start-dfs.sh脚本的节点是namenode节点,运行start-mapred.sh脚本的节点是jobtracker节点,运行start-all.sh的节点是namenode和jobtracker节点。
此处将master设置为启动SecondaryNameNode的节点,即在conf/masters文件中添加如下行:
master
5) 配置master节点的conf/slaves文件
各slave节点只作为DataNodes和TaskTrackers,该文件为start-dfs.sh所使用,通过该文件管理其中所有的slave节点。
此处指定master节点和slave节点都作为HadoopSlaves,即在conf/slaves文件中添加如下行:
master
slave
6) 在各节点上配置如下三个文件,core-site.xml, mapred-site.xml, hdfs-site.xml
#core-site.xml,指定namenode
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/app/hadoop/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<!—注意此处,由localhost改为master -->
<value>hdfs://master:54310</value>
</property>
</configuration>
#mapred-site.xml指定jobtracker
<configuration>
<property>
<name>mapred.job.tracker</name>
<!—注意此处,由localhost改为master-->
<value>master:54311</value>
</property>
</configuration>
#hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<!—注意此处,因为有两个slave节点,所以由1改为2 -->
<value>2</value>
</property>
</configuration>
7) 格式化HDFS
在格式化之前,先将/app/hadoop/tmp目录下所有内容删除。
$rm–rf /app/hadoop/tmp/*
$hadoopnamenode –format
8) 启动/停止集群
1) 解压
$tar zxvfapache-maven-3.0.5.tar.gz
2) 修改.bashrc文件
exportM3_HOME=/usr/local/apache-maven-3.0.5
exportPATH=$M3_HOME/bin:$PATH
3) 以hduser用户重新登录,查看是否安装成功
$mvn--version
终端提示信息如下:
ApacheMaven 3.0.5(r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 05:51:28-0800)
Mavenhome: /usr/local/apache-maven-3.0.5
Java version:1.6.0_45, vendor: Sun Microsystems Inc.
Javahome: /usr/local/jdk1.6.0_45/jre
Defaultlocale: en_US, platform encoding: UTF-8
OSname: "linux", version:"3.8.0-19-generic", arch:"i386", family: "unix"
6、安装Mahout
1)获取最新版代码,保存至/usr/local/目录下
$svn co http://svn.apache.org/repos/asf/mahout/trunk
$mv trunkmahout
2) 在/usr/local/mahout目录下执行,
$mvn cleaninstall-DskipTests=true
3) 在/usr/local/mahout/core目录下执行
$mvn compile
$mvn install
4) 在/usr/local/mahout/example目录下执行
$mvn compile
5) 修改~/.bashrc文件,增加下面内容
exportMAHOUT_HOME=/usr/local/mahout
exportPATH=$PATH:$MAHOUT_HOME/bin
四、运行Mahout实例
1)这里使用Mahout自带的Clustering of Synthetic controldata 实例;
2)下载synthetic_control.data文件,保存至$MAHOUT_HOME目录下;
http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data
注意检查文件大小,正确值为288374Bytes。
3) 在master节点上启动hadoop,启动后注意使用jps查看一下
$start-all.sh
4) 在HDFS中建立testdata目录
$hadoop fs -mkdirtestdata
5) 将本地的synthetic_control.data文件拷贝到HDFS的testdata目录下
$hadoopfs -put$MAHOUT_HOME/synthetic_control.data testdata
6) 运行mahoutjob
$mahoutorg.apache.mahout.clustering.syntheticcontrol.kmeans.Job
7) 查看运行结果
$hadoop fs -getoutput$MAHOUT_HOME/examples
$cd$MAHOUT_HOME/examples/output
$ls
终端上有如下信息说明结果正确。
clusteredPoints clusters-10-final clusters-4 clusters-7 data
clusters-0 clusters-2 clusters-5 clusters-8 _policy
clusters-1 clusters-3 clusters-6 clusters-9
五、Q&A
Q1) ssh: connectto host localhost port22: Connection refused
A1) ssh没有正确安装,按照上述步骤重新安装。
Q2) hduser is notin the sudoersfile. This incident willbe reported.
A2) 使用root用户,修改/etc/sudoers文件属性:chomod u+w /etc/sudoers,然后在该文件中添加如下内容:hduser ALL=(ALL:ALL) ALL,保存文件后,将文件属性改回:chomod u-w /etc/sudoers。
Q3)org.apache.hadoop.hdfs.server.datanode.DataNode:java.io.IOException:Incompatible namespaceIDs in /app/hadoop/tmp/dfs/data:namenode namespaceID =182065604; datanode namespaceID = 1620713375
A3) 每次namenodeformat会重新创建一个namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空tmp下的所有内容。
Q4) NameNode is insafe mode
A4) 使用下面的命令解除:hadoopdfsadmin -safemode leave
Q5) Warning: $HADOOP_HOME isdeprecated.
A5) 将exportHADOOP_HOME_WARN_SUPPRESS=TRUE添加到每个节点的/etc/hadoop/hadoop-env.sh配置文件中。
Q6)org.apache.mahout.math.CardinalityException:My cardinality is: 0, but the otheris: 60
A6) 输入数据文件不完整,重新下载确认文件大小。
参考文献:
1、在ubuntu中配置SSH(解决connectto host localhost port 22:Connection refused问题) http://blog.csdn.net/feliciafay/article/details/6561414
2、解决ssh的"Writefailed: Broken pipe"问题,http://www.cnblogs.com/dudu/archive/2013/02/07/ssh-write-failed-broken-pipe.html
3、http://hadoop.apache.org/docs/r1.1.2/single_node_setup.html#PseudoDistributed
4、https://cwiki.apache.org/confluence/display/MAHOUT/BuildingMahout
5、https://cwiki.apache.org/confluence/display/MAHOUT/Clustering+of+synthetic+control+data
6、http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/
7、http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-multi-node-cluster/