您的位置:首页 > 运维架构

Hadoop+Mahout安装手记

2013-05-07 08:13 405 查看
最近一直捣鼓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) 启动/停止集群

启动,在master节点上运行下面两个命令:

$start-dfs.sh//该命令启动namenode,以及conf/slaves文件指定的DataNode。

$start-mapred.sh//该命令启动jobtracker,以及conf/slaves文件指定的tasktracker。

在master节点上使用jps命令查看,相似内容如下,

11273 JobTracker

10920 DataNode

10715 NameNode

11128 SecondaryNameNode

11600 Jps

11481 TaskTracker

在slave节点上使用jps查看,相似内容如下,

7951 Jps

7879 TaskTracker

7543 DataNode

如果缺少NameNode,DataNode,SecondaryNameNode,JobTracker,TaskTracker中的某一项,说明hadoop没有正确启动,可以到hadoop/logs目录下查看相应的log文件查找原因。

停止,停止的顺序与启动的顺序相反,即,

$stop-mapred.sh

$stop-dfs.sh

5、安装Maven
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"问题,/article/4583969.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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: