有关hadoop分布式配置详解

时间:2023-07-04 13:00:26

linux配置ssh无密码登录

配置ssh无密码登录,先要安装openssh,如下: 
yum install openssh-clients

准备两台linux服务器或虚拟机,设置两台linux的hosts为:

1 [root@hadoop1 ~]# vim /etc/hosts
2 192.168.1.110 hadoop1
3 192.168.1.111 hadoop2

再按照如下步骤:

01 [root@hadoop1 ~]# ssh-keygen -t rsa
02 Generating public/private rsa key pair.
03 Enter file in which to save the key (/root/.ssh/id_rsa):
04 Created directory '/root/.ssh'.
05 Enter passphrase (empty for no passphrase):
06 Enter same passphrase again:
07 Your identification has been saved in /root/.ssh/id_rsa.
08 Your public key has been saved in /root/.ssh/id_rsa.pub.
09 The key fingerprint is:
10 1e:88:fc:25:83:e4:28:f4:f1:95:ea:7e:78:8f:55:35 root@hadoop1
11 The key's randomart image is:
12 +--[ RSA 2048]----+
13 |                 |
14 |        .        |
15 | . ..  o     E   |
16 |. .=ooo.    . .  |
17 |. ..=o+ S  .     |
18 | .  .. = ..      |
19 |     .o ..       |
20 |    .. oo        |
21 |     .o...       |
22 +-----------------+
23 [root@hadoop1 ~]# cd .ssh/
24 [root@hadoop1 .ssh]# cp id_rsa.pub authorized_keys

另外一台服务器都要做同样的操作

完成上面的操作后,再把hadoop1里的authorized_keys内容,拷到hadoop2的authorized_key里,同样也要将hadoop2里的authorized_keys内容,拷到hadoop1的authorized_key里。

如下所示:

1 [root@hadoop1 .ssh]# cat authorized_keys
2 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqUQBAWIx+zD6YJ478RT5FUTvwpFlu5MQhsXlLjrTdXLpSwCoti4vpV1e7EKy6AS8Scujfu1vaMS5hPIwjScjjFb5iCL7/dklf33ariEFFuLcTQ3BvEfaOZOf88hx/Yn9ysiW+rVeHWqBAYvOSSmhP6HYoYF/as5taLw+95BkilxPhI+SgvUjqLHiJi75qyUHpCCFWMopWPB3PGjOgMNO66ulS7/mnWsUpEV07pwuR2I5HfTTqz693xIXZ1b9l3+0AOTEA5Lyr8QU4BCbylgyadLZsCqtDg8L16voJBXmYA4iAdbJ/+BjKGMNUC15XAS995Bt7FHRlfl4AIbDV6liNw== root@hadoop1
3  
4 [root@hadoop1 .ssh]# vim authorized_keys
5 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqUQBAWIx+zD6YJ478RT5FUTvwpFlu5MQhsXlLjrTdXLpSwCoti4vpV1e7EKy6AS8Scujfu1vaMS5hPIwjScjjFb5iCL7/dklf33ariEFFuLcTQ3BvEfaOZOf88hx/Yn9ysiW+rVeHWqBAYvOSSmhP6HYoYF/as5taLw+95BkilxPhI+SgvUjqLHiJi75qyUHpCCFWMopWPB3PGjOgMNO66ulS7/mnWsUpEV07pwuR2I5HfTTqz693xIXZ1b9l3+0AOTEA5Lyr8QU4BCbylgyadLZsCqtDg8L16voJBXmYA4iAdbJ/+BjKGMNUC15XAS995Bt7FHRlfl4AIbDV6liNw== root@hadoop1
6  
7 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwpYhesi/DlMk2SzIESyGw8LGbV2eB7vD08KxZnKIPScnoc1gGSmLe47CJ7mPxqq4RuGvfZ4bRSRzVdeiybq6EMlOGt5uCb8GT3XMrAzQWuM2kJE3cL7g/BVVyyvQ34Vk9SoWDS0rwMlXYjrT+eUh+Zn+yhhPM+OkLL8/ogmJ0oeN9LIKlYmnxyCrWa4LD9BPc2rvsLEtTSzG3uRvIWOxBrvJmFRIQfE+fNOeruMNm9PYDtix6fdLolS1PLIUzyoxLzh5LWn5CUKUU6J2KH77QswY+4BPHL5p7cwFE3um8WwCKrgeMtao+Grw6FPJ96owmecaU6715RAy0PHyeor3dw== root@hadoop2

这样的就可无密码登录了,如下所示:

1 [root@hadoop1 ~]# scp /work/hadoop/hadoop-0.22.0.tar.gz root@hadoop2:/root
2 hadoop-0.22.0.tar.gz                          100%   69MB  23.0MB/s   00:03   
3

[root@hadoop1 ~]#

Hadoop操作HDFS命令

Hadoop操作HDFS命令如下所示:

hadoop fs 
查看Hadoop HDFS支持的所有命令

hadoop fs –ls 
列出目录及文件信息

hadoop fs –lsr 
循环列出目录、子目录及文件信息

hadoop fs –put test.txt /user/sunlightcs 
将本地文件系统的test.txt复制到HDFS文件系统的/user/sunlightcs目录下

hadoop fs –get /user/sunlightcs/test.txt . 
将HDFS中的test.txt复制到本地文件系统中,与-put命令相反

hadoop fs –cat /user/sunlightcs/test.txt 
查看HDFS文件系统里test.txt的内容

hadoop fs –tail /user/sunlightcs/test.txt 
查看最后1KB的内容

hadoop fs –rm /user/sunlightcs/test.txt 
从HDFS文件系统删除test.txt文件,rm命令也可以删除空目录

hadoop fs –rmr /user/sunlightcs  
删除/user/sunlightcs目录以及所有子目录

hadoop fs –copyFromLocal test.txt /user/sunlightcs/test.txt 
从本地文件系统复制文件到HDFS文件系统,等同于put命令

hadoop fs –copyToLocal /user/sunlightcs/test.txt test.txt 
从HDFS文件系统复制文件到本地文件系统,等同于get命令

hadoop fs –chgrp [-R] /user/sunlightcs 
修改HDFS系统中/user/sunlightcs目录所属群组,选项-R递归执行,跟linux命令一样

hadoop fs –chown [-R] /user/sunlightcs 
修改HDFS系统中/user/sunlightcs目录拥有者,选项-R递归执行

hadoop fs –chmod [-R] MODE /user/sunlightcs 
修改HDFS系统中/user/sunlightcs目录权限,MODE可以为相应权限的3位数或+/-{rwx},选项-R递归执行

hadoop fs –count [-q] PATH 
查看PATH目录下,子目录数、文件数、文件大小、文件名/目录名

hadoop fs –cp SRC [SRC …] DST       
将文件从SRC复制到DST,如果指定了多个SRC,则DST必须为一个目录

hadoop fs –du PATH 
显示该目录中每个文件或目录的大小

hadoop fs –dus PATH 
类似于du,PATH为目录时,会显示该目录的总大小

hadoop fs –expunge  
清空回收站,文件被删除时,它首先会移到临时目录.Trash/中,当超过延迟时间之后,文件才会被永久删除

hadoop fs –getmerge SRC [SRC …] LOCALDST [addnl]      
获取由SRC指定的所有文件,将它们合并为单个文件,并写入本地文件系统中的LOCALDST,选项addnl将在每个文件的末尾处加上一个换行符

hadoop fs –touchz PATH   
创建长度为0的空文件

