设为首页 收藏本站
查看: 1221|回复: 0

[经验分享] hadoop使用指南

[复制链接]

尚未签到

发表于 2015-7-11 11:47:08 | 显示全部楼层 |阅读模式
Hadoop开发环境使用指南
http://maplespace.taobao.com/
QQ: 258058669
金枫IDea实验室          2014年3月出品
DSC0000.jpg
  

目录
  

1 序言1
2 环境简介2
2.1 软件版本2
2.2 服务管理3
2.3 开发IDE—eclipse6
3 HDFS使用开发12
3.1 DFS Shell12
3.2 HDFS的用户和目录17
3.3 HDFS高级管理命令18
3.4 hdfs文件读写例子20
4 Hbase开发24
4.1 简介24
4.2 例子代码30
5 MapReduce开发32
5.1 简介32
5.2 例子代码41
6 常见问题与解决方法46
6.1 NameNode进入SafeMode文件系统进入只读状态,什么都无法运行,包括Hbase,MapReduce等46
6.2 执行命令很长时间无响应,出现"mint/127.0.1.1"字样58
  1 序言
Hadoop是目前业界最热的大数据开发分析平台,许多朋友都想在大数据的时代,学习新的技能增强自身的竞争力。
但Hadoop平台由于部署复杂,需要设备较多等因素,阻碍很多朋友进入大数据时代的脚步。本站特推出了,Hadoop的开发学习环境的一体U 盘,来方便大家的学习。
本U盘采用自启动的Linux mint系统,操作风格类似于windows,只要你会windows就会使用本系统。
Hadoop系统则采用业内最稳定的Cloudera公司的CDH4.6版本,进行了伪集群的部署,可以直接使用HDFS,MapReduce和HBase组件。
同时系统已安装好eclipse和firefox,方便你开发的同时,也便于你上网查资料。
硬件最好是双核2.0G以上CPU,内存3G以上(由于Hadoop基于java开发很消耗内存,内存是越多越好),支持U盘启动即可。
目前市面上最多的关于Hadoop的书籍都是介绍整个Hadoop的原理,架构等等方面的内容,读者理解起来比较费力,无从下手的感觉。而本书则主足于Hadoop的核心部件,以应用和开发为主来讲解,并配有可实验的环境,学习起来就事半功倍了。
从应用的角度来看看,Hadoop就三个核心部门组成:
1 HDFS,Hadoop的分布式文件系统,用来存储大量文件的,由一个NameNode(名称节点)和若干个DataNode(数据节点)组成,可以做到横向扩展。即然是文件系统,就离不开文件系统的基本特征,比如怎样存放文件 ,怎样控制权限,怎样的客户端来操作文件,怎样的编程接口来开发程序。讲明了这些问题,HDFS就算是清楚了。本书也是从上面几个角度来阐述的。
2Hbase,Hadoop的数据库,是一个典型的NoSQL数据库,数据存放在HDFS上,同样可以横向扩展。即然是数据库,就需要知道数据库中是如何建表的,如何进行模式设计的,有没有一个数据库操作的终端程序,怎样进行编程开发等。
3MapReduce, 是Hadoop的并行计算框架,这个就需要了解这个计算框架能做什么,是怎么工作的,如何来进行编程等。
可以看出本书所讲的都是读者所关心的核心问题出发,找到解决这些问题的最简途径,是大家在最短时间内来理解和使用Hadoop 平台。好了啰唆这么多,下面上干的了。
2 环境简介
本章节对整个环境做个初步的介绍,让你有所了解。
U盘的操作系统采用的是Ubuntu 12.04 LTS 64位的优化版本mint版,使用wondows的操作界面,便于上手操作。
JDK版本为1.6.32,属于oracle官方发行版本。
Hadoop采用是的Cloudera的CDH4.6版本,100%开源,免费使用,比Apache的hadoop版本更加的稳定。生产场合一般都在使用此版本,学习时和生产场合的相同,可以避免一些不必要的磨合。


2.1 软件版本
模块
版本
程序目录
配置文件目录
common
2.0
/usr/lib/hadoop
/etc/hadoop/conf
hdfs
2.0
/usr/lib/hadoop-hdfs
/etc/hadoop/conf
mapreduce
2.0
/usr/lib/hadoop-0.20-mapreduce
/etc/hadoop-0.20-mapreduce/conf
hbase
0.94
/usr/lib/hbase
/etc/hbase/conf
zookeeper
3.4.5
/usr/lib/zookeeper
/etc/zookeeper/conf


2.2 服务管理
安装好的服务放在/etc/init.d目录下,可以使用以下命令进行启停操作.
为保证数据安全的存储,服务没有采用自启动的方式,系统启动后可以在桌面上看到start_all.sh的文件,双击弹出如下对话框:

选择“在终端运行”就开始执行了。如果遇到图标叠在一起无法分清时,直接在桌面右击,选择“按名称组织桌面”,如下图即可。


在关闭系统前一定使用桌面上的stop_all.sh来停止所有服务,要不然经常会使系统进行到SafeMode ,需要进行修复。


服务名称
作用
操作命令
日志目录
NameNode
HDFS文件的管理节点,用来管理元数据,通俗来讲就是管理文件目录和文件数据块分配等。
启动:
$ sudo service hadoop-hdfs-namenode start
停止:
$ sudo service hadoop-hdfs-namenode stop
/var/
log/hadoop-hdfs/
DataNode
HDFS文件系统中用来实际存放 的文件数据的节点
启动:
$ sudo service hadoop-hdfs-datanode start
停止:
$ sudo service hadoop-hdfs-datanode stop
/var/
log/hadoop-hdfs/
JobTracker
来来跟踪管理MapReduce的作业调度的服务器,hadoop0.20使用的架构
启动:
$ sudo service hadoop-0.20-mapreduce-jobtracker  start
停止:
$ sudo service hadoop-0.20-mapreduce-jobtracker  stop
/var/log/
hadoop-0.20-mapreduce
TaskTracker
来来跟踪管理MapReduce的任务运行的服务器,hadoop0.20使用的架构
启动:
$ sudo service hadoop-0.20-mapreduce-tasktracker  start
停止:
$ sudo service hadoop-0.20-mapreduce-tasktracker  stop
/var/log/
hadoop-0.20-mapreduce
zookeeper
分步协调服务器,主要是和HBase集群协同工作。
安装完成后第一次启动前需要先初始化:
$ sudo service zookeeper-server  init
启动:
$ sudo service zookeeper-server  start
停止:
$ sudo service zookeeper-server  stop


