一:hadoop
版本:hadoop-0.20.2.tar.gz
1.部署
1.1把hadoop-0.20.2.tar.gz部署到所有节点,通常部署在相同路径下。在conf/hadoop_env.sh里配置好java home,用bin/hadoop验证。
更好地,编辑/etc/profile,加上下面这些
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre
export HADOOP_HOME=/usr/local/hadoop
export PIG_HOME=/usr/local/hadoop/pig-0.9.1
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$PIG_HOME/bin
1.2在master端的keygen传到所有节点上。验证:用master ssh所有节点,不用输入密码就能登录。
1.3编辑conf/下的 masters slaves mapred-site.xml core-site.xml和hdfs-site.xml(可选)
masters和slaves分别写入master和slaves的节点ip,一行一个
mapred-site.xml 改成如下
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>masterIP:9001</value>
</property>
</configuration>
core-site.xml 改成如下
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://masterIP:9000</value>
</property>
</configuration>
hdfs-site.xml(可选) 改成如下:
<configuration>
<property>
<name>dfs.replication<name>
<value>2<value>
<description>Default block replication<description>
<property>
</configuration>
可以看到上面的定义的默认文件副本数是2(<value>2<value>),通常这个值也不会超过3.
把这4个文件复制到其他节点的相同路径下。
2.启动/关闭:bin/start-all.sh bin/stop-all.sh
二:pig(下载pig时注意版本与hadoop版本)
于hadoop相同,解压后修改/etc/profile,
export PIG_HOME=/usr/local/hadoop/pig-0.9.1
export PATH=$PATH:$PIG_HOME/bin
可见,我的pig安装在/usr/local/hadoop/pig-0.9.1目录下的。
在pig/conf/pig.properties最后加上这两句话
mapred.job.tracker=192.168.1.1:9001
fs.default.name=hdfs://192.168.1.1:9000
他们要与hadoop的mapred-site.xml,core-site.xml这两个配置文件内容一致。
好了,试试吧。输入pig看看有没有刚刚配置的那两个变量hdfs和map-reduce job tracker的信息。
1 |
pig -x local |
学习Hadoop一般的入门都是Oreilly的《《Hadoop权威指南》》中文版,其中测试MapReduce的第一个程序就是统计一个文本文件中单词出现的次数。Pig是为了简化MapReduce开发的,肯定也是能实现这个的。我以这个为例,写一个测试的例子。
我准备了一个文件,文件名为:nie.txt 里边是一片普通的英文文章,比较长,大约52KB。
我在自己的home下建立了一个workspace的文件夹,我是把它当作开始目录的。(为什么说这个?因为Pig Load数据的时候相对路径的起始文件路径很重要,搞错了就会出现文件找不到的错误。我开始就犯了这个错误)
nie.txt文件的路径为: ~/workspace/nie.txt 而我进入Pig外壳程序的起始路径是:~/workspace/ 下面是我的Pig脚本:
1 |
words = load 'nie.txt' using PigStorage( ' ' ) as (line); --以空格作为分隔符把内容分词读入 |
2 |
grpd = group words by line; --以每个单词聚类,真实的是一个MapReduce的Map阶段 |
3 |
cntd = foreach grpd generate group, COUNT(words); -- 这里既上一步Map完成紧接着Reduce阶段进行统计 |
4 |
dump cntd; --直接在终端打印结果便于查看 |
1 |
pig -x local test1.pig |
01 |
(So,1) |
02 |
(We,1) |
03 |
(as,7) |
04 |
(at,1) |
05 |
(be,3) |
06 |
(he,2) |
07 |
( if ,1) |
08 |
( in ,12) |
09 |
(is,10) |
10 |
(it,9) |
11 |
(no,2) |
12 |
(of,21) |
13 |
(on,3) |
14 |
(or,1) |
15 |
(so,1) |
16 |
(to,11) |
17 |
(us,2) |
18 |
(we,1) |
OK,我们的第一个例子已经完美的运行了。下面我解释一下代码。
如上所见,Pig也支持注释的,他的注释方式有2中,
一种是SQL的注释方式,如上面的--, --行后边的内容都会忽略
另一种是Java中的注释方式, /* 注释内容 */ ,它的注释可以一行也可以跨行(Java的程序员是不是很友好?)。
另外Pig Latin[忘了介绍了,Pig的脚本有专业的名字,叫Pig Latin,不知道神码意思]也是用;[分号]换行的,一条语句可以写在一行也可以多行。Pig在运行前会检查Pig Latin,并且对Pig Latin进行编译,用以确定程序逻辑和分析MapReduce。
如果程序有简单逻辑错误,运行前都不会编译通过。如我写的时候把group words by line中的line意识的写成了word,运行时出现了:
1 |
2013-04-13 22:21:12,619 [main] INFO org.apache.pig.Main - Logging error messages to: /home/zhenqin/workspace/pig_1365862872616.log |
2 |
2013-04-13 22:21:12,713 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: file :/// |
3 |
2013-04-13 22:21:13,225 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1025: |
4 |
Invalid field projection. Projected field [word] does not exist in schema: line:bytearray. |
5 |
Details at logfile: /home/zhenqin/workspace/pig_1365862872616.log |
下面我解释一下我出现过的问题。我在起初测试时进入Pig时不是从workspace进入的,我是从pighome,以bin/pig运行的,而我的统计文件存储在 ~/workspace/下,尽管我在Pig Latin脚本中使用了 load ‘/home/zhenqin/workspace/’或者 load ‘file:///home/zhenqin/workspace/’ 都报错,无法找到文件。为此我纠结了很长时间。
原来Pig的外壳程序Grunt也是有当前路径的。因此可以使用cd 跳转当前路径。
如我从pighome下进入Grunt,执行ls命令出现如下:
01 |
grunt> ls |
02 |
file :/opt/pig-0.9.2/testfile:/opt/pig-0.9.2/tutorialfile:/opt/pig-0.9.2/libfile:/opt/pig-0.9.2/ivyfile:/opt/pig-0.9.2/CHANGES.txt87506 |
03 |
file :/opt/pig-0.9.2/RELEASE_NOTES.txt2224 |
04 |
file :/opt/pig-0.9.2/LICENSE.txt11358 |
05 |
file :/opt/pig-0.9.2/conffile:/opt/pig-0.9.2/licensefile:/opt/pig-0.9.2/NOTICE.txt2120 |
06 |
file :/opt/pig-0.9.2/binfile:/opt/pig-0.9.2/build.xml77427 |
07 |
file :/opt/pig-0.9.2/pig-0.9.2.jar17585882 |
08 |
file :/opt/pig-0.9.2/README.txt1307 |
09 |
file :/opt/pig-0.9.2/ivy.xml13509 |
10 |
file :/opt/pig-0.9.2/scriptsfile:/opt/pig-0.9.2/pig-0.9.2-withouthadoop.jar6018058 |
它同时也支持Hadoop的一些命名,如:
1 |
copyFromLocal localfile hdfsfile |
2 |
copyToLocal hdfsfile localfile |
1 |
grunt> sh ls -l |
2 |
总用量 6 |
3 |
-rw------- 1 zhenqin zhenqin 52220 2月 3 2012 nie.txt |
4 |
-rw-rw-r-- 1 zhenqin zhenqin 2896 4月 13 22:03 pig_1365861790591.log |
5 |
-rw-rw-r-- 1 zhenqin zhenqin 2896 4月 13 22:21 pig_1365862872616.log |
6 |
-rw-rw-r-- 1 zhenqin zhenqin 443 4月 13 22:21 test1.pig |
7 |
-rw-rw-r-- 1 zhenqin zhenqin 210 4月 12 21:35 test2.pig |
8 |
-rw-rw-r-- 1 zhenqin zhenqin 245 4月 12 22:40 test3.pig |
三:通过hadoop流向hadoop提交map/reduce job。
首先,创建maper和reducer脚本。这里使用的是perl。
cat maper.pl
while ($line = <STDIN>)
{
chomp($line);
($rib,$nquery,@rest) = split (/- /, $line);
my @joined = ($nquery, @rest);
my $results = join("\t", @joined);
print "$results\n";
}
cat reducer.pl
while ($line = <STDIN>)
{
chomp($line);
($nquery,@rest) = split (/ /, $line);
my @joined = ($nquery, @rest);
my $results = join("\t", @joined);
print "$results\n";
}
hadoop jar /usr/local/hadoop-0.20.2/contrib/streaming/hadoop-0.20.2-streaming.jar -file ./maper.pl -mapper "perl maper.pl" -file ./reducer.pl -reducer "perl reducer.pl" -input /user/root/test/* -output /user/root/output
# hadoop fs -cat /user/root/test/test.txt
- aaaaa 123:123
- ddddd 321:321
# hadoop fs -cat /user/root/output/part-00000
aaaaa 123:123
ddddd 321:321
四:给集群添加数据节点
有的时候, datanode或者tasktracker crash,或者需要向集群中增加新的机器时又不能重启集群。下面方法也许对你有用。
1.把新机器的增加到conf/slaves文件中(datanode或者tasktracker crash则可跳过)
2.在新机器上进入hadoop安装目录
$bin/hadoop-daemon.sh start datanode
$bin/hadoop-daemon.sh start tasktracker
3.在namenode上
$bin/hadoop balancer
五:另外几下一些常用命令
解除hdfs安全模式 hadoop dfsadmin -safemode leave
格式化名称节点 hadoop namenode -format(记得要删除dn的/tmp/hadoop-root目录)