hadoop fs –test –[ezd] PATH     
对PATH进行如下类型的检查: 
-e PATH是否存在,如果PATH存在,返回0,否则返回1 
-z 文件是否为空,如果长度为0,返回0,否则返回1 
-d 是否为目录,如果PATH为目录,返回0,否则返回1

hadoop fs –text PATH 
显示文件的内容,当文件为文本文件时,等同于cat,文件为压缩格式(gzip以及hadoop的二进制序列文件格式)时,会先解压缩

hadoop fs –help ls 
查看某个[ls]命令的帮助文档

Hadoop配置项整理(core-site.xml)

记录一下Hadoop的配置和说明,用到新的配置项会补充进来,不定期更新。以配置文件名划分

以hadoop 1.x配置为例

core-site.xml

 name value  Description 
 fs.default.name hdfs://hadoopmaster:9000 定义HadoopMaster的URI和端口
 fs.checkpoint.dir /opt/data/hadoop1/hdfs/namesecondary1 定义hadoop的name备份的路径,官方文档说是读取这个,写入dfs.name.dir
 fs.checkpoint.period 1800 定义name备份的备份间隔时间,秒为单位,只对snn生效,默认一小时
 fs.checkpoint.size 33554432 以日志大小间隔做备份间隔,只对snn生效,默认64M
 io.compression.codecs org.apache.hadoop.io.compress.DefaultCodec
com.hadoop.compression.lzo.LzoCodec
com.hadoop.compression.lzo.LzopCodec
org.apache.hadoop.io.compress.GzipCodec
org.apache.hadoop.io.compress.BZip2Codec
(排版调整,实际配置不要回车)
Hadoop所使用的编解码器,gzip和bzip2为自带,lzo需安装hadoopgpl或者kevinweil,逗号分隔,snappy也需要单独安装
 io.compression.codec.lzo.class com.hadoop.compression.lzo.LzoCodec LZO所使用的压缩编码器 
 topology.script.file.name /hadoop/bin/RackAware.py 机架感知脚本位置 
 topology.script.number.args 1000 机架感知脚本管理的主机数,IP地址 
 fs.trash.interval 10800 HDFS垃圾箱设置,可以恢复误删除,分钟数,0为禁用,添加该项无需重启hadoop
 hadoop.http.filter.initializers org.apache.hadoop.security.
AuthenticationFilterInitializer
(排版调整,实际配置不要回车)
需要jobtracker,tasktracker
namenode,datanode等http访问端口用户验证使用,需配置所有节点
 hadoop.http.authentication.type simple | kerberos |  验证方式,默认为简单,也可自己定义class,需配置所有节点
 hadoop.http.authentication.
token.validity
(排版调整,实际配置不要回车)
36000 验证令牌的有效时间,需配置所有节点
 hadoop.http.authentication.
signature.secret
(排版调整,实际配置不要回车)
默认可不写参数 默认不写在hadoop启动时自动生成私密签名,需配置所有节点
hadoop.http.authentication.cookie
.domain
domian.tld http验证所使用的cookie的域名,IP地址访问则该项无效,必须给所有节点都配置域名才可以。
 hadoop.http.authentication.
 simple.anonymous.allowed
(排版调整,实际配置不要回车)
true | false 简单验证专用,默认允许匿名访问,true
 hadoop.http.authentication.
kerberos.principal
(排版调整,实际配置不要回车)
HTTP/localhost@$LOCALHOST Kerberos验证专用,参加认证的实体机必须使用HTTP作为K的Name
 hadoop.http.authentication.
kerberos.keytab
(排版调整,实际配置不要回车)
/home/xianglei/hadoop.keytab Kerberos验证专用,密钥文件存放位置
 hadoop.security.authorization true|false Hadoop服务层级验证安全验证,需配合hadoop-policy.xml使用,配置好以后用dfsadmin,mradmin -refreshServiceAcl刷新生效
 io.file.buffer.size 131072 用作序列化文件处理时读写buffer的大小
 hadoop.security.authentication simple | kerberos hadoop本身的权限验证,非http访问,simple或者kerberos
 hadoop.logfile.size 1000000000 设置日志文件大小,超过则滚动新日志
 hadoop.logfile.count 20 最大日志数
 io.bytes.per.checksum 1024 每校验码所校验的字节数,不要大于io.file.buffer.size
 io.skip.checksum.errors true | false 处理序列化文件时跳过校验码错误,不抛异常。默认false
 io.serializations org.apache.hadoop.io.
serializer.WritableSerialization (排版需要。实际配置不要回车)
序列化的编解码器
 io.seqfile.compress.blocksize 1024000 块压缩的序列化文件的最小块大小,字节
 webinterface.private.actions true | false 设为true,则JT和NN的tracker网页会出现杀任务删文件等操作连接,默认是false

结合Apache手册和公司里用的实际配置编写,实际根据硬件配置的不同,参数大小需做调整,目前参数基于namenode 96G内存,datanode 32G内存。有些har,s3,local这样的fs的implement因为不太会用到,所以没写。

Hadoop配置项整理(mapred-site.xml)

记录一下Hadoop的配置和说明,用到新的配置项会补充进来,不定期更新。以配置文件名划分

以hadoop 1.x配置为例

mapred-site.xml

name  value  Description
hadoop.job.history.location   job历史文件保存路径,无可配置参数,也不用写在配置文件里,默认在logs的history文件夹下。
hadoop.job.history.user.location   用户历史文件存放位置
io.sort.factor 30 这里处理流合并时的文件排序数,我理解为排序时打开的文件数
io.sort.mb 600 排序所使用的内存数量,单位兆,默认1,我记得是不能超过HADOOP_HEAPSIZE设置,否则会OOM
mapred.job.tracker hadoopmaster:9001 连接jobtrack服务器的配置项,默认不写是local,map数1,reduce数1
mapred.job.tracker.http.address 0.0.0.0:50030 jobtracker的tracker页面服务监听地址
mapred.job.tracker.handler.count 15 jobtracker服务的线程数
mapred.task.tracker.report.address 127.0.0.1:0 tasktracker监听的服务器,无需配置,且官方不建议自行修改
mapred.local.dir /data1/hdfs/mapred/local,
/data2/hdfs/mapred/local,
...
mapred做本地计算所使用的文件夹,可以配置多块硬盘,逗号分隔
mapred.system.dir /data1/hdfs/mapred/system,
/data2/hdfs/mapred/system,
...
mapred存放控制文件所使用的文件夹,可配置多块硬盘,逗号分隔。
mapred.temp.dir /data1/hdfs/mapred/temp,
/data2/hdfs/mapred/temp,
...
mapred共享的临时文件夹路径,解释同上。
mapred.local.dir.minspacestart 1073741824 本地运算文件夹剩余空间低于该值则不在本地做计算。字节配置,默认0
mapred.local.dir.minspacekill 1073741824 本地计算文件夹剩余空间低于该值则不再申请新的任务,字节数,默认0
mapred.tasktracker.expiry.interval 60000 TT在这个时间内没有发送心跳,则认为TT已经挂了。单位毫秒
mapred.map.tasks 2 默认每个job所使用的map数,意思是假设设置dfs块大小为64M,需要排序一个60M的文件,也会开启2个map线程,当jobtracker设置为本地是不起作用。
mapred.reduce.tasks 1 解释同上
mapred.jobtracker.restart.recover true | false 重启时开启任务恢复,默认false 
mapred.jobtracker.taskScheduler org.apache.hadoop.mapred.
CapacityTaskScheduler

org.apache.hadoop.mapred.
JobQueueTaskScheduler

org.apache.hadoop.mapred.
FairScheduler
 