/var/log/
zookeeper
HMaster
Hbase数据库用来进行元数据管理的节点
启动:
$ sudo service hbase-master start
停止:
$ sudo service hbase-master  stop
/var/log/
hbase
Hregionserver
Hbase数据库实际存储数据的节点
启动:
$ sudo service hbase-regionserver start
停止:
$ sudo service  hbase-regionserver stop
/var/log/
hbase
hbase-thrift
Hbase数据库第三方语言服务
启动:
$ sudo service hbase-thrift  start
停止:
$ sudo service  hbase-thrift  stop
/var/log/
hbase

启动过程如果有问题可以在相应的日志目录查找文件,看看是什么原因造成的。
正常启动后可以使用如下命令进行验证服务是否启动成功:
$ sudo jps

18497 ThriftServer
11461 DataNode
4098 SecondaryNameNode
11571 NameNode
13025 JobTracker
18038 HMaster
4682 QuorumPeerMain
18596 Jps
13530 TaskTracker

数字代表进程号,后面是服务的名称。

其中QuorumPeerMain 即zookeeper服务,SecondaryNameNode是NameNode的备份节点。



2.3 开发IDE—eclipse
本环境中使用的开发工具是最常用的Eclipse,Java开发者一般都会使用的,如果你对eclipse不感冒也不要紧,本指南的方法一般都会给出手工的编译命令,可以让你使用你所喜欢的编辑器进行开发。
eclipse的启动方法,在桌面上双击图标即可启动,缺省工作空间为/home/mint/workspace,已经缺省加入了几个例子工程,供大家学习使用。
在/home/mint/hadoop目录下面有3个打包好的jar文件(和eclipse中的工程是对应的),分别用来做HDFS,Hbase和MapReduce的测试,具体操作如下:

1 HDFS测试(在/tmp目录下写一个Demo1.txt的文件)
在桌面上右击,选择“在终端打开”,打开一个操作终端,如下图所示:


进入终端后进行如下操作:


mint@mint $ java -jar hdfs-test.jar
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2014-3-29 11:22:38 org.apache.hadoop.util.NativeCodeLoader
警告: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
验证一下
mint@mint ~/hadoop $ sudo -u hdfs hdfs dfs -ls /tmp

Found 2 items

-rw-r--r--   3 mint   supergroup      10400 2014-03-29 11:22 /tmp/Demo1.txt

drwxrwxrwt   - mapred supergroup          0 2014-03-28 16:06 /tmp/mapred

2 Hbase测试 (创建一个myhbase的表)
$ sudo jps
4401 HRegionServer
10263 Jps
3851 DataNode
3760 TaskTracker
4163 SecondaryNameNode
10109 HMaster
4694 QuorumPeerMain
3565 JobTracker
7141 NameNode
9358 org.eclipse.equinox.launcher_1.2.0.v20110502.jar

确保 Hmaster,HRegionServer,QuorumPeerMain,DataNode,NameNode
全部在,否则的话就按照2.2的说明启动服务了。
$ java -jar hbase-test.jar
start create table ......
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

2014-3-29 11:40:44 org.apache.hadoop.util.NativeCodeLoader

警告: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2014-3-29 11:40:44 org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper
信息: The identifier of this process is 10376@mint
2014-3-29 11:40:44 org.apache.hadoop.conf.Configuration warnOnceIfDeprecated
警告: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
2014-3-29 11:40:45 org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper
信息: The identifier of this process is 10376@mint
2014-3-29 11:40:51 org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper
信息: The identifier of this process is 10376@mint
end create table ......

用hbase shell 验证一下:
$ hbase shell

14/03/29 13:40:02 WARN conf.Configuration: hadoop.native.lib is deprecated. Instead, use io.native.lib.available

HBase Shell; enter 'help' for list of supported commands.

Type "exit" to leave the HBase Shell

Version 0.94.15-cdh4.6.0, rUnknown, Wed Feb 26 02:39:52 PST 2014

hbase(main):005:0> list

TABLE                                                                                                                                                                 
myhbase                                                                                                                                                               
1 row(s) in 0.0470 seconds

hbase(main):009:0> describe 'myhbase'

DESCRIPTION                                                                                                 ENABLED                                                   

'myhbase', {NAME => 'column1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE =>  true                                                      

'0', VERSIONS => '3', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2147483647', KEEP_DELETED_CELLS                                                            

=> 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', ENCODE_ON_DISK => 'true', BLOCKCACHE => 'true'}, {                                                            

NAME => 'column2', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSION                                                            

S => '3', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2147483647', KEEP_DELETED_CELLS => 'false',                                                            

BLOCKSIZE => '65536', IN_MEMORY => 'false', ENCODE_ON_DISK => 'true', BLOCKCACHE => 'true'}, {NAME => 'col                                                            

umn3', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '3', CO                                                            

MPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2147483647', KEEP_DELETED_CELLS => 'false', BLOCKSIZE =>                                                            

  '65536', IN_MEMORY => 'false', ENCODE_ON_DISK => 'true', BLOCKCACHE => 'true'}                                                                                       

1 row(s) in 0.1270 seconds


3 HDFS使用开发
HDFS即hadoop的分步式文件系统,最大的特点即可以很好的横向扩展,由一个NameNode节点和多个DataNode节点组成。本环境使用的是伪集群部署即只有一个NameNode和一个DataNode,且在同一台机器上。要使用HDFS时,必须先启动NameNode和DataNode的服务,具体方法见第二章节的相关内容。

3.1 DFS Shell
Hadoop提供了一个hdfs的shell命令,用来管理hdfs上的文件,供有新老两访问方式。

老的方式为:
$ hadoop fs -ls /

Found 5 items

drwxrwxrwt   - hdfs  supergroup          0 2014-03-28 16:44 /dfs

drwxr-xr-x   - hbase supergroup          0 2014-03-28 20:57 /hbase

drwxr-xr-x   - hdfs  supergroup          0 2014-03-28 16:54 /mapred

drwxrwxrwt   - hdfs  supergroup          0 2014-03-28 16:03 /tmp

drwxr-xr-x   - hdfs  supergroup          0 2014-03-28 16:01 /user


新的方式为:
$ hdfs dfs -ls /

Found 5 items

drwxrwxrwt   - hdfs  supergroup          0 2014-03-28 16:44 /dfs

drwxr-xr-x   - hbase supergroup          0 2014-03-28 20:57 /hbase

drwxr-xr-x   - hdfs  supergroup          0 2014-03-28 16:54 /mapred

drwxrwxrwt   - hdfs  supergroup          0 2014-03-28 16:03 /tmp

drwxr-xr-x   - hdfs  supergroup          0 2014-03-28 16:01 /user


两种方式的支持的命令其本相同,和linux本地文件系统的命令基本也对应,只是前面增加了一个-,如ls 则在Hadoop为-ls .

常法如下:
$ hdfs dfs

Usage: hadoop fs [generic options]

[-cat [-ignoreCrc]  ...]

[-chgrp [-R] GROUP PATH...]

