刚接触Hadoop三天,今天终于成功用三台机跑起测试,记录一下。html
1、准备(全部节点都须要作):java
系统:Ubuntu12.04node
java版本:JDK1.7(安装步骤看上一篇文章)ubuntu
SSH(ubuntu自带)服务器
确保三台机在同一个ip段,最好设置为静态IP,重启后就不用纠结IP变化了ssh
机器分配:一台master,两台slavejvm
个人主机信息是(hosts文件添加以下信息):分布式
192.168.88.123 h1ide
192.168.88.124 h2oop
192.168.88.125 h3
其中第一项是内网IP ,第二项是主机名
各节点做用:
h1:NameNode、JobTracker
h2:DataNode、TaskTracker
h3:DataNode、TaskTracker
安装SSH:
sudo apt-get install ssh
测试:ssh localhost
输入当前用户的密码回车 没异常说明安装成功
开启SSHD服务:
安装:sudo apt-get install openssh-server
确认是否启动:
ps -e | grep ssh
找到到sshd,有即启动了。
建立Hadoop用户(名为grid)
adduser grid
信息随便填,之后运行操做Hadoop都是用这个用户(注意看清命令行别用了其余用户)
2、配置Hadoop
1.无密码登录
在Hadoop启动之后,Namenode是经过SSH(Secure Shell)来启动和中止各个datanode上的各类守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的形式,故咱们需要配置SSH运用无密码公钥认证的形式。
首先设置namenode的ssh为无需密码的、自动登录。
换切到grid用户
su grid
cd
ssh-keygen -t rsa
完成后会在grid目录产生隐藏文件.ssh,经过ls查看,而后
cp id_rsa.pub authorized_keys
测试
ssh h1
第一次会提示确认继续链接,打yes,这会把该服务器添加到你的已知主机列表中
一样在h2,h3上作以上操做
最后,如何使各个节点相互访问不须要密码,将三个节点的authorized_keys文件里面的内容合成一个文件而后替换掉原来的,替换完毕后能够用
ssh XX(XX为主机名)
相互测试是否链接成功。
2.配置Hadoop文件:
在hadoop/conf目录下修改文件有hadoop-env.sh,core-site.xml,hdfs-site.xml,mapred-site.xml,master,slaves
hadoop-env.sh
修改JAVA_HOME路径
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_45
记得去掉前面的#
core-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>fs.default.name</name> <value>hdfs://h1:49000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/grid/var</value> </property> </configuration>
1)fs.default.name是NameNode的URI。hdfs://主机名:端口/
2)hadoop.tmp.dir :Hadoop的默认临时路径,这个最好配置,若是在新增节点或者其余状况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录便可。不过若是删除了NameNode机器的此目录,那么就须要从新执行NameNode格式化的命令。
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/grid/name1,/home/grid/name2</value> <description> </description> </property> <property> <name>dfs.data.dir</name> <value>/home/grid/data1,/home/grid/data2</value> <description> </description> </property> <property> <name>dfs.replication</name> <value>2</value> </property> </configuration>
1) dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。 当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到全部目录中作冗余备份。
2) dfs.data.dir是DataNode存放块数据的本地文件系统路径,逗号分割的列表。 当这个值是逗号分割的目录列表时,数据将被存储在全部目录下,一般分布在不一样设备上。
3)dfs.replication是数据须要备份的数量,默认是3,若是此数大于集群的机器数会出错。
注意:此处的name一、name二、data一、data2目录不能预先建立,hadoop格式化时会自动建立,若是预先建立反而会有问题。
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>h1:49001</value> </property> <property> <name>mapred.local.dir</name> <value>/home/grid/var</value> </property> </configuration>
1)mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。
配置masters和slaves主从结点
master
h1
slaves
h2 h3
配置完毕,把配置好的hadoop文件夹拷贝到其余集群的机器上,并保证其余机器的JDK 安装路径一致(若是不一致就另外再修改配置文件conf/hadoop-env.sh憋)
scp -r /home/grid/hadoop-0.20.2 grid@h2:/home/grid
scp -r /home/grid/hadoop-0.20.2 grid@h2:/home/grid
3、启动Hadoop
一、先格式化一个新的分布式文件系统
cd
bin/hadoop namenode -format
成功后系统输出:
INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name2 has been successfully formatted.
这一行,看到successfully单词木有,格式化成功。
执行完后能够到master机器上看到/home/hadoop//name1和/home/hadoop//name2两个目录。
2.启动全部节点
在主节点master上面启动hadoop,主节点会启动全部从节点的hadoop。
cd
bin/start-all.sh(同时启动HDFS和Map/Reduce)
输出:
grid@h1:~/hadoop-0.20.2$ bin/start-all.sh
starting namenode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-namenode-h1.out
h2: starting datanode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-datanode-h2.out
h3: starting datanode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-datanode-h3.out
h1: starting secondarynamenode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-secondarynamenode-h1.out
starting jobtracker, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-jobtracker-h1.out
h2: starting tasktracker, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-tasktracker-h2.out
h3: starting tasktracker, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-tasktracker-h3.out
没有出现什么Error或Warming之类的就表示运行成功了
运行成功后看看程序是否正常
/usr/lib/jvm/jdk1.7.0_45/bin//jps
能够看到在h1结点上有进程
2928 NameNode
3319 Jps
3105 SecondaryNameNode
3184 JobTracker
很熟悉的字眼我就很少说了,在slaves结点上也检测下是否正常,会有
TaskTracker,DataNode
若没缺乏以上进程即配置有问题。
4、测试
建一个目录,里面建两个txt文件,用hadoop项目现有的hadoop-0.20.2-examples.jar例子测试txt里面单词的出现次数。
cd
mkdir input
cd input
echo "hello world" > test1.txt
echo "hello hadoop" > test2.txt
建完文件后,将文件放到HDFS系统的in目录上
cd ../hadoop-0.20.2
bin/hadoop dfs -put ../input in
测试了,运行
bin/hadoop jar hadoop-0.20.2-examples.jar wordcount in out
会出现一系列的运行信息
grid@h1:~/hadoop-0.20.2$ bin/hadoop jar hadoop-0.20.2-examples.jar wordcount in out
13/12/26 14:04:05 INFO input.FileInputFormat: Total input paths to process : 2
13/12/26 14:04:06 INFO mapred.JobClient: Running job: job_201312261337_0006
13/12/26 14:04:07 INFO mapred.JobClient: map 0% reduce 0%
13/12/26 14:04:14 INFO mapred.JobClient: map 50% reduce 0%
13/12/26 14:04:15 INFO mapred.JobClient: map 100% reduce 0%
13/12/26 14:04:23 INFO mapred.JobClient: map 100% reduce 100%
13/12/26 14:04:25 INFO mapred.JobClient: Job complete: job_201312261337_0006
13/12/26 14:04:25 INFO mapred.JobClient: Counters: 17
13/12/26 14:04:25 INFO mapred.JobClient: Job Counters
13/12/26 14:04:25 INFO mapred.JobClient: Launched reduce tasks=1
13/12/26 14:04:25 INFO mapred.JobClient: Launched map tasks=2
13/12/26 14:04:25 INFO mapred.JobClient: Data-local map tasks=2
13/12/26 14:04:25 INFO mapred.JobClient: FileSystemCounters
13/12/26 14:04:25 INFO mapred.JobClient: FILE_BYTES_READ=55
13/12/26 14:04:25 INFO mapred.JobClient: HDFS_BYTES_READ=25
13/12/26 14:04:25 INFO mapred.JobClient: FILE_BYTES_WRITTEN=180
13/12/26 14:04:25 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=25
13/12/26 14:04:25 INFO mapred.JobClient: Map-Reduce Framework
13/12/26 14:04:25 INFO mapred.JobClient: Reduce input groups=3
13/12/26 14:04:25 INFO mapred.JobClient: Combine output records=4
13/12/26 14:04:25 INFO mapred.JobClient: Map input records=2
13/12/26 14:04:25 INFO mapred.JobClient: Reduce shuffle bytes=61
13/12/26 14:04:25 INFO mapred.JobClient: Reduce output records=3
13/12/26 14:04:25 INFO mapred.JobClient: Spilled Records=8
13/12/26 14:04:25 INFO mapred.JobClient: Map output bytes=41
13/12/26 14:04:25 INFO mapred.JobClient: Combine input records=4
13/12/26 14:04:25 INFO mapred.JobClient: Map output records=4
13/12/26 14:04:25 INFO mapred.JobClient: Reduce input records=4
没有什么Error或Warming之类的字眼特别是有
map 100% reduce 100%
表示成功运行了,结果可一输入
bin/hadoop dfs -cat out/*
看到结果
hadoop 1
hello 2
world 1
over。。。。。。