重要的东西,开启任务管理器,不设置的话,hadoop默认是FIFO调度器,其他可以使用公平和计算能力调度器
mapred.reduce.parallel.copies 10 reduce在shuffle阶段使用的并行复制数,默认5
mapred.child.java.opts -Xmx2048m 
-Djava.library.path=
/opt/hadoopgpl/native/
Linux-amd64-64
每个TT子进程所使用的虚拟机内存大小
tasktracker.http.threads 50 TT用来跟踪task任务的http server的线程数
mapred.task.tracker.http.address 0.0.0.0:50060 TT默认监听的httpIP和端口,默认可以不写。端口写0则随机使用。
mapred.output.compress true | false 任务结果采用压缩输出,默认false,建议false
mapred.output.compression.codec org.apache.hadoop.io.
compress.DefaultCodec
输出结果所使用的编解码器,也可以用gz或者bzip2或者lzo或者snappy等
mapred.compress.map.output true | false map输出结果在进行网络交换前是否以压缩格式输出,默认false,建议true,可以减小带宽占用,代价是会慢一些。
mapred.map.output.compression.codec com.hadoop.compression.
lzo.LzoCodec
map阶段压缩输出所使用的编解码器
map.sort.class org.apache.hadoop.util.
QuickSort
map输出排序所使用的算法,默认快排。
mapred.hosts conf/mhost.allow 允许连接JT的TT服务器列表,空值全部允许
mapred.hosts.exclude conf/mhost.deny 禁止连接JT的TT列表,节点摘除是很有作用。
mapred.queue.names ETL,rush,default 配合调度器使用的队列名列表,逗号分隔
mapred.tasktracker.map.
tasks.maximum
12 每服务器允许启动的最大map槽位数。
mapred.tasktracker.reduce.
tasks.maximum
6 每服务器允许启动的最大reduce槽位数

捡一些比较重要的,用的多的配置,官网建议的专家配置项基本没写上,改坏了就不好玩了。

Hadoop配置项整理(hdfs-site.xml)

记录一下Hadoop的配置和说明,用到新的配置项会补充进来,不定期更新。以配置文件名划分

以hadoop 1.x配置为例

hdfs-site.xml

 name  value Description 
dfs.default.chunk.view.size 32768 namenode的http访问页面中针对每个文件的内容显示大小,通常无需设置。
dfs.datanode.du.reserved 1073741824 每块磁盘所保留的空间大小,需要设置一些,主要是给非hdfs文件使用,默认是不保留,0字节
dfs.name.dir /opt/data1/hdfs/name,
/opt/data2/hdfs/name,
/nfs/data/hdfs/name
NN所使用的元数据保存,一般建议在nfs上保留一份,作为1.0的HA方案使用,也可以在一台服务器的多块硬盘上使用
dfs.web.ugi nobody,nobody NN,JT等所使用的web tracker页面服务器所使用的用户和组
dfs.permissions true | false dfs权限是否打开,我一般设置false,通过开发工具培训别人界面操作避免误操作,设置为true有时候会遇到数据因为权限访问不了。
dfs.permissions.supergroup supergroup 设置hdfs超级权限的组,默认是supergroup,启动hadoop所使用的用户通常是superuser。
dfs.data.dir /opt/data1/hdfs/data,
/opt/data2/hdfs/data,
/opt/data3/hdfs/data,
...
真正的datanode数据保存路径,可以写多块硬盘,逗号分隔
dfs.datanode.data.dir.perm 755 datanode所使用的本地文件夹的路径权限,默认755
dfs.replication 3 hdfs数据块的复制份数,默认3,理论上份数越多跑数速度越快,但是需要的存储空间也更多。有钱人可以调5或者6
dfs.replication.max 512 有时dn临时故障恢复后会导致数据超过默认备份数。复制份数的最多数,通常没什么用,不用写配置文件里。
dfs.replication.min 1 最小份数,作用同上。
dfs.block.size 134217728 每个文件块的大小,我们用128M,默认是64M。这个计算需要128*1024^2,我碰上过有人直接写128000000,十分浪漫。
dfs.df.interval 60000 磁盘用量统计自动刷新时间,单位是毫秒。
dfs.client.block.write.retries 3 数据块写入的最多重试次数,在此次数之前不会捕获失败。
dfs.heartbeat.interval 3 DN的心跳检测时间间隔。秒
dfs.namenode.handler.count 10 NN启动后展开的线程数。
dfs.balance.bandwidthPerSec 1048576 做balance时所使用的每秒最大带宽,使用字节作为单位,而不是bit
dfs.hosts /opt/hadoop/conf/hosts.allow 一个主机名列表文件,这里的主机是允许连接NN的,必须写绝对路径,文件内容为空则认为全都可以。
dfs.hosts.exclude /opt/hadoop/conf/hosts.deny 基本原理同上,只不过这里放的是禁止访问NN的主机名称列表。这在从集群中摘除DN会比较有用。
dfs.max.objects 0 dfs最大并发对象数,HDFS中的文件,目录块都会被认为是一个对象。0表示不限制
dfs.replication.interval 3 NN计算复制块的内部间隔时间,通常不需写入配置文件。默认就好
dfs.support.append true | false 新的hadoop支持了文件的APPEND操作,这个就是控制是否允许文件APPEND的,但是默认是false,理由是追加还有bug。
dfs.datanode.failed.volumes.tolerated 0 能够导致DN挂掉的坏硬盘最大数,默认0就是只要有1个硬盘坏了,DN就会shutdown。
dfs.secondary.http.address 0.0.0.0:50090 SNN的tracker页面监听地址和端口
dfs.datanode.address 0.0.0.0:50010 DN的服务监听端口,端口为0的话会随机监听端口,通过心跳通知NN
dfs.datanode.http.address 0.0.0.0:50075 DN的tracker页面监听地址和端口
dfs.datanode.ipc.address 0.0.0.0:50020 DN的IPC监听端口,写0的话监听在随机端口通过心跳传输给NN
dfs.datanode.handler.count 3 DN启动的服务线程数
dfs.http.address 0.0.0.0:50070 NN的tracker页面监听地址和端口
dfs.https.enable true | false NN的tracker是否监听在HTTPS协议,默认false
dfs.datanode.https.address 0.0.0.0:50475 DN的HTTPS的tracker页面监听地址和端口
dfs.https.address 0.0.0.0:50470 NN的HTTPS的tracker页面监听地址和端口

  主要配置里会用到的大概就是这些了,还有一些https certfile和一些internal时间配置的,不常用的就不写了。

hadoop安装及配置

hadoop安装及配置,首先要准备3台以上的linux服务器或虚拟机,假设3台服务器的IP地址如下: 
192.168.1.110 
192.168.1.111 
192.168.1.112

设置3台服务器的hostname分别为:hadoop1、hadoop2、hadoop3,并设置hosts为:

1 [root@hadoop1 ~]# vim /etc/hosts
2 192.168.1.110 hadoop1
3 192.168.1.111 hadoop2
4 192.168.1.112 hadoop2

配置ssh无密码登录,参考: http://www.juziku.com/sunlightcs/wiki/5252.htm

下载hadoop-0.20.2.tar.gz,解压后的目录结构如下:

这个是 hadoop-0.20.2.tar.gz的版本,本人装的是hadoop1.0.3的版本,这里就拿hadoop-0.20.2.tar.gz版本进行介绍了:

01 [root@hadoop1 hadoop-0.20.2]# pwd
02 /work/hadoop/hadoop-0.20.2
03 [root@hadoop1 hadoop-0.20.2]# ll
04 总用量 4876
05 drwxr-xr-x.  2 root root    4096 12月 27 21:44 bin
06 -rw-rw-r--.  1 root root   74035 2月  19 2010 build.xml
07 drwxr-xr-x.  4 root root    4096 2月  19 2010 c++
08 -rw-rw-r--.  1 root root  348624 2月  19 2010 CHANGES.txt
09 drwxr-xr-x.  2 root root    4096 12月 27 21:51 conf
10 drwxr-xr-x. 13 root root    4096 2月  19 2010 contrib
11 drwxr-xr-x.  7 root root    4096 12月 27 21:44 docs
12 -rw-rw-r--.  1 root root    6839 2月  19 2010 hadoop-0.20.2-ant.jar
13 -rw-rw-r--.  1 root root 2689741 2月  19 2010 hadoop-0.20.2-core.jar
14 -rw-rw-r--.  1 root root  142466 2月  19 2010 hadoop-0.20.2-examples.jar
15 -rw-rw-r--.  1 root root 1563859 2月  19 2010 hadoop-0.20.2-test.jar
16 -rw-rw-r--.  1 root root   69940 2月  19 2010 hadoop-0.20.2-tools.jar
17 drwxr-xr-x.  2 root root    4096 12月 27 21:44 ivy
18 -rw-rw-r--.  1 root root    8852 2月  19 2010 ivy.xml
19 drwxr-xr-x.  5 root root    4096 12月 27 21:44 lib
20 drwxr-xr-x.  2 root root    4096 12月 27 21:44 librecordio
21 -rw-rw-r--.  1 root root   13366 2月  19 2010 LICENSE.txt
22 drwxr-xr-x.  3 root root    4096 12月 27 22:10 logs
23 -rw-rw-r--.  1 root root     101 2月  19 2010 NOTICE.txt
24 -rw-rw-r--.  1 root root    1366 2月  19 2010 README.txt
25 drwxr-xr-x. 15 root root    4096 12月 27 21:44 src
26 drwxr-xr-x.  8 root root    4096 2月  19 2010 webapps

修改vim /work/hadoop/hadoop-0.20.2/conf/hadoop-env.sh  
把JAVA_HOME前面的#去掉,并设置JDK路径,如下:(若没JDK,则需要先安装JDK) 
export JAVA_HOME=/root/tool/jdk1.6.0_31

修改core-site.xml  mapred-site.xml  hdfs-site.xml  masters slaves文件,如下所示:

01 [root@hadoop1 conf]# pwd
02 /work/hadoop/hadoop-0.20.2/conf
03 [root@hadoop1 conf]# vim hdfs-site.xml
04 <?xml version="1.0"?>
05 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
06 <configuration>
07 <property>
08 <name>dfs.replication</name>
09 <value>2</value>
10 </property>
11 </configuration>
12   
13 [root@hadoop1 conf]# vim mapred-site.xml
14 <?xml version="1.0"?>
15 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
16 <configuration>
17 <property>
18 <name>mapred.job.tracker</name>
19 <value>hadoop1:9001</value>
20 </property>
21 </configuration>
22   
23 [root@hadoop1 conf]# vim core-site.xml
24 <?xml version="1.0"?>
25 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
26 <configuration>
27 <property>
28 <name>fs.default.name</name>
29 <value>hdfs://hadoop1:9000</value>
30 </property>
31 </configuration>
32   
33 [root@hadoop1 conf]# vim masters
34 hadoop1
35   
36 [root@hadoop1 conf]# vim slaves
37 hadoop2
38 hadoop3

再把hadoop1上配置的hadoop复制到hadoop2、hadoop3机器上

1 [root@hadoop1 conf]# scp -r /work/hadoop/hadoop-0.20.2 root@hadoop2:/work/hadoop
2 [root@hadoop1 conf]# scp -r /work/hadoop/hadoop-0.20.2 root@hadoop3:/work/hadoop

格式化hadoop1上的namenode,不用格式化hadoop2及hadoop3

01 [root@hadoop1 hadoop-0.20.2]# bin/hadoop namenode -format
02 12/12/27 22:10:13 INFO namenode.NameNode: STARTUP_MSG:
03 /************************************************************
04 STARTUP_MSG: Starting NameNode
05 STARTUP_MSG:   host = hadoop1/192.168.1.110
06 STARTUP_MSG:   args = [-format]
07 STARTUP_MSG:   version = 0.20.2
08 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
09 ************************************************************/
10 12/12/27 22:10:13 INFO namenode.FSNamesystem: fsOwner=root,root
11 12/12/27 22:10:13 INFO namenode.FSNamesystem: supergroup=supergroup
12 12/12/27 22:10:13 INFO namenode.FSNamesystem: isPermissionEnabled=true
13 12/12/27 22:10:13 INFO common.Storage: Image file of size 94 saved in 0 seconds.
14 12/12/27 22:10:13 INFO common.Storage: Storage directory /tmp/hadoop-root/dfs/name has been successfully formatted.
15 12/12/27 22:10:13 INFO namenode.NameNode: SHUTDOWN_MSG:
16 /************************************************************
17 SHUTDOWN_MSG: Shutting down NameNode at hadoop1/192.168.1.110
18 ************************************************************/

再启动hadoop服务,只需启动hadoop1即可,会自动启动hadoop2及hadoop3,如下所示:

01 [root@hadoop1 hadoop-0.20.2]# bin/start-all.sh
02 namenode running as process 1290. Stop it first.
03  
04 hadoop3: starting datanode, logging to /work/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-datanode-hadoop3.out
05 hadoop2: starting datanode, logging to /work/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-datanode-hadoop2.out
06 hadoop1: secondarynamenode running as process 1425. Stop it first.
07 jobtracker running as process 1489. Stop it first.
08 hadoop2: starting tasktracker, logging to /work/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-tasktracker-hadoop2.out
09 hadoop3: starting tasktracker, logging to /work/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-tasktracker-hadoop3.out
10 [root@hadoop1 hadoop-0.20.2]# jps
11 1290 NameNode
12 1776 Jps
13 1425 SecondaryNameNode
14 1489 JobTracker

完成以上步骤,就完成hadoop-0.20.2的安装,hadoop1.x的安装步骤也是一样的。

注:测试环境下,可先关闭防火墙,不然会出问题。 
service iptables stop

通过Hadoop API操作Hadoop的HDFS文件系统,这里使用的是hadoop1.0.4,具体步骤如下:

通过API操作Hadoop例子

在eclipse中新建Java项目,把hadoop里jar包导入工程里,并把core-site.xml文件拷到resources目录里:

core-site.xml文件内容如下所示:

01 <?xml version="1.0"?>
02 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
03  
04 <configuration>
05     <property>
06         <name>fs.default.name</name>
07         <!-- 填写hadoop的IP地址   也可以在hosts中指定,如下所示 -->
08         <value>hdfs://hadoop1:9000</value>
09     </property>
10 </configuration>

操作HDFS文件系统代码如下所示:

01 package com.juziku;
02  
03 import java.io.IOException;
04  
05 import org.apache.hadoop.conf.Configuration;
06 import org.apache.hadoop.fs.FSDataOutputStream;
07 import org.apache.hadoop.fs.FileSystem;
08 import org.apache.hadoop.fs.Path;
09  
10 /**
11  * Hadoop1.x  测试HDFS API简单使用
12  *
13  * @author sunlightcs
14  * @date   2013-1-25 下午3:55:05
15  * http://www.juziku.com/sunlightcs/
16  */
17 public class CreatFile {
18     private static Configuration conf = new Configuration();
19      
20     /**
21      * 创建空文件
22      * @param path   文件路径
23      */
24     public static void createFile(String path) throws IOException{
25         FileSystem fs = FileSystem.get(conf);
26         fs.createNewFile(new Path(path));
27          
28         fs.close();
29     }
30      
31     /**
32      * 创建文件     有内容
33      * @param path  文件路径
34      */
35     public static void createFile(String path, String content)throws IOException{
36         FileSystem fs = FileSystem.get(conf);
37         FSDataOutputStream output = fs.create(new Path(path));
38         output.writeUTF(content);
39         output.close();
40         fs.close();
41     }
42      
43     /**
44      * 创建目录
45      * @param dir  目录路径
46      */
47     public static void createDir(String dir) throws IOException{
48         FileSystem fs = FileSystem.get(conf);
49         fs.mkdirs(new Path(dir));
50         fs.close();
51     }
52      
53      
54     public static void main(String[] args) throws IOException {
55         createFile("/com/juziku/test1.txt");
56         createFile("/com/juziku/test2.txt""测试数据。。。");
57         createDir("/com/juziku/test/test");
58     }
59 }

注:设置hadoop文件系统权限,不然会报错

1 [root@hadoop1 bin]# ./hadoop fs -chmod -R 777 /

执行上面代码后,查看hadoop文件系统目录:

1 [root@hadoop1 bin]# ./hadoop fs -lsr /com/juziku/
2 drwxrwxrwx   - Administrator supergroup          0 2013-01-25 15:53 /com/juziku/test
3 drwxr-xr-x   - Administrator supergroup          0 2013-01-25 15:53 /com/juziku/test/test
4 -rw-r--r--   3 Administrator supergroup          0 2013-01-25 15:45 /com/juziku/test1.txt
5 -rw-r--r--   3 Administrator supergroup         23 2013-01-25 15:52 /com/juziku/test2.txt
6 [root@hadoop1 bin]# ./hadoop fs -cat /com/juziku/test2.txt
7 测试数据。。。

Hadoop校验和的检验

客户端上传数据或DataNode从其他DataNode上接收数据时,都会检查校验和,把真实数据的校验和同datanode上的校验和进行比较。

每创建一个文件filename.txt时,就会在同目录下创建.filename.txt.crc检验和文件,默认情况下,每512个字节就会生成一个32位的校验和,可以在core-site.xml文件中修改默认值:

1 <property>
2     <name>io.bytes.per.checksum</name>
3     <value>512</value>
4 </property>

也可以禁止Hadoop校验和检验:

1 <property>
2         <name>fs.file.impl</name>
3     <value>org.apache.hadoop.fs.RawLocalFileSystem</value>
4 </property>

或者如下:

1 FileSystem fs = new RawLocalFileSystem();
2 fs.initialize(null, conf);

Hive安装及配置

Hive安装及配置,准备工作:

1).安装JDK1.6

2).安装Hadoop-1.0.4

3).安装MySQL5.x

上面都安装好后,接下来就可以安装Hive了,目前最新版本为hive0.10.0,从hive0.8.0开始,就支持hadoop1.x了,这里安装的是hive0.8.1,具体步骤如下:

1.下载hive-0.8.1.tar.gz

下载地址:wget http://mirrors.cnnic.cn/apache/hive/hive-0.8.1/hive-0.8.1.tar.gz

2.解压到/work/hive目录下,如下所示:

01 [root@hadoop1 hive]# tar zxf hive-0.8.1.tar.gz
02 [root@hadoop1 hive]# cd hive-0.8.1
03 [root@hadoop1 hive-0.8.1]# ll
04 总用量 132
05 drwxr-xr-x.  3 root root  4096 1月  26 2012 bin
06 drwxr-xr-x.  2 root root  4096 2月  17 15:13 conf
07 drwxr-xr-x.  6 root root  4096 2月  17 14:41 docs
08 drwxr-xr-x.  5 root root  4096 1月  26 2012 examples
09 drwxr-xr-x.  4 root root  4096 2月  17 14:41 lib
10 -rw-rw-r--.  1 root root 23208 1月  26 2012 LICENSE
11 -rw-rw-r--.  1 root root   897 1月  26 2012 NOTICE
12 -rw-rw-r--.  1 root root  4439 1月  26 2012 README.txt
13 -rw-rw-r--.  1 root root 66301 1月  26 2012 RELEASE_NOTES.txt
14 drwxr-xr-x.  4 root root  4096 1月  26 2012 scripts
15 drwxr-xr-x. 27 root root  4096 2月  17 14:41 src
16 [root@hadoop1 hive-0.8.1]# pwd
17 /work/hive/hive-0.8.1

3.配置Hive的环境变量,在/etc/profile文件末尾添加如下内容:
export HIVE_HOME=/work/hive/hive-0.8.1
export PATH=$HIVE_HOME/bin:$PATH

再执行source /etc/profile

4.拷贝hive的配置模板文件,如下所示:

01 [root@hadoop1 hive-0.8.1]# cd conf/
02 [root@hadoop1 conf]# cp hive-env.sh.template hive-env.sh
03 [root@hadoop1 conf]# cp hive-default.xml.template hive-site.xml
04 [root@hadoop1 conf]# ll
05 总用量 112
06 -rw-rw-r--. 1 root root 46817 1月  26 2012 hive-default.xml.template
07 -rw-r--r--. 1 root root  1621 2月  17 15:01 hive-env.sh
08 -rw-rw-r--. 1 root root  1593 1月  26 2012 hive-env.sh.template
09 -rw-rw-r--. 1 root root  1637 1月  26 2012 hive-exec-log4j.properties.template
10 -rw-rw-r--. 1 root root  2043 1月  26 2012 hive-log4j.properties.template
11 -rw-r--r--. 1 root root 46790 2月  17 15:31 hive-site.xml

5.修改hive-env.sh文件,指定HADOOP_HOME及HIVE_CONF_DIR的路径如下: 
HADOOP_HOME=/work/hadoop/hadoop-1.0.4 
export HIVE_CONF_DIR=/work/hive/hive-0.8.1/conf

6.修改hive-site.xml文件,指定MySQL数据库驱动、数据库名、用户名及密码,修改的内容如下所示:

01 <property>
02   <name>javax.jdo.option.ConnectionURL</name>
03   <value>jdbc:mysql://localhost:3306/hive</value>
04   <description>JDBC connect string for a JDBC metastore</description>
05 </property>
06 <property>
07   <name>javax.jdo.option.ConnectionDriverName</name>
08   <value>com.mysql.jdbc.Driver</value>
09   <description>Driver class name for a JDBC metastore</description>
10 </property>
11 <property>
12   <name>javax.jdo.option.ConnectionUserName</name>
13   <value>root</value>
14   <description>username to use against metastore database</description>
15 </property>
16 <property>
17   <name>javax.jdo.option.ConnectionPassword</name>
18   <value>123456</value>
19   <description>password to use against metastore database</description>
20 </property>

7.拷贝MySQL驱动mysql-connector-java-5.1.18.jar到hive-0.8.1/lib目录中,可从附件里下载

8.在HDFS中创建/tmp和/user/hive/warehouse并设置权限

1 [root@hadoop1 bin]# pwd
2 /work/hadoop/hadoop-1.0.4/bin
3 [root@hadoop1 bin]# ./hadoop fs -mkdir /tmp
4 [root@hadoop1 bin]# ./hadoop fs -mkdir /user/hive/warehouse
5 [root@hadoop1 bin]# ./hadoop fs -chmod g+w /tmp
6 [root@hadoop1 bin]# ./hadoop fs -chmod g+w /user/hive/warehouse