[-chmod [-R]  PATH...]

[-chown [-R] [OWNER][:[GROUP]] PATH...]

[-copyFromLocal  ... ]

[-copyToLocal [-ignoreCrc] [-crc]  ... ]

[-count [-q]  ...]

[-cp  ... ]

[-df [-h] [ ...]]

[-du [-s] [-h]  ...]

[-expunge]

[-get [-ignoreCrc] [-crc]  ... ]

[-getmerge [-nl]  ]

[-help [cmd ...]]

[-ls [-d] [-h] [-R] [ ...]]

[-mkdir [-p]  ...]

[-moveFromLocal  ... ]

[-moveToLocal  ]

[-mv  ... ]

[-put  ... ]

[-rm [-f] [-r|-R] [-skipTrash]  ...]

[-rmdir [--ignore-fail-on-non-empty]  ...]

[-setrep [-R] [-w]   ...]

[-stat [format]  ...]

[-tail [-f] ]

[-test -[ezd] ]

[-text [-ignoreCrc]  ...]

[-touchz  ...]

[-usage [cmd ...]]


常见命令如下:
命令
用法
示例(以hdfs用户执行,hdfs是HDFS的超级用户)
改变权限
[-chmod [-R]  PATH...]

$ sudo -u hdfs  hdfs dfs -chmod 1777 /tmp
改变所有者
[-chown [-R] [OWNER][:[GROUP]] PATH...]

$ sudo -u hdfs  hdfs dfs -chown hdfs tmp
上传文件到集群
[-copyFromLocal  ... ]

和put命令相同
下载文件到本地
[-copyToLocal [-ignoreCrc] [-crc]  ... ]

和get命令相同
统计目录和文件个数,文件大小
[-count [-q]  ...]

$ sudo -u hdfs hdfs dfs -count /mapred

    2            1                  4 /mapred

两个目录,一个文件,共4个字节
hdfs文件间拷贝
[-cp  ... ]

$ sudo -u hdfs  hdfs dfs -cp /tmp/a /tmp/b
统计设备使用
[-df [-h] [ ...]]

$ sudo -u hdfs hdfs dfs -df -h

Filesystem               Size   Used  Available  Use%

hdfs://localhost:8020  13.6 G  940 K     11.8 G    0%
统计目录使用
[-du [-s] [-h]  ...]

$ sudo -u hdfs hdfs dfs -du -h /

186.7 K  /dfs

3.1 K    /hbase

4        /mapred

326.3 K  /tmp

171.3 K  /user

下载文件到本地
[-get [-ignoreCrc] [-crc]  ... ]

$ sudo -u hdfs hdfs dfs -get /user/joe/input/core-site.xml /tmp
注意hdfs用户要有写/tmp目录的权限
查看文件
[-ls [-d] [-h] [-R] [ ...]]

$ sudo -u hdfs hdfs dfs -ls -R /
查看所有文件
创建目录
[-mkdir [-p]  ...]

$sudo -u hdfs hdfs dfs -mkdir a

上传文件到集群
[-put  ... ]

$ sudo -u hdfs hdfs dfs -put /tmp/core-site.xml /a
注意hdfs用户要有读/tmp/core-site.xml的权限
删除文件
[-rm [-f] [-r|-R] [-skipTrash]  ...]

$ sudo -u hdfs hdfs dfs -rm /a/core-site.xml
删除目录
[-rmdir [--ignore-fail-on-non-empty]  ...]

$sudo -u hdfs hdfs dfs -rm /a
设置目录或文件副本个数
[-setrep [-R] [-w]   ...]

$ sudo -u hdfs hdfs dfs -setrep -R 2 /tmp

显示文件时间
[-stat [format]  ...]

sudo -u hdfs hdfs dfs -stat /user/joe/input/core-site.xml

2014-03-28 08:02:20

返回文件最后内容
[-tail [-f] ]




3.2 HDFS的用户和目录
HDFS文件系统使用的用户和linux本地系统使用的用户是对应的。Hadoop 系统为了考虑安全在整个体系中是分了若干用户的,而不是只有一个超级用户什么事情能可以做,这样风险比较大。
在Hadoop安装的过程中,就在linux系统中缺省创建了几个用户,具体信息如下表:
用户
含义
目录
hdfs
HDFS系统的超级用户
/
mapred
运行MapReduce(v1)的用户
/mapred
yarn
运行MapReduce(v2)的用户
没有使用
hbase
Hbase数据库的用户
/hbase
其它用户
其它用户的目录可以在/user下面进行创建
/user

存放临时文件的目录
/tmp
需要注意的问题:
1可以在HDFS文件系统中使用多个用户,如创建一个joe的目录
$ sudo -u hdfs hdfs dfs -mkdir /user/joe
$ sudo -u hdfs hdfs dfs -chown joe /user/joe
HDFS系统中不用创建用户直接改变文件所有者就行了,它是用本地文件系统中的对应用户来做验证的。
这时本地系统中并没有joe的用户,需要对应在本发系统中增加一个joe的用户。
$ sudo -u useradd joe

这样就可以使用joe的身份来操作HDFS目录了,如:
$ sudo -u joe hdfs dfs -mkdir /user/joe/input
在MapReduce的章节中,运行MapReduce一般也都需要新建一个用户来运行的,和上面的操作方式就类似了。

2 hdfs在HDFS文件系统中是超级用户,但在本地文件系统中并不是超级用户,所以一些命令是需要注意用户权限的。

$ sudo -u hdfs hdfs dfs -get /user/joe/input/core-site.xml /tmp
注意hdfs用户要有写/tmp目录的权限

$ sudo -u hdfs hdfs dfs -put /tmp/core-site.xml /a
注意hdfs用户要有读/tmp/core-site.xml的权限


3.3 HDFS高级管理命令
用法:
$ sudo -u hdfs hdfs

Usage: hdfs [--config confdir] COMMAND

       where COMMAND is one of:

  dfs                  run a filesystem command on the file systems supported in Hadoop.

  namenode -format     format the DFS filesystem

  secondarynamenode    run the DFS secondary namenode

  namenode             run the DFS namenode

  journalnode          run the DFS journalnode

  zkfc                 run the ZK Failover Controller daemon

  datanode             run a DFS datanode

  dfsadmin             run a DFS admin client

  haadmin              run a DFS HA admin client

  fsck                 run a DFS filesystem checking utility

  balancer             run a cluster balancing utility

  jmxget               get JMX exported values from NameNode or DataNode.

  oiv                  apply the offline fsimage viewer to an fsimage

  oev                  apply the offline edits viewer to an edits file

  fetchdt              fetch a delegation token from the NameNode

  getconf              get config values from configuration

  groups               get the groups which users belong to


