在动手准备实践hadoop之前,最好把Google File System和Map/Reduce的原理搞清楚,否则可能要走很多弯路。
准备机器:一台master,若干台slave,配置每台机器的/etc/hosts保证各台机器之间通过机器名可以互访,例如:
10.0.0.10 master
10.0.0.11 slave1
10.0.0.12 slave2
保存后,重启网络服务,命令:service network restart
Linux所需软件包括:
ssh的安装以Ubuntu Linux为例:
$ sudo apt-get install ssh
$ sudo apt-get install rsync
免密码ssh设置,保证至少从master可以不用口令登陆所有的slaves:
登陆master,执行命令
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
将生成的id_dsa.pub拷贝到所有slaves机器上相同路径下,例如:
$ scp ~/.ssh/id_dsa.pub root@slave1:/root/.ssh/master_dsa.pub
注意,此处重命名了一下。
登陆到slaves的机器上执行命令:
$ cat /root/.ssh/master_rsa.pub >>/root/.ssh/authorized_keys
现在再尝试通过ssh从master登录到slaves,应该不需要密码了
$ ssh slave1
如果还有问题,可以参考“理解 RSA/DSA 认证”:
http://www.ibm.com/developerworks/cn/linux/security/openssh/part1/index.html
下载hadoop发行版,地址:http://apache.freelamp.com/hadoop/core/stable/
安装Hadoop集群通常要将安装软件解压到集群内的所有机器上。并且安装路径要一致,如果我们用HADOOP_HOME指代安装的根路径,通常,集群里的所有机器的HADOOP_HOME路径相同。
通常,集群里的一台机器被指定为NameNode,另一台不同的机器被指定为JobTracker。这些机器是masters。余下的机器即作为DataNode也作为TaskTracker。这些机器是slaves。
下载安装包后,直接解压安装即可:
$ tar -zxvf hadoop-0.20.2.tar.gz
$ cd hadoop-0.20.2
注:如果集群内机器的环境完全一样,可以在一台机器上配置好,然后把配置好的软件即hadoop-0.20.2整个文件夹拷贝到其他机器的相同位置即可。
编辑conf/hadoop-env.sh文件,至少需要将JAVA_HOME设置为Java安装根路径。
配置conf/core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9100</value>
</property>
</configuration>
fs.default.name是NameNode的URI。hdfs://主机名:端口/
配置conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/opt/hadoop/hadoopfs/name1,/opt/hadoop/hadoopfs/name2</value>
<description> </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/opt/hadoop/hadoopfs/data1,/opt/hadoop/hadoopfs/data2</value>
<description> </description>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。 当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到所有目录中做冗余备份。
dfs.data.dir是DataNode存放块数据的本地文件系统路径,逗号分割的列表。 当这个值是逗号分割的目录列表时,数据将被存储在所有目录下,通常分布在不同设备上。
dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错。
注意:此处的name1、name2、data1、data2目录不能预先创建,hadoop格式化时会自动创建,如果预先创建反而会有问题。
配置conf/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9200</value>
</property>
</configuration>
mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。
配置conf/masters和conf/slaves来设置主从结点,注意最好使用主机名,并且保证机器之间通过主机名可以互相访问,每个主机名一行。
masters:
master
slaves:
slave1
slave2
配置结束,把配置好的hadoop-0.20.2文件夹拷贝到其他集群的机器中,并且保证上面的配置对于其他机器而言正确,例如:如果其他机器的Java安装路径不一样,要修改conf/hadoop-env.sh
$ scp -r /opt/hadoop/hadoop-0.20.2 root@slave1:/opt/hadoop
先格式化一个新的分布式文件系统
$ cd hadoop-0.20.2
$ bin/hadoop namenode -format
查看输出保证分布式文件系统格式化成功
在主节点master上面启动hadoop,主节点会启动所有从节点的hadoop。
$ bin/start-all.sh
从主节点master关闭hadoop,主节点会关闭所有从节点的hadoop。
$ bin/stop-all.sh
Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs).
浏览NameNode和JobTracker的网络接口,它们的地址默认为:
NameNode - http://master:50070/
JobTracker - http://master:50030/
将输入文件拷贝到分布式文件系统:
$ bin/hadoop fs -put conf input
运行发行版提供的示例程序:
$ bin/hadoop jar hadoop-0.20.2-examples.jar grep input output 'dfs[a-z.]+'
查看输出文件:
将输出文件从分布式文件系统拷贝到本地文件系统查看:
$ bin/hadoop fs -get output output
$ cat output/*
或者
在分布式文件系统上查看输出文件:
$ bin/hadoop fs -cat output/*
启动运行成功后,可以多熟悉熟悉hadoop dfs命令,例如:
hadoop dfs –ls 查看/usr/root目录下的内容,默认如果不填路径这就是当前用户路径;
hadoop dfs –rmr xxx xxx就是删除目录;
hadoop dfsadmin -report 这个命令可以全局的查看DataNode的情况;
hadoop job -list 后面增加参数是对于当前运行的Job的操作,例如list,kill等;
hadoop balancer 均衡磁盘负载的命令。
ps:用JavaEye编辑器调整格式差点把我搞死。。。