9.测试Hive是否安装成功,如下所示:

01 [root@hadoop1 bin]# hive
02 WARNING: org.apache.hadoop.metrics.jvm.EventCounter is deprecated. Please use org.apache.hadoop.log.metrics.EventCounter in all the log4j.properties files.
03 Logging initialized using configuration in jar:file:/work/hive/hive-0.8.1/lib/hive-common-0.8.1.jar!/hive-log4j.properties
04 Hive history file=/tmp/root/hive_job_log_root_201302171656_1326720941.txt
05 hive> create table user(id int,name string);
06 OK
07 Time taken: 3.242 seconds
08 hive> select * from user;
09 OK
10 Time taken: 0.275 seconds
11 hive> exit;
12 [root@hadoop1 bin]#

看到上面结果后,证明Hive可以正常工作了

这里我们可以用一个跟强大一点的分布式数据库,hbase来进行检验

Hadoop里MapReduce实现单词数统计

Hadoop操作MapReduce实现单词统计,代码如下:

01 package com.juziku;
02  
03 import java.io.IOException;
04  
05 import org.apache.hadoop.io.IntWritable;
06 import org.apache.hadoop.io.LongWritable;
07 import org.apache.hadoop.io.Text;
08 import org.apache.hadoop.mapred.MapReduceBase;
09 import org.apache.hadoop.mapred.Mapper;
10 import org.apache.hadoop.mapred.OutputCollector;
11 import org.apache.hadoop.mapred.Reporter;
12  
13 /**
14  * Hadoop Mapper写法
15  *
16  * @author sunlightcs
17  * @date   2013-1-29 下午3:21:30
18  * http://www.juziku.com/sunlightcs/
19  */
20 public class WordCountMapper extends MapReduceBase implements
21         Mapper<LongWritable, Text, Text, IntWritable> {
22      
23     Text key = new Text();
24     IntWritable value = new IntWritable(1);
25     @Override
26     public void map(LongWritable arg0, Text arg1,
27             OutputCollector<Text, IntWritable> arg2, Reporter arg3)
28             throws IOException {
29          
30         String lines[] = arg1.toString().split("\\W+");
31         for(String line : lines){
32             key.set(line);
33             arg2.collect(key, value);
34         }
35     }
36  
37 }
01 package com.juziku;
02  
03 import java.io.IOException;
04 import java.util.Iterator;
05  
06 import org.apache.hadoop.io.IntWritable;
07 import org.apache.hadoop.io.Text;
08 import org.apache.hadoop.mapred.MapReduceBase;
09 import org.apache.hadoop.mapred.OutputCollector;
10 import org.apache.hadoop.mapred.Reducer;
11 import org.apache.hadoop.mapred.Reporter;
12  
13 /**
14  * Hadoop Reduce写法
15  *
16  * @author sunlightcs
17  * @date   2013-1-29 下午3:35:51
18  * http://www.juziku.com/sunlightcs/
19  */
20 public class WordCountReduce extends MapReduceBase implements
21         Reducer<Text, IntWritable, Text, IntWritable> {
22     IntWritable value = new IntWritable();
23     @Override
24     public void reduce(Text arg0, Iterator<IntWritable> arg1,
25             OutputCollector<Text, IntWritable> arg2, Reporter arg3)
26             throws IOException {
27         int sum = 0;
28         while(arg1.hasNext()){
29             sum += arg1.next().get();
30         }
31         value.set(sum);
32         arg2.collect(arg0, value);
33     }
34  
35 }
01 package com.juziku;
02  
03 import org.apache.hadoop.conf.Configured;
04 import org.apache.hadoop.fs.Path;
05 import org.apache.hadoop.io.IntWritable;
06 import org.apache.hadoop.io.Text;
07 import org.apache.hadoop.mapred.FileInputFormat;
08 import org.apache.hadoop.mapred.FileOutputFormat;
09 import org.apache.hadoop.mapred.JobClient;
10 import org.apache.hadoop.mapred.JobConf;
11 import org.apache.hadoop.util.Tool;
12 import org.apache.hadoop.util.ToolRunner;
13  
14  
15 /**
16  * 计算多个文件里,单词出现的次数
17  *
18  * @author sunlightcs
19  * @date   2013-1-29 下午3:40:34
20  * http://www.juziku.com/sunlightcs/
21  */
22 public class MapReduceTest extends Configured implements Tool{
23  
24     @Override
25     public int run(String[] arg0) throws Exception {
26         JobConf conf = new JobConf(getConf(), MapReduceTest.class);
27         //设置hadoop job的名字
28         conf.setJobName("WordCount");
29          
30         //设置输出KEY的类型为Text
31         conf.setOutputKeyClass(Text.class);
32         //设置输出Value的类型为IntWritable
33         conf.setOutputValueClass(IntWritable.class);
34          
35         //设置Mapper对应的类
36         conf.setMapperClass(WordCountMapper.class);
37         //设置Reduce对应的类
38         conf.setReducerClass(WordCountReduce.class);
39          
40         //设置输入的路径   预先通过put,拷几个文件到HDFS下的/com/juziku/testdata
41         FileInputFormat.setInputPaths(conf, newPath("/com/juziku/testdata"));
42         //设置输出的路径
43         FileOutputFormat.setOutputPath(conf, newPath("/output/testdata"));
44          
45         JobClient.runJob(conf);
46         return 0;
47     }
48  
49     public static void main(String[] args) throws Exception {
50         int status = ToolRunner.run(new MapReduceTest(), args);
51         System.exit(status);
52     }
53      
54 }

把上面的代码打成jar包,并指定Main class为com.juziku.MapReduceTest,再执行如下命令:

01 [root@hadoop1 bin]# pwd
02 /work/hadoop/hadoop-1.0.4/bin
03 [root@hadoop1 bin]# ./start-all.sh
04 starting namenode, logging to /work/hadoop/hadoop-1.0.4/libexec/../logs/hadoop-root-namenode-hadoop1.out
05 hadoop2: starting datanode, logging to /work/hadoop/hadoop-1.0.4/libexec/../logs/hadoop-root-datanode-hadoop2.out
06 hadoop3: starting datanode, logging to /work/hadoop/hadoop-1.0.4/libexec/../logs/hadoop-root-datanode-hadoop3.out
07 hadoop1: starting secondarynamenode, logging to /work/hadoop/hadoop-1.0.4/libexec/../logs/hadoop-root-secondarynamenode-hadoop1.out
08 starting jobtracker, logging to /work/hadoop/hadoop-1.0.4/libexec/../logs/hadoop-root-jobtracker-hadoop1.out
09 hadoop2: starting tasktracker, logging to /work/hadoop/hadoop-1.0.4/libexec/../logs/hadoop-root-tasktracker-hadoop2.out
10 hadoop3: starting tasktracker, logging to /work/hadoop/hadoop-1.0.4/libexec/../logs/hadoop-root-tasktracker-hadoop3.out
11 [root@hadoop1 bin]# ./hadoop fs -lsr /com/juziku
12 drwxr-xr-x   - root supergroup          0 2013-01-28 18:00 /com/juziku/testdata
13 -rw-r--r--   2 root supergroup         22 2013-01-28 18:00 /com/juziku/testdata/test1.txt
14 -rw-r--r--   2 root supergroup         22 2013-01-28 18:00 /com/juziku/testdata/test2.txt
15 [root@hadoop1 bin]# ./hadoop fs -cat /com/juziku/testdata/test1.txt
16 hello world in hadoop
17 [root@hadoop1 bin]# ./hadoop fs -cat /com/juziku/testdata/test2.txt
18 hello world in juziku
19 [root@hadoop1 bin]# ./hadoop jar ../hadoop2.jar
20 13/01/29 16:12:31 INFO util.NativeCodeLoader: Loaded the native-hadoop library
21 13/01/29 16:12:31 WARN snappy.LoadSnappy: Snappy native library not loaded
22 13/01/29 16:12:31 INFO mapred.FileInputFormat: Total input paths to process : 2
23 13/01/29 16:12:32 INFO mapred.JobClient: Running job: job_201301291609_0001
24 13/01/29 16:12:33 INFO mapred.JobClient:  map 0% reduce 0%
25 13/01/29 16:12:47 INFO mapred.JobClient:  map 50% reduce 0%
26 13/01/29 16:12:53 INFO mapred.JobClient:  map 100% reduce 0%
27 13/01/29 16:12:59 INFO mapred.JobClient:  map 100% reduce 100%
28 13/01/29 16:13:04 INFO mapred.JobClient: Job complete: job_201301291609_0001
29 13/01/29 16:13:04 INFO mapred.JobClient: Counters: 30
30 13/01/29 16:13:04 INFO mapred.JobClient:   Job Counters
31 13/01/29 16:13:04 INFO mapred.JobClient:     Launched reduce tasks=1
32 13/01/29 16:13:04 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=18013
33 13/01/29 16:13:04 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
34 13/01/29 16:13:04 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
35 13/01/29 16:13:04 INFO mapred.JobClient:     Launched map tasks=2
36 13/01/29 16:13:04 INFO mapred.JobClient:     Data-local map tasks=2
37 13/01/29 16:13:04 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=10619
38 13/01/29 16:13:04 INFO mapred.JobClient:   File Input Format Counters
39 13/01/29 16:13:04 INFO mapred.JobClient:     Bytes Read=44
40 13/01/29 16:13:04 INFO mapred.JobClient:   File Output Format Counters
41 13/01/29 16:13:04 INFO mapred.JobClient:     Bytes Written=39
42 13/01/29 16:13:04 INFO mapred.JobClient:   FileSystemCounters
43 13/01/29 16:13:04 INFO mapred.JobClient:     FILE_BYTES_READ=98
44 13/01/29 16:13:04 INFO mapred.JobClient:     HDFS_BYTES_READ=248
45 13/01/29 16:13:04 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=64080
46 13/01/29 16:13:04 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=39
47 13/01/29 16:13:04 INFO mapred.JobClient:   Map-Reduce Framework
48 13/01/29 16:13:04 INFO mapred.JobClient:     Map output materialized bytes=104
49 13/01/29 16:13:04 INFO mapred.JobClient:     Map input records=2
50 13/01/29 16:13:04 INFO mapred.JobClient:     Reduce shuffle bytes=104
51 13/01/29 16:13:04 INFO mapred.JobClient:     Spilled Records=16
52 13/01/29 16:13:04 INFO mapred.JobClient:     Map output bytes=76
53 13/01/29 16:13:04 INFO mapred.JobClient:     Total committed heap usage (bytes)=336994304
54 13/01/29 16:13:04 INFO mapred.JobClient:     CPU time spent (ms)=2340
55 13/01/29 16:13:04 INFO mapred.JobClient:     Map input bytes=44
56 13/01/29 16:13:04 INFO mapred.JobClient:     SPLIT_RAW_BYTES=204
57 13/01/29 16:13:04 INFO mapred.JobClient:     Combine input records=0
58 13/01/29 16:13:04 INFO mapred.JobClient:     Reduce input records=8
59 13/01/29 16:13:04 INFO mapred.JobClient:     Reduce input groups=5
60 13/01/29 16:13:04 INFO mapred.JobClient:     Combine output records=0
61 13/01/29 16:13:04 INFO mapred.JobClient:     Physical memory (bytes) snapshot=331780096
62 13/01/29 16:13:04 INFO mapred.JobClient:     Reduce output records=5
63 13/01/29 16:13:04 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=1146478592
64 13/01/29 16:13:04 INFO mapred.JobClient:     Map output records=8
65 0
66 [root@hadoop1 bin]# ./hadoop fs -lsr /output
67 drwxrwxrwx   - root supergroup          0 2013-01-29 16:13 /output/testdata
68 -rw-r--r--   2 root supergroup          0 2013-01-29 16:13 /output/testdata/_SUCCESS
69 drwxrwxrwx   - root supergroup          0 2013-01-29 16:12 /output/testdata/_logs
70 drwxrwxrwx   - root supergroup          0 2013-01-29 16:12 /output/testdata/_logs/history
71 -rw-r--r--   2 root supergroup      16271 2013-01-29 16:12 /output/testdata/_logs/history/job_201301291609_0001_1359447152308_root_WordCount
72 -rw-r--r--   2 root supergroup      20061 2013-01-29 16:12 /output/testdata/_logs/history/job_201301291609_0001_conf.xml
73 -rw-r--r--   2 root supergroup         39 2013-01-29 16:12 /output/testdata/part-00000
74 [root@hadoop1 bin]# ./hadoop fs -cat /output/testdata/part-00000
75 hadoop  1
76 hello   2
77 in      2
78 juziku  1
79 world   2
80 [root@hadoop1 bin]#

HBase完全分布模式安装

下载hbase-0.94.5.tar.gz,并解压到/work/hbase目录下,如下所示:

1 [root@hadoop1 hbase]# wget http://labs.mop.com/apache-mirror/hbase/hbase-0.94.5/hbase-0.94.5.tar.gz
2 [root@hadoop1 hbase]# tar zxf hbase-0.94.5.tar.gz
3 [root@hadoop1 hbase]# ll
4 总用量 47844
5 drwxr-xr-x. 11 1002 1002     4096 2月  19 17:20 hbase-0.94.5
6 -rw-r--r--.  1 root root 48988151 2月  19 15:48 hbase-0.94.5.tar.gz

下载zookeeper-3.4.5.tar.gz,并解压到/work/zookeeper目录下,如下所示:

1 [root@hadoop1 zookeeper]# wget http://labs.mop.com/apache-mirror/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz
2 [root@hadoop1 zookeeper]# tar zxf zookeeper-3.4.5.tar.gz
3 [root@hadoop1 zookeeper]# ll
4 总用量 16024
5 drwxr-xr-x. 10  501 games     4096 11月  5 16:04 zookeeper-3.4.5
6 -rw-r--r--.  1 root root  16402010 2月  19 15:49 zookeeper-3.4.5.tar.gz

修改hbase-site.xml配置文件,如下:

01 [root@hadoop1 conf]# pwd
02 /work/hbase/hbase-0.94.5/conf
03 [root@hadoop1 conf]# vim hbase-site.xml
04  
05 <?xml version="1.0"?>
06 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
07 <configuration>
08         <property>
09                 <name>hbase.rootdir</name>
10                 <value>hdfs://hadoop1:9000/hbase</value>
11                 <description>The directory shared by RegionServers.</description>
12         </property>
13         <property>
14                 <name>hbase.cluster.distributed</name>
15                 <value>true</value>
16         </property>
17         <property>
18                 <name>hbase.master</name>
19                 <value>hadoop1:60000</value>
20         </property>
21         <property>
22                  <name>hbase.zookeeper.quorum</name>
23                  <value>hadoop1,hadoop2,hadoop3</value>
24          </property>
25 </configuration>

其中:hadoop1、hadoop2、hadoop3需在/etc/hosts里配置,如下所示:

1 [root@hadoop1 conf]# cat /etc/hosts
2 192.168.1.110 hadoop1
3 192.168.1.111 hadoop2
4 192.168.1.112 hadoop3

把hbase集群的机器添加到conf/regionservers文件里,由于hbase安装在hadoop1、hadoop2、hadoop3里,则如下所示:

1 [root@hadoop1 conf]# pwd
2 /work/hbase/hbase-0.94.5/conf
3 [root@hadoop1 conf]# vim regionservers
4 hadoop1
5 hadoop2
6 hadoop3

修改hbase-env.sh文件, 改动内容如下:

1 [root@hadoop1 conf]# pwd
2 /work/hbase/hbase-0.94.5/conf
3 [root@hadoop1 conf]# vim hbase-env.sh
4 export JAVA_HOME=/root/tool/jdk1.6.0_31
5 export HBASE_MANAGES_ZK=true
6 #true:表示zookeeper交给hbase管理,启动hbase时,会自动启动hbase-site.xml里的hbase.zookeeper.quorum属性中的所有zookeeper实例
7 #false:表示启动hbase时,要手动启动所有zookeeper实例

配置zookeeper,如下所示:

01 [root@hadoop1 conf]# pwd
02 /work/zookeeper/zookeeper-3.4.5/conf
03 [root@hadoop1 conf]# cp zoo_sample.cfg zoo.cfg
04 [root@hadoop1 conf]# vim zoo.cfg
05 # The number of milliseconds of each tick
06 tickTime=2000
07 # The number of ticks that the initial
08 # synchronization phase can take
09 initLimit=10
10 # The number of ticks that can pass between
11 # sending a request and getting an acknowledgement
12 syncLimit=5
13 # the directory where the snapshot is stored.
14 # do not use /tmp for storage, /tmp here is just
15 # example sakes.
16 dataDir=$HADOOP_HOME/zookeeper-3.4.5/data
17 # the port at which the clients will connect
18 clientPort=2181
19 #
20 # Be sure to read the maintenance section of the
21 # administrator guide before turning on autopurge.
22 #
23 # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
24 #
25 # The number of snapshots to retain in dataDir
26 #autopurge.snapRetainCount=3
27 # Purge task interval in hours
28 # Set to "0" to disable auto purge feature
29 #autopurge.purgeInterval=1
30  
31 server.1=hadoop1:2888:3888
32 server.2=hadoop2:2888:3888
33 server.3=hadoop3:2888:3888

配置环境变量,如下:

01 [root@hadoop1 conf]# vim /etc/profile
02 export JAVA_HOME=/root/tool/jdk1.6.0_31
03  
04 export HADOOP_HOME=/work/hadoop/hadoop-1.0.4
05 export HIVE_HOME=/work/hive/hive-0.8.1
06 export HBASE_HOME=/work/hbase/hbase-0.94.5
07  
08 export JRE_HOME=$JAVA_HOME/jre
09 export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
10 exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$HIVE_HOME/bin:$HBASE_HOME/bin:$PATH

再把hbase、zookeeper拷贝到hadoop2/hadoop3机器上,如下:

1 [root@hadoop1 work]# scp -r hbase root@hadoop2:/work
2 [root@hadoop1 work]# scp -r hbase root@hadoop3:/work
3 [root@hadoop1 work]# scp -r zookeeper root@hadoop2:/work
4 [root@hadoop1 work]# scp -r zookeeper root@hadoop3:/work

接下来,就可以测试了,先启动hadoop,再启动hbase,如下:

01 [root@hadoop1 bin]# jps
02 3879 Jps
03 [root@hadoop1 bin]# pwd
04 /work/hadoop/hadoop-1.0.4/bin
05 [root@hadoop1 bin]# ./start-all.sh
06 [root@hadoop1 bin]# jps
07 4114 SecondaryNameNode
08 4196 JobTracker
09 3947 NameNode
10 4290 Jps
11 [root@hadoop1 bin]# cd /work/hbase/hbase-0.94.5/bin
12 [root@hadoop1 bin]# ./start-hbase.sh
13 hadoop3: starting zookeeper, logging to /work/hbase/hbase-0.94.5/bin/../logs/hbase-root-zookeeper-hadoop3.out
14 hadoop2: starting zookeeper, logging to /work/hbase/hbase-0.94.5/bin/../logs/hbase-root-zookeeper-hadoop2.out
15 hadoop1: starting zookeeper, logging to /work/hbase/hbase-0.94.5/bin/../logs/hbase-root-zookeeper-hadoop1.out
16 starting master, logging to /work/hbase/hbase-0.94.5/logs/hbase-root-master-hadoop1.out
17 hadoop2: starting regionserver, logging to /work/hbase/hbase-0.94.5/bin/../logs/hbase-root-regionserver-hadoop2.out
18 hadoop3: starting regionserver, logging to /work/hbase/hbase-0.94.5/bin/../logs/hbase-root-regionserver-hadoop3.out
19 hadoop1: starting regionserver, logging to /work/hbase/hbase-0.94.5/bin/../logs/hbase-root-regionserver-hadoop1.out
20 [root@hadoop1 bin]# jps
21 4575 HQuorumPeer
22 4114 SecondaryNameNode
23 4196 JobTracker
24 3947 NameNode
25 4637 HMaster
26 4790 HRegionServer
27 4893 Jps
28 [root@hadoop1 bin]# hbase shell
29 hbase(main):001:0> status
30 3 servers, 0 dead, 0.6667 average load
31  
32 hbase(main):002:0> exit
33 [root@hadoop1 bin]# cd /work/zookeeper/zookeeper-3.4.5/bin
34 [root@hadoop1 bin]# ./zkCli.sh -server hadoop1:2181
35 [zk: hadoop1:2181(CONNECTED) 0] ls /
36 [hbase, zookeeper]
37 [zk: hadoop1:2181(CONNECTED) 1] quit
38 Quitting...
39 [root@hadoop1 bin]#

到此,hbase完全分布模式安装就结束了。

hadoop支持的压缩算法

hadoop支持的压缩格式,如下表所示:

 压缩格式  工具  算法  文件扩展名  多文件  可分割性  Java实现  本地实现
 DEFLATE  无  DEFLATE  .deflate  否  否  是  是
 gzip  gzip  DEFLATE  .gz  否  否  是  是
 bzip2  bzip2  bzip2  .bz2  否  是  是  否
 LZO  lzop  LZO  .lzo  否  是  否  是

hadoop压缩编码/解码器,如下表所示:

 压缩格式  Hadoop压缩编码/解码器
 DEFLATE org.apache.hadoop.io.compress.DefaultCodec
 gzip org.apache.hadoop.io.compress.GzipCodec
 bzip2 org.apache.hadoop.io.compress.BZip2Codec
 LZO com.hadoop.compression.lzo.LzopCodec

其中,LZO格式是基于GPL许可的,不能通过Apache来分发许可,它的hadoop编码/解码器必须单独下载,下载地址:http://www.oberhumer.com/opensource/lzo/

设置Map处理后压缩数据的代码,如下所示:

1 JobConf job = new JobConf();
2 job.setBoolean("mapred.compress.map.output"true);

设置output输出压缩的代码,如下所示:

1 JobConf job = new JobConf();
2 job.setBoolean("mapred.output.compress"true);
3 job.setClass("mapred.output.compression.codec", GzipCodec.class, CompressionCodec.class);

FROM:http://www.juziku.com/wiki/5989.htm,http://wiki.juziku.com/