常用命令如下:
命令
介绍
示例
namenode -format
格式化namenode节点,第一次安装hdfs时使用,格式化时不要启动namenode和datanode服务
$ sudo -u hdfs hdfs namenode -format
fsck
文件系统检查,是否有数据块丢失等情况。
$ sudo -u hdfs hdfs fsck /
balancer   
使各数据节点的数据均衡

dfsadmin  
返回一个管理客户端,最常用


-report

报告hdfs的各节点状态,容量,是否在SafeMode等
$ sudo -u hdfs hdfs dfsadmin -report

[-safemode enter | leave | get | wait]
进入,离开安全模式,在安全模式下,系统处于只读状态。
$ sudo -u hdfs hdfs dfsadmin -safemode enter 进入
$ sudo -u hdfs hdfs dfsadmin -safemode leave 离开


3.4 hdfs文件读写例子
在eclipse可以新建一个JAVA项目hdfs-test,新建一个Test.java,内容如下:

代码很简单,就是创建一个文件,写入内容,关键是他如何编译和运行。

编译和运行时所需要jar:
选择项目,右击选择属性(properties)


导出成jar文件时还需要一个配置文件,不然会在运行时报错:


在菜单中选择File-->Export,弹出导出对话框:
下一步(next):

注意: Lounch configuration 里只能选择运行过的JAVA文件,不管能不能运行成功,只要运行过就能执行成功,所以一定要先运行一下,就可以出现在选择框中进行导出来。

导出JAR文件后,就可以运行了:
mint@mint $ java -jar hdfs-test.jar
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2014-3-29 11:22:38 org.apache.hadoop.util.NativeCodeLoader
警告: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
4 Hbase开发
4.1 简介
HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》。HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。
2. HBase的表结构
HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族/列簇(column family)。

Row Key
column-family1
column-family2
column-family3

column1
column2
column1
column2
column3
column1
key1
t1:abc
t2:gdxdf

t4:dfads
t3:hello
t2:world



key2
t3:abc
t1:gdxdf

t4:dfads
t3:hello

t2:dfdsfa
t3:dfdf

key3

t2:dfadfasd
t1:dfdasddsf



t2:dfxxdfasd
t1:taobao.com

