硬件环境
共有3台机器,ubuntu 10.04和9.10系统,Java使用的是jdk1.6.0。IP配置如下:
ingteam:192.168.0.1
ing-1:192.168.0.101
ing-2:192.168.0.102
前提:ssh rsync jdk1.6
$sudo apt-get install ssh
$sudo apt-get install rsync
$sudo apt-get install sun-java6-jdk
ps:Ubuntu 10.04 LTS弄走了sun-java6-jdk,只有openjdk
ubuntu 10.04安装sun-java6-jdk
$sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
然后update再安装
务必确保每台机器的主机名和IP地址之间能正确解析
一个很简单的测试办法就是ping一下主机名,若不能正确解析,可以修改/etc/hosts文件,如果该台机器作Namenode用,则需要在hosts文件中加上集群中所有机器的IP地址及其对应的主机名;如果该台机器作Datanode用,则只需要在hosts文件中加上本机IP地址和Namenode机器的IP地址。
以本文为例,ingteam中的/etc/hosts文件看起来就应该是这样的:
127.0.0.0 localhost
192.168.0.1 ingteam
192.168.0.101 ing-1
192.168.0.102 ing-2
ing-1中的/etc/hosts文件看起来就应该是这样的:
127.0.0.0 localhost
192.168.0.1 ingteam
192.168.0.101 ing-1
对于Hadoop来说,在HDFS看来,节点分为Namenode和Datanode,其中Namenode只有一个,Datanode可以是很多;在MapReduce看来,节点又分为Jobtracker和Tasktracker,其中Jobtracker只有一个,Tasktracker可以是很多。
我是将namenode和jobtracker部署在ingteam上,ing-1,ing-2作为datanode和tasktracker。由于Hadoop要求所有机器上hadoop的部署目录结构要相同,并且都有一个相同的用户名的帐户。
SSH免密码设置
在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,故我们需要配置SSH使用无密码公钥认证的方式。
首先在ingteam上生成密钥对:
$ssh-keygen -t rsa
这个命令将为ingteam上的用户ingteam生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要为生成的密钥输入passphrase的时候,直接回车,也就是将其设定为空密码。生成的密钥对id_rsa,id_rsa.pub,默认存储在/home/ingteam/.ssh目录下。然后将id_rsa.pub的内容复制到每个机器(也包括本机)的/home/ingteam/.ssh/authorized_keys文件中,如果机器上已经有authorized_keys这个文件了,就在文件末尾加上id_rsa.pub中的内容,如果没有authorized_keys这个文件,直接cp或者scp就好了,下面的操作假设各个机器上都没有authorized_keys文件。
[ingteam@ingteam:.ssh]$scp authorized_keys ing-1:/home/ingteam/.ssh/
[ingteam@ing-2:.ssh]$chmod 644 authorized_keys
这一步非常关键,必须保证authorized_keys只对其所有者有读写权限,其他人不允许有写的权限,否则SSH是不会工作的。
接着,在三台机器上都需要对sshd服务进行配置(其实是可以不用配置的,完成了上面的那些操作了以后SSH就已经可以工作了)
至此各个机器上的SSH配置已经完成,可以测试一下了,比如ingteam向dbrg-2发起ssh连接
[ingteam@ingteam:~]$ssh ing-1
不过,别忘了测试本机ssh ingteam
环境的配置
在$HADOOP_HOME/conf/hadoop-env.sh中定义了Hadoop启动时需要的环境变量设置,其中我们至少需要配置JAVA_HOME(Jdk的路径)变量;另外我们一般还需要更改HADOOP_LOG_DIR(Hadoop的日志路径)这个变量,默认的设置是“export HADOOP_LOG_DIR=${HADOOP_HOME}/logs”,一般需要将其配置到一个磁盘空间比较大的目录下。
我的是这样设置的
export JAVA_HOME=/usr/lib/jvm/java-6-sun
Hadoop核心代码需要配置conf文件夹里面的core-site.xml,hdfs-site.xml,mapread-site.xml,mapred-site.xml,hadoop-env.sh这几个文件。具体各个配置的含义请参考Hadoop帮助文档。
1.首先编辑各个机器节点(包括master和slave)的core-site.xml文件,命令如下:(Hadoop 文件夹放在home下)
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <!-- Put site-specific property overrides in this file. -->
- <configuration>
- <property>
- <name>fs.default.name</name>
- <value>hdfs://192.168.0.1:9000</value>
- </property>
- </configuration>
2.其次编辑各个机器节点(包括master和slave)的hdfs-site.xml,命令如下:
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <!-- Put site-specific property overrides in this file. -->
- <configuration>
- <property>
- <name>dfs.name.dir</name>
- <value>/home/hadoop/NameData</value>
- </property>
- <property>
- <name>dfs.permissions</name>
- <value>false</value>
- </property>
- <property>
- <name>dfs.replication</name>
- <value>1</value>
- </property>
- </configuration>
3.再次,编辑各个机器节点(包括master和slave)mapred-site.xml文件,命令如下:
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <!-- Put site-specific property overrides in this file. -->
- <configuration>
- <property>
- <name>mapred.job.tracker</name>
- <value>192.168.0.1:9001</value>
- </property>
- </configuration>
Masters/Slave文件配置
在master主机上的hadoop/conf/目录下,打开master 文件,把master 主机名添加进去:
192.168.0.1
在master主机上的hadoop/conf/目录下,打开slaves文件,该文件用来指定所有的从节点,一行指定一个主机名,因此slaves文件看起来应该是这样的
192.168.0.101
192.168.0.102
部署Hadoop
前面讲的这么多Hadoop的环境变量和配置文件都是在dbrg-1这台机器上的,现在需要将hadoop部署到其他的机器上,保证目录结构一致。
$scp -r /home/hadoop ing-1:/home/
$scp -r /home/hadoop ing-2:/home/
至此,可以说,Hadoop已经在各个机器上部署完毕了下面就让我们开始启动Hadoop
启动Hadoop
启动之前,我们先要格式化namenode,先进入~/HadoopInstall/hadoop目录,执行下面的命令
$bin/hadoop namenode -format
不出意外,应该会提示格式化成功。如果不成功,就去hadoop/logs/目录下去查看日志文件
下面就该正式启动hadoop啦,在bin/下面有很多启动脚本,可以根据自己的需要来启动。
* start-all.sh 启动所有的Hadoop守护。包括namenode, datanode, jobtracker, tasktrack
* stop-all.sh 停止所有的Hadoop
* start-mapred.sh 启动Map/Reduce守护。包括Jobtracker和Tasktrack
* stop-mapred.sh 停止Map/Reduce守护
* start-dfs.sh 启动Hadoop DFS守护.Namenode和Datanode
* stop-dfs.sh 停止DFS守护
在这里,简单启动所有守护
$bin/start-all.sh
同样,如果要停止hadoop,则
$bin/stop-all.sh
HDFS操作
运行bin/目录的hadoop命令,可以查看Haoop所有支持的操作及其用法,这里以几个简单的操作为例。
建立目录
$bin/hadoop dfs -mkdir testdir
在HDFS中建立一个名为testdir的目录
复制文件
$bin/hadoop dfs -put /home/dbrg/large.zip testfile.zip
把本地文件large.zip拷贝到HDFS的根目录/user/dbrg/下,文件名为testfile.zip
查看现有文件
$bin/hadoop dfs -ls