Hadoop简易分布式安装

转载自 dt_zw
最终编辑 xjtdy888

一、准备工作准备机



一台master,若干台slave,配置每台机器的/etc/hosts保证各台机器之间通过机器名可以互访,例如:

10.0.0.10 master
10.0.0.11 slave1
10.0.0.12 slave2


保存后,重启网络服务,命令:service network restart

 Linux所需软件包括:

  1. JavaTM1.5.x以上,必须安装,建议选择Sun公司发行的Java版本。
  2. ssh 必须安装并且保证 sshd一直运行,以便用Hadoop 脚本管理远端Hadoop守护进程。

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配置

1.安装

下载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整个文件夹拷贝到其他机器的相同位置即可。

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>
#hadoop的name目录路径
<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来设置主从结点,注意最好使用主机名,并且保证机器之间通过主机名可以互相访问,每个主机名一行。

vi masters:
master

vi slaves:
slave1
slave2

配置结束,把配置好的hadoop-0.20.2文件夹拷贝到其他集群的机器中,并且保证上面的配置对于其他机器而言正确,例如:如果其他机器的Java安装路径不一样,要修改conf/hadoop-env.sh 

$ scp -r /opt/hadoop/hadoop-0.20.2 root@slave1:/opt/hadoop

三、hadoop启动

先格式化一个新的分布式文件系统

$ cd hadoop-0.20.2
$ bin/hadoop namenode -format
成功情况下系统输出:

10/07/14 10:00:13 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = v-jiwan-ubuntu-0/127.0.0.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 0.20.2
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20 -r 911707; compiled by 'chrisdo' on Fri Feb 19 08:07:34 UTC 2010
************************************************************/
10/07/14 10:00:14 INFO namenode.FSNamesystem: fsOwner=root,root
10/07/14 10:00:14 INFO namenode.FSNamesystem: supergroup=supergroup
10/07/14 10:00:14 INFO namenode.FSNamesystem: isPermissionEnabled=true
10/07/14 10:00:14 INFO common.Storage: Image file of size 94 saved in 0 seconds.
10/07/14 10:00:14 INFO common.Storage: Storage directory /opt/hadoop/hadoopfs/name1 has been successfully formatted.
10/07/14 10:00:14 INFO common.Storage: Image file of size 94 saved in 0 seconds.
10/07/14 10:00:14 INFO common.Storage: Storage directory /opt/hadoop/hadoopfs/name2 has been successfully formatted.
10/07/14 10:00:14 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at v-jiwan-ubuntu-0/127.0.0.1
************************************************************/
查看输出保证分布式文件系统格式化成功
执行完后可以到master机器上看到/opt/hadoop/hadoopfs/name1和/opt/hadoop/hadoopfs/name2两个目录。

在主节点master上面启动hadoop,主节点会启动所有从节点的hadoop。

$ bin/start-all.sh
系统输出:
starting namenode, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-namenode-v-jiwan-ubuntu-0.out
h2: starting datanode, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-datanode-v-jiwan-ubuntu-2.out
h1: starting datanode, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-datanode-v-jiwan-ubuntu-1.out
h0: starting secondarynamenode, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-secondarynamenode-v-jiwan-ubuntu-0.out
starting jobtracker, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-jobtracker-v-jiwan-ubuntu-0.out
h2: starting tasktracker, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-tasktracker-v-jiwan-ubuntu-2.out
h1: starting tasktracker, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-tasktracker-v-jiwan-ubuntu-1.out

As you can see in slave's output above, it will automatically format it's storage directory (specified bydfs.data.dir) if it is not formatted already. It will also create the directory if it does not exist yet.
执行完后可以到master和slave机器上看到/opt/hadoop/hadoopfs/data1和/opt/hadoop/hadoopfs/data2两个目录。

从主节点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 -mkdir input
$ bin/hadoop fs -put conf/core-site.xml input

运行发行版提供的示例程序:
$ bin/hadoop jar hadoop-0.20.2-examples.jar grep input output 'dfs[a-z.]+'

补充
Q: bin/hadoop jar hadoop-0.20.2-examples.jar grep input output 'dfs[a-z.]+' 什么意思啊?
A: bin/hadoop jar(使用hadoop运行jar包)hadoop-0.20.2_examples.jar(jar包的名字)grep (要使用的类,后边的是参数)input output 'dfs[a-z.]+'
整个就是运行hadoop示例程序中的grep,对应的hdfs上的输入目录为input、输出目录为output。
Q: 什么是grep?
A: A map/reduce program that counts the matches of a regex in the input.

查看输出文件:

将输出文件从分布式文件系统拷贝到本地文件系统查看:
$ bin/hadoop fs -get output output
$ cat output/*

或者

在分布式文件系统上查看输出文件:
$ bin/hadoop fs -cat output/*

统计结果:
root@v-jiwan-ubuntu-0:~/hadoop/hadoop-0.20.2-bak/hadoop-0.20.2# bin/hadoop fs -cat output/part-00000
3       dfs.class
2       dfs.period
1       dfs.file
1       dfs.replication
1       dfs.servers
1       dfsadmin
1       dfsmetrics.log

启动运行成功后,可以多熟悉熟悉hadoop命令,例如:

hadoop fs –ls                      查看/usr/root目录下的内容,默认如果不填路径这就是当前用户路径;
hadoop fs –rmr xxx             xxx就是删除目录;
hadoop dfsadmin -report  这个命令可以全局的查看DataNode的情况;
hadoop job  -list                 后面增加参数是对于当前运行的Job的操作,例如list,kill等;
hadoop balancer                均衡磁盘负载的命令。

http://www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_%28Single-Node_Cluster%29
http://www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_%28Multi-Node_Cluster%29
hadoop配置两大问题:
配置中使用主机名,各主机间hosts文件一致

hadoop格式化前,先删除文件,再格式化,避免namenodeID 和dataID不一致问题

每次namenode format会重新创建一个namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的数据,但是没有晴空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空tmp一下 的所有目录.

注:linux可执行文件要以tar或压缩形式传输,否则,文件属性会在传输过程中被修改,造成很多细微难以发现的错误。

你可能感兴趣的:(Hadoop简易分布式安装)