如上图所示,key1,key2,key3是三条记录的唯一的row key值,column-family1,column-family2,column-family3是三个列族,每个列族下又包括几列。比如 column-family1这个列族下包括两列,名字是column1和column2,t1:abc,t2:gdxdf是由row key1和column-family1-column1唯一确定的一个单元cell。这个cell中有两个数据,abc和gdxdf。两个值的时间戳不 一样,分别是t1,t2, hbase会返回最新时间的值给请求者。
这些名词的具体含义如下:
(1) Row Key
与nosql数据库们一样,row key是用来检索记录的主键。访问hbase table中的行,只有三种方式:
(1.1) 通过单个row key访问
(1.2) 通过row key的range
(1.3) 全表扫描
Row key行键 (Row key)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。
存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
注意:
字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。
行的一次读写是原子操作 (不论一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。
(2) 列族 column family
hbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如courses:history , courses:math 都属于 courses 这个列族。
访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数 据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。
(3) 单元 Cell
HBase中通过row和columns确定的为一个存贮单元称为cell。由{row key, column( = + ), version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。
(4) 时间戳 timestamp
每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
3. HBase shell的基本用法
hbase提供了一个shell的终端给用户交互。通过执行 help get 可以看到命令的帮助信息。
以网上的一个学生成绩表的例子来演示hbase的用法。
name
grad
course


math
art
zkb
5
97
87
baoniu
4
89
80
这里grad对于表来说是一个列,course对于表来说是一个列族,这个列族由两个列组成math和art,当然我们可以根据我们的需要在course 中建立更多的列族,如computer,physics等相应的列添加入course列族。图中需要注意的是90这个值,列族下面的列也是可以没有名字 的。
(1) 建立一个表格scores  具有两个列族grad 和courese
hbase(main):001:0> create 'scores','grade', 'course'
0 row(s) in 0.4780 seconds

(2) 查看当前HBase中具有哪些表
hbase(main):002:0> list

TABLE                                                                                                                                                                                       
scores                                                                                                                                                                              

1 row(s) in 0.0270 seconds

(3) 查看表的构造
hbase(main):004:0> describe 'scores'

DESCRIPTION                                                 ENABLED                                             

{NAME => 'scores', FAMILIES => [{NAME => 'course', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', true                                                

COMPRESSION => 'NONE', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'fal                                                      

se', BLOCKCACHE => 'true'}, {NAME => 'grade', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', COMPR                                                      

ESSION => 'NONE', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY =>'false',                                                      

BLOCKCACHE =>'true'}]}                                                                                                                                   
1 row(s) in 0.0390 seconds

(4) 加入一行数据,行名称为zkb 列族grad的列名为”” 值位5
hbase(main):006:0> put 'scores','zkb','grade:','5'      
0 row(s) in 0.0420 seconds

(5) 给zkb这一行的数据的列族course添加一列
hbase(main):007:0> put 'scores','zkb','course:math','97'
0 row(s) in 0.0270 seconds

(6) 给zkb这一行的数据的列族course添加一列
hbase(main):008:0> put 'scores','zkb','course:art','87'
0 row(s) in 0.0260 seconds

(7) 加入一行数据,行名称为baoniu 列族grad的列名为”” 值为4
hbase(main):009:0> put 'scores','baoniu','grade:','4'   
0 row(s) in 0.0260 seconds

(8) 给baoniu这一行的数据的列族course添加一列
hbase(main):010:0> put 'scores','baoniu','course:math','89'
0 row(s) in 0.0270 seconds

(9) 给Jerry这一行的数据的列族course添加一列
hbase(main):011:0> put 'scores','baoniu','course:art','80'
0 row(s) in 0.0270 seconds

(10) 查看scores表中zkb的相关数据
hbase(main):012:0> get 'scores','zkb'

COLUMN                     CELL                                                                                
course:art                              timestamp=1316100110921, value=87                                                                                 

course:math                             timestamp=1316100025944, value=97                                                                                 

grade:                                  timestamp=1316099975625, value=5                                                                                 

3 row(s) in 0.0480 seconds

(11) 查看scores表中所有数据
注意:scan命令可以指定startrow,stoprow来scan多个row,例如:scan 'user_test',{COLUMNS =>'info:username',LIMIT =>10, STARTROW => 'test',STOPROW=>'test2'}
hbase(main):013:0> scan 'scores'

ROW                        COLUMN+CELL                                                                                                      
baoniu                                  column=course:art, timestamp=1316100293784, value=80                                                              

baoniu                                  column=course:math, timestamp=1316100234410, value=89                                                            

baoniu                                  column=grade:, timestamp=1316100178609, value=4                                                                  

zkb                                     column=course:art, timestamp=1316100110921, value=87                                                              

zkb                                     column=course:math, timestamp=1316100025944, value=97                                                            

zkb                                     column=grade:, timestamp=1316099975625, value=5                                                                  

2 row(s) in 0.0470 seconds

(12) 查看scores表中所有数据courses列族的所有数据
hbase(main):017:0> scan 'scores',{COLUMNS => 'course'}

ROW                        COLUMN+CELL                                                                                                      
baoniu                                  column=course:art, timestamp=1316100293784, value=80                                                              

baoniu                                  column=course:math, timestamp=1316100234410, value=89                                                            

zkb                                     column=course:art, timestamp=1316100110921, value=87                                                              

zkb                                     column=course:math, timestamp=1316100025944, value=97                                                            

2 row(s) in 0.0350 seconds

(13) 删除scores表
hbase(main):024:0> disable 'scores'
0 row(s) in 0.0330 seconds



hbase(main):025:0> drop 'scores'  

0 row(s) in 1.0840 seconds




4.2 例子代码
package test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.util.Bytes;

public class Test {

public static Configuration configuration;
static {
configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.property.clientPort", "2181");
configuration.set("hbase.zookeeper.quorum", "localhost");
//configuration.set("hbase.master", "192.168.1.100:600000");
}
public static String tableName="myhbase";

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("start create table ......");
try {
HBaseAdmin hBaseAdmin = new HBaseAdmin(configuration);
if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建
hBaseAdmin.disableTable(tableName);
hBaseAdmin.deleteTable(tableName);
System.out.println(tableName + " is exist,detele....");
}
HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
tableDescriptor.addFamily(new HColumnDescriptor("column1"));
tableDescriptor.addFamily(new HColumnDescriptor("column2"));
tableDescriptor.addFamily(new HColumnDescriptor("column3"));
hBaseAdmin.createTable(tableDescriptor);
} catch (MasterNotRunningException e) {
e.printStackTrace();
} catch (ZooKeeperConnectionException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("end create table ......");
}

}

编译运行所需要的jar包如下图:

可以直接在eclipse中直接运行,导出成jar方式和hdfs相同,不再赘述。
5 MapReduce开发
5.1 简介
MapReduce是整个Hadoop 架构中相对复杂的部分,接下来我们先来运行一个Hadoop 自带的例子,来感受一下,MapReduce是怎么回事。
写好的一个MapReduce 一定要打包成jar,同时必须在集群的机器上运行,
运行时最好采用独立的用户,即谁的MapReduce用谁的用户来运行,便于管理。所以下面我们先创建一个joe的用户的目录,以joe的身份来运行MapReduce.
$ sudo -u hdfs hdfs dfs -mkdir /user/joe
$ sudo -u hdfs hdfs dfs -chown joe /user/joe
$ sudo -u hdfs hdfs dfs -ls -R /user

drwxr-xr-x   - joe supergroup          0 2014-03-29 14:08 /user/joe

要确保本地的linux系统上也有joe这个用户,如果没有则新建一个
$ sudo useradd joe
然后以joe的身份来进行后续操作

$ sudo -u joe hdfs dfs  -mkdir /user/joe/input

用来存放输入的文件

$ sudo -u joe hdfs dfs  -put /etc/hadoop/conf/*.xml /user/joe/input

$ sudo -u joe hdfs dfs  -ls -R /user/joe/input

-rw-r--r--   1 joe supergroup       1458 2014-03-29 14:15 /user/joe/input/core-site.xml

-rw-r--r--   1 joe supergroup       1729 2014-03-29 14:15 /user/joe/input/hdfs-site.xml

-rw-r--r--   1 joe supergroup        768 2014-03-29 14:15 /user/joe/input/mapred-site.xml

$ sudo -u joe hadoop jar /usr/lib/hadoop-0.20-mapreduce/hadoop-examples.jar grep input output 'dfs[a-z.]+'

14/03/29 14:19:54 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.

14/03/29 14:19:54 INFO mapred.FileInputFormat: Total input paths to process : 3

14/03/29 14:19:55 INFO mapred.JobClient: Running job: job_201403291418_0001

14/03/29 14:19:56 INFO mapred.JobClient:  map 0% reduce 0%

14/03/29 14:20:07 INFO mapred.JobClient:  map 67% reduce 0%

14/03/29 14:20:15 INFO mapred.JobClient:  map 100% reduce 0%

14/03/29 14:20:18 INFO mapred.JobClient:  map 100% reduce 100%

14/03/29 14:20:20 INFO mapred.JobClient: Job complete: job_201403291418_0001

14/03/29 14:20:20 INFO mapred.JobClient: Counters: 33

14/03/29 14:20:20 INFO mapred.JobClient:   File System Counters

14/03/29 14:20:20 INFO mapred.JobClient:     FILE: Number of bytes read=204

14/03/29 14:20:20 INFO mapred.JobClient:     FILE: Number of bytes written=673176

14/03/29 14:20:20 INFO mapred.JobClient:     FILE: Number of read operations=0

14/03/29 14:20:20 INFO mapred.JobClient:     FILE: Number of large read operations=0

14/03/29 14:20:20 INFO mapred.JobClient:     FILE: Number of write operations=0

14/03/29 14:20:20 INFO mapred.JobClient:     HDFS: Number of bytes read=4266

14/03/29 14:20:20 INFO mapred.JobClient:     HDFS: Number of bytes written=320

14/03/29 14:20:20 INFO mapred.JobClient:     HDFS: Number of read operations=7

14/03/29 14:20:20 INFO mapred.JobClient:     HDFS: Number of large read operations=0

14/03/29 14:20:20 INFO mapred.JobClient:     HDFS: Number of write operations=2

14/03/29 14:20:20 INFO mapred.JobClient:   Job Counters

14/03/29 14:20:20 INFO mapred.JobClient:     Launched map tasks=3

14/03/29 14:20:20 INFO mapred.JobClient:     Launched reduce tasks=1

14/03/29 14:20:20 INFO mapred.JobClient:     Data-local map tasks=3

14/03/29 14:20:20 INFO mapred.JobClient:     Total time spent by all maps in occupied slots (ms)=25310

14/03/29 14:20:20 INFO mapred.JobClient:     Total time spent by all reduces in occupied slots (ms)=10180

14/03/29 14:20:20 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0

14/03/29 14:20:20 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0

14/03/29 14:20:20 INFO mapred.JobClient:   Map-Reduce Framework

14/03/29 14:20:20 INFO mapred.JobClient:     Map input records=126

14/03/29 14:20:20 INFO mapred.JobClient:     Map output records=6

14/03/29 14:20:20 INFO mapred.JobClient:     Map output bytes=186

14/03/29 14:20:20 INFO mapred.JobClient:     Input split bytes=311

14/03/29 14:20:20 INFO mapred.JobClient:     Combine input records=6

14/03/29 14:20:20 INFO mapred.JobClient:     Combine output records=6

14/03/29 14:20:20 INFO mapred.JobClient:     Reduce input groups=6

14/03/29 14:20:20 INFO mapred.JobClient:     Reduce shuffle bytes=216

14/03/29 14:20:20 INFO mapred.JobClient:     Reduce input records=6

14/03/29 14:20:20 INFO mapred.JobClient:     Reduce output records=6

14/03/29 14:20:20 INFO mapred.JobClient:     Spilled Records=12

14/03/29 14:20:20 INFO mapred.JobClient:     CPU time spent (ms)=2950

14/03/29 14:20:20 INFO mapred.JobClient:     Physical memory (bytes) snapshot=687951872

14/03/29 14:20:20 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=3928993792

14/03/29 14:20:20 INFO mapred.JobClient:     Total committed heap usage (bytes)=504627200

14/03/29 14:20:20 INFO mapred.JobClient:   org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter

14/03/29 14:20:20 INFO mapred.JobClient:     BYTES_READ=3955

14/03/29 14:20:20 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.

14/03/29 14:20:20 INFO mapred.FileInputFormat: Total input paths to process : 1

14/03/29 14:20:20 INFO mapred.JobClient: Running job: job_201403291418_0002

14/03/29 14:20:21 INFO mapred.JobClient:  map 0% reduce 0%

14/03/29 14:20:29 INFO mapred.JobClient:  map 100% reduce 0%

14/03/29 14:20:35 INFO mapred.JobClient:  map 100% reduce 100%

14/03/29 14:20:37 INFO mapred.JobClient: Job complete: job_201403291418_0002

14/03/29 14:20:37 INFO mapred.JobClient: Counters: 33

14/03/29 14:20:37 INFO mapred.JobClient:   File System Counters

14/03/29 14:20:37 INFO mapred.JobClient:     FILE: Number of bytes read=204

14/03/29 14:20:37 INFO mapred.JobClient:     FILE: Number of bytes written=331264

14/03/29 14:20:37 INFO mapred.JobClient:     FILE: Number of read operations=0

14/03/29 14:20:37 INFO mapred.JobClient:     FILE: Number of large read operations=0

14/03/29 14:20:37 INFO mapred.JobClient:     FILE: Number of write operations=0

14/03/29 14:20:37 INFO mapred.JobClient:     HDFS: Number of bytes read=434

14/03/29 14:20:37 INFO mapred.JobClient:     HDFS: Number of bytes written=150

14/03/29 14:20:37 INFO mapred.JobClient:     HDFS: Number of read operations=4

14/03/29 14:20:37 INFO mapred.JobClient:     HDFS: Number of large read operations=0

14/03/29 14:20:37 INFO mapred.JobClient:     HDFS: Number of write operations=2

14/03/29 14:20:37 INFO mapred.JobClient:   Job Counters

14/03/29 14:20:37 INFO mapred.JobClient:     Launched map tasks=1

14/03/29 14:20:37 INFO mapred.JobClient:     Launched reduce tasks=1

14/03/29 14:20:37 INFO mapred.JobClient:     Data-local map tasks=1

14/03/29 14:20:37 INFO mapred.JobClient:     Total time spent by all maps in occupied slots (ms)=9305

14/03/29 14:20:37 INFO mapred.JobClient:     Total time spent by all reduces in occupied slots (ms)=5801

14/03/29 14:20:37 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0

14/03/29 14:20:37 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0

14/03/29 14:20:37 INFO mapred.JobClient:   Map-Reduce Framework

14/03/29 14:20:37 INFO mapred.JobClient:     Map input records=6

14/03/29 14:20:37 INFO mapred.JobClient:     Map output records=6

14/03/29 14:20:37 INFO mapred.JobClient:     Map output bytes=186

14/03/29 14:20:37 INFO mapred.JobClient:     Input split bytes=114

14/03/29 14:20:37 INFO mapred.JobClient:     Combine input records=0

14/03/29 14:20:37 INFO mapred.JobClient:     Combine output records=0

14/03/29 14:20:37 INFO mapred.JobClient:     Reduce input groups=1

14/03/29 14:20:37 INFO mapred.JobClient:     Reduce shuffle bytes=204

14/03/29 14:20:37 INFO mapred.JobClient:     Reduce input records=6

14/03/29 14:20:37 INFO mapred.JobClient:     Reduce output records=6

14/03/29 14:20:37 INFO mapred.JobClient:     Spilled Records=12

14/03/29 14:20:37 INFO mapred.JobClient:     CPU time spent (ms)=1770

14/03/29 14:20:37 INFO mapred.JobClient:     Physical memory (bytes) snapshot=312918016

14/03/29 14:20:37 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=1986486272

14/03/29 14:20:37 INFO mapred.JobClient:     Total committed heap usage (bytes)=194052096

14/03/29 14:20:37 INFO mapred.JobClient:   org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter

14/03/29 14:20:37 INFO mapred.JobClient:     BYTES_READ=234


如果没有反应,或出现错误,请将JobTracker和TackTracker 重启一下。
$ sudo service hadoop-0.20-mapreduce-tasktracker restart

$ sudo service hadoop-0.20-mapreduce-jobtracker restart

$ sudo -u joe hdfs dfs  -ls -R /user/joe/

drwx------   - joe supergroup          0 2014-03-29 14:20 /user/joe/.staging

drwxr-xr-x   - joe supergroup          0 2014-03-29 14:15 /user/joe/input

-rw-r--r--   1 joe supergroup       1458 2014-03-29 14:15 /user/joe/input/core-site.xml

-rw-r--r--   1 joe supergroup       1729 2014-03-29 14:15 /user/joe/input/hdfs-site.xml

-rw-r--r--   1 joe supergroup        768 2014-03-29 14:15 /user/joe/input/mapred-site.xml

drwxr-xr-x   - joe supergroup          0 2014-03-29 14:20 /user/joe/output

-rw-r--r--   1 joe supergroup          0 2014-03-29 14:20 /user/joe/output/_SUCCESS

drwxr-xr-x   - joe supergroup          0 2014-03-29 14:20 /user/joe/output/_logs

drwxr-xr-x   - joe supergroup          0 2014-03-29 14:20 /user/joe/output/_logs/history

-rw-r--r--   1 joe supergroup      19106 2014-03-29 14:20 /user/joe/output/_logs/history/job_201403291418_0002_1396074020765_joe_grep-sort

-rw-r--r--   1 joe supergroup      76476 2014-03-29 14:20 /user/joe/output/_logs/history/job_201403291418_0002_conf.xml

-rw-r--r--   1 joe supergroup        150 2014-03-29 14:20 /user/joe/output/part-00000


查看结果:
$ sudo -u joe hdfs dfs  -cat /user/joe/output/part-00000

1dfs.datanode.data.dir

1dfs.namenode.checkpoint.dir

1dfs.namenode.name.dir

1dfs.replication

1dfs.safemode.extension

1dfs.safemode.min.datanodes


5.2 例子代码
以面以一个专利引用统计的场景来编写一个MapReduce.
输入文件是一个专利引用的原始文件,格式如下:
$ tail input.txt

6009553,5671255

6009554,4029274

6009554,4181849

6009554,4494717

6009554,4611291

6009554,4617662

6009554,4740972

6009554,4831521

6009554,5048064

6009554,5364047

前面是一个专利号,后面是一个引用的专利号。
经过MapReduce 后形成一个如下的格式,可以直接知道某个专利引用了哪些专利,格式如下:
59038266009335

59045166008097

59049696009071

59050436007744

59050656008175

59055006009188

59055996008955,6008957

59058676009541

59061496008562

59073616008853


下面我们来运行一下mr-test.jar,在桌面打开一个终端:


最后验证结果:
$ sudo -u joe hdfs dfs  -tail /user/joe/output/i_20000/part-r-00000

207106009513

59223826007863

59226226007733

59227456008238

59236106009041

59239776008079

59241926009352

59251236009517

59253386007799

59255856008153

59258796009216

59263186008778

59263866009033

59264976008675

59267686009335

59283016009365


原始的input.txt文件有200多M,运行下来,需要比较多的内存和时间,如果想截取一部分,可以使用以下方法:
$ tail -n 20000 input.txt > i_20000.txt

-n 后面可以是你想要的行数

具体的代码如下,自己体会吧!

package test;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class MyJob extends Configured implements Tool {

public static class MyMap extends Mapper {

public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String[] citation = value.toString().split(",");
context.write(new Text(citation[1]), new Text(citation[0]));
}
}

public static class Reduce extends Reducer {

public void reduce(Text key, Iterable values, Context context)
throws IOException, InterruptedException {
String csv = "";
for (Text val : values) {
if (csv.length() > 0) {
csv += ",";
}
csv += val.toString();
}
context.write(key, new Text(csv));
}
}


public int run(String[] args) throws Exception {



JobConf jobconf = new JobConf();
jobconf.setJar("mr-test.jar");

Job job = new Job(jobconf, "MyJobNew");
Path in = new Path(args[0]);
Path out = new Path(args[1]);

FileInputFormat.setInputPaths(job, in);
FileOutputFormat.setOutputPath(job, out);

job.setMapperClass(MyMap.class);
job.setReducerClass(Reduce.class);

job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

System.exit(job.waitForCompletion(true) ? 0 : 1);

return 0;
}

public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(), new MyJob(), args);

System.exit(res);
}
}

编译运行所要的jar如下:

导出成jar方式和hdfs相同,不再赘述。

6 常见问题与解决方法
6.1 NameNode进入SafeMode文件系统进入只读状态,什么都无法运行,包括Hbase,MapReduce等
NameNode每次启动后会先进入到SafeMode,进行相应的检查,检查没有错误则会自动退出SafeMode。如果检查发现有数据错误且无法恢复时,或者恢复时间很长时,系统将保持SafeMode很长时间。在SafeMode时文件系统进行到只读状态,所能的功能都将无法运行,如Hbase,MapReduce等。
在真集群部署环境中一般数据都有多个备份,一般都能修复,系统会自动退出SafeMode,而我们的这个U盘开发环境,是一台机器部署的,没有数据备份,如查机器的内存又不是很充足的情况下,在运行大任务时会出现死机,如果强制重启很可能丢失数据,下次启动时就会进入到SafeMode,且不能恢复,还好我们只是学习没有什么重要的数据,遇到些情况时我们就会删除所有重据,重新初始化文件系统,即可以解决问题。
具体的方法如下:
1先用如下命令检查是否真正进入到了SafeMode
$ sudo -u hdfs hdfs dfsadmin -report

Safe mode is ON

Configured Capacity: 0 (0 B)

Present Capacity: 0 (0 B)

DFS Remaining: 0 (0 B)

DFS Used: 0 (0 B)

DFS Used%: NaN%

Under replicated blocks: 0

Blocks with corrupt replicas: 0

Missing blocks: 0



-------------------------------------------------

Datanodes available: 0 (0 total, 0 dead)

如上所示SafeMode is ON,表明进入到安全模式,也看不到有效的Datanode。

简单的一个修复方法是重新启动一下DataNode服务:
$ sudo service hadoop-hdfs-datanode restart



如果显示如下信息,表明正常:
$ sudo -u hdfs hdfs dfsadmin -report

Configured Capacity: 14594809856 (13.59 GB)

Present Capacity: 12265713664 (11.42 GB)

DFS Remaining: 12264693760 (11.42 GB)

DFS Used: 1019904 (996 KB)

DFS Used%: 0.01%

Under replicated blocks: 35

Blocks with corrupt replicas: 0

Missing blocks: 35



-------------------------------------------------

Datanodes available: 1 (1 total, 0 dead)



Live datanodes:

Name: 127.0.0.1:50010 (localhost)

Hostname: mint

Decommission Status : Normal

Configured Capacity: 14594809856 (13.59 GB)

DFS Used: 1019904 (996 KB)

Non DFS Used: 2329096192 (2.17 GB)

DFS Remaining: 12264693760 (11.42 GB)

DFS Used%: 0.01%

DFS Remaining%: 84.03%

Last contact: Sat Mar 29 13:03:31 CST 2014

如果还不能解决问题,就只能采用下面的方法了。

2对文件系统进行检查
$ sudo -u hdfs hdfs fsck /

Connecting to namenode via http://localhost:50070

FSCK started by hdfs (auth:SIMPLE) from /127.0.0.1 for path / at Sat Mar 29 12:56:40 CST 2014

.

/a/core-site.xml: CORRUPT blockpool BP-440067771-127.0.1.1-1395993500484 block blk_-668652487170756989



/a/core-site.xml: MISSING 1 blocks of total size 1458 B..

/dfs/cache/mapred/system/jobtracker.info: CORRUPT blockpool BP-440067771-127.0.1.1-1395993500484 block blk_-2906575160296270737



/dfs/cache/mapred/system/jobtracker.info: MISSING 1 blocks of total size 4 B..

/dfs/cache/{$user}/mapred/staging/joe/.staging/job_201403281634_0001/job.jar: CORRUPT blockpool BP-440067771-127.0.1.1-1395993500484 block blk_5758761621933181375



/dfs/cache/{$user}/mapred/staging/joe/.staging/job_201403281634_0001/job.jar: MISSING 1 blocks of total size 142829 B..

/dfs/cache/{$user}/mapred/staging/joe/.staging/job_201403281634_0001/job.split: CORRUPT blockpool BP-440067771-127.0.1.1-1395993500484 block blk_-1372247348431020353



发现大量丢失的数据块,因为找不回了,所以下一步就要删除坏的文件。

3离开SafeMode,删除坏文件
$ sudo -u hdfs hdfs dfsadmin -safemode leave

Safe mode is OFF

mint@mint ~/Desktop $ sudo -u hdfs hdfs dfsadmin -report

Configured Capacity: 0 (0 B)

Present Capacity: 0 (0 B)

DFS Remaining: 0 (0 B)

DFS Used: 0 (0 B)

DFS Used%: NaN%

Under replicated blocks: 37

Blocks with corrupt replicas: 0

Missing blocks: 37



-------------------------------------------------

Datanodes available: 0 (0 total, 0 dead)


删除坏的文件
mint@mint ~/Desktop $ sudo -u hdfs hdfs dfs -rm -r -f  /hbase

Deleted /hbase

mint@mint ~/Desktop $ sudo -u hdfs hdfs dfs -rm -r -f  /a

Deleted /a

mint@mint ~/Desktop $ sudo -u hdfs hdfs dfs -rm -r -f  /mapred

Deleted /mapred

mint@mint ~/Desktop $ sudo -u hdfs hdfs dfs -rm -r -f  /user


4 重启datanode服务,检查是否正常

$ sudo service hadoop-hdfs-datanode restart

* Stopping Hadoop datanode:

stopping datanode

* Starting Hadoop datanode:

starting datanode, logging to /var/log/hadoop-hdfs/hadoop-hdfs-datanode-mint.out

mint@mint ~/Desktop $ sudo -u hdfs hdfs dfsadmin -report

Configured Capacity: 14594809856 (13.59 GB)

Present Capacity: 12265713664 (11.42 GB)

DFS Remaining: 12264693760 (11.42 GB)

DFS Used: 1019904 (996 KB)

DFS Used%: 0.01%

Under replicated blocks: 35

Blocks with corrupt replicas: 0

Missing blocks: 35



-------------------------------------------------

Datanodes available: 1 (1 total, 0 dead)



Live datanodes:

Name: 127.0.0.1:50010 (localhost)

Hostname: mint

Decommission Status : Normal

Configured Capacity: 14594809856 (13.59 GB)

DFS Used: 1019904 (996 KB)

Non DFS Used: 2329096192 (2.17 GB)

DFS Remaining: 12264693760 (11.42 GB)

DFS Used%: 0.01%

DFS Remaining%: 84.03%

Last contact: Sat Mar 29 13:03:31 CST 2014


5重新创建HDFS所需要目录
mint@mint ~/Desktop $ sudo -u hdfs hdfs dfs -mkdir /user

mint@mint ~/Desktop $ sudo -u hdfs hdfs dfs -mkdir /tmp

mint@mint ~/Desktop $ sudo -u hdfs hdfs dfs -mkdir /hbase

mint@mint ~/Desktop $ sudo -u hdfs hdfs dfs -mkdir /mapred

mint@mint ~/Desktop $ sudo -u hdfs hdfs dfs -chown hbase /hbase

mint@mint ~/Desktop $ sudo -u hdfs hdfs dfs -chown mapred /mapred

mint@mint ~/Desktop $ sudo -u hdfs hdfs dfs -chmod 1777 /tmp


6检查重启服务
$ sudo jps

4384 HRegionServer

4679 QuorumPeerMain

4542 ThriftServer

7805 Jps

6804 DataNode

3757 TaskTracker

3546 JobTracker

4143 SecondaryNameNode

3992 NameNode

这时你发现HMaser少了,这是因为我们将Hbase目录删除的缘故,重启HMaster服务
$ sudo service hbase-master start

$ sudo -u hdfs hdfs dfs -ls -R /hbase

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/-ROOT-

-rw-r--r--   1 hbase supergroup        728 2014-03-29 13:35 /hbase/-ROOT-/.tableinfo.0000000001

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/-ROOT-/.tmp

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/-ROOT-/70236052

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/-ROOT-/70236052/.oldlogs

-rw-r--r--   1 hbase supergroup        421 2014-03-29 13:35 /hbase/-ROOT-/70236052/.oldlogs/hlog.1396071330072

-rw-r--r--   1 hbase supergroup        109 2014-03-29 13:35 /hbase/-ROOT-/70236052/.regioninfo

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/-ROOT-/70236052/info

-rw-r--r--   1 hbase supergroup        796 2014-03-29 13:35 /hbase/-ROOT-/70236052/info/63534c3e33174ff2b3aaa0f49be9c6ee

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/.META.

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/.META./1028785192

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/.META./1028785192/.oldlogs

-rw-r--r--   1 hbase supergroup        134 2014-03-29 13:35 /hbase/.META./1028785192/.oldlogs/hlog.1396071330402

-rw-r--r--   1 hbase supergroup        111 2014-03-29 13:35 /hbase/.META./1028785192/.regioninfo

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/.META./1028785192/info

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/.logs

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/.logs/mint,60020,1396068894272

-rw-r--r--   1 hbase supergroup          0 2014-03-29 13:35 /hbase/.logs/mint,60020,1396068894272/mint%2C60020%2C1396068894272.1396071332443

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/.oldlogs

drwxr-xr-x   - hbase supergroup          0 2014-03-29 13:35 /hbase/.tmp

-rw-r--r--   1 hbase supergroup         38 2014-03-29 13:35 /hbase/hbase.id

-rw-r--r--   1 hbase supergroup          3 2014-03-29 13:35 /hbase/hbase.version


重新初始化了Hbase的根表,可以正常使用了。

6.2 执行命令很长时间无响应,出现"mint/127.0.1.1"字样

$ sudo -u hdfs hdfs dfsadmin -report

^Creport: Failed on local exception: java.io.InterruptedIOException: Interruped while waiting for IO on channel java.nio.channels.SocketChannel[connected local=/127.0.0.1:60826 remote=localhost/127.0.0.1:8020]. 38741 millis timeout left.; Host Details : local host is: "mint/127.0.1.1"; destination host is: "localhost":8020;

出现"mint/127.0.1.1"字样。
原因系统启动时将 Ip地址给写错了,添加到/etc/hosts文件中,解决办法:
$ sudo pluma /etc/hosts



改成如上所示即可。








































Change List:

version
date
author
content
0.1
2013-03-28
goldmaple
立题,结构,序言,2.a 3.1
0.2
2013-03-29
goldmaple
3.a,5.a
0.3
2013-03-29
Goldmaple
成稿

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-85527-1-1.html 上篇帖子: Hadoop实战之四~hadoop作业调度详解(2) 下篇帖子: hadoop 异常记录 ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表