之前以为hadoop安装很难,然后装了hbase以后才知道,hadoop其实是小菜一碟,装hbase才叫难。经过我一周的不懈努力和反复尝试,终于成功的试验出来一套在windows上安装hbase0.20.6单机伪分布式模式的方法。

环境
win7 32bit
jdk 1.6.0_45 32bit
zookeeper 3.4.3
hadoop 0.20.2
hbase 0.20.6

首先不得不提的是,版本很重要,hadoop,hbase,jdk版本的搭配非常重要,在某个版本下成功的,很可能换了一个版本就不OK了,这也是hbase安装难的一个因素。

一些基本的安装如cygwin,ssh本文就不细说了,如果不懂,可以参考另一篇文章
[url]http://xpenxpen.iteye.com/blog/2061856[/url]

1.下载
hadoop下载[url]http://archive.apache.org/dist/hadoop/core/[/url]
hbase下载[url]http://archive.apache.org/dist/hadoop/hbase/[/url]
zookeeper下载[url]http://archive.apache.org/dist/zookeeper/[/url]

2. 一些准备工作
2.1 JDK版本
由于我用的是比较老的hbase版本,所以jdk一定要1.6的,如果用1.7的jdk是试不出来的(本人N次失败后的经验)。

修改/home/<user>/.bashrc
所指的home是d:\cygwin\home

export JAVA_HOME=/cygdrive/c/jdk1.6.0_45
export PATH=$JAVA_HOME/bin:$PATH




重新进入cygwin



$ [color=blue]which java[/color]


/cygdrive/c/jdk1.6.0_45/bin/java



2.2 创建符号链接(仅限Win7)


[color=blue]mklink /d d:\tmp d:\cygwin\tmp


mklink /d i:\tmp d:\cygwin\tmp [/color]



这步是比较关键的一步,因为hadoop的代码编写没有考虑到windows系统,所以tmp目录的定位是比较乱的,这里将d:\tmp,i:\tmp全部链接到cygwin下的tmp目录,后面就不会报诸如tmp目录找不到的错了。i:\tmp是由于我将hadoop-0.20.2解压到I盘了,d:\tmp则是因为cygwin装在D盘。如果你装在别的盘上了,则改成相应的盘符。



3.配置文件



3.1 zookeeper



复制conf目录下的zoo_sample.cfg一份,命名为zoo.cfg


修改如下属性


dataDir=/tmp/zookeeper
clientPort=2181




3.2 hadoop



修改conf/hadoop-env.sh


export JAVA_HOME=/cygdrive/c/jdk1.6.0_45
export HADOOP_LOG_DIR=/tmp/logs




修改conf目录下的3个配置文件


core-site.xml


<property>
		<name>fs.default.name</name>
		<value>hdfs://localhost:9000</value>
	</property>




hdfs-site.xml


<property>
	  <name>dfs.replication</name>
	  <value>1</value>
	</property>




mapred-site.xml


<property>
	  <name>mapred.job.tracker</name>
	  <value>localhost:9001</value>
	</property>
	<property> 
	  <name>mapred.tasktracker.map.tasks.maximum</name>
	  <value>4</value>
	</property> 
	<property> 
	  <name>mapred.tasktracker.reduce.tasks.maximum</name>
	  <value>4</value>
	</property>





3.3 hbase



配置conf/hbase-env.sh


export JAVA_HOME=/cygdrive/c/jdk1.6.0_45
export HBASE_CLASSPATH=/cygdrive/i/opensource/hadoop/hbase-0.20.6/lib/zookeeper-3.2.2.jar
export HBASE_MANAGES_ZK=false
export HBASE_LOG_DIR=/tmp/logs/hbase




配置conf/hbase-site.xml



<configuration>
	<property>
		<name>hbase.rootdir</name>
		<value>hdfs://localhost:9000/hbase/root</value>
	</property>
	<property>
		<name>hbase.tmp.dir</name>
		<value>hdfs://localhost:9000/hbase/tmp</value>
	</property>
	<property>
		<name>hbase.zookeeper.quorum</name>
		<value>127.0.0.1</value>
	</property>
	<property>
		<name>hbase.zookeeper.property.dataDir</name>
		<value>/tmp/zookeeper</value>
	</property>
	<property>
		<name>hbase.cluster.distributed</name>
		<value>true</value>
	</property>
</configuration>




4. 启动zookeeper


4.1 启动


Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop


$ [color=blue]cd ./zookeeper-3.4.3[/color]



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/zookeeper-3.4.3


$ [color=blue]./bin/zkServer.sh start[/color]


JMX enabled by default


Using config: I:\opensource\hadoop\zookeeper-3.4.3\conf\zoo.cfg


Starting zookeeper ... STARTED



4.2 检查


Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/zookeeper-3.4.3


$ [color=blue]jps[/color]


10040 Jps


6220 QuorumPeerMain



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/zookeeper-3.4.3


$ [color=blue]ps -ef | grep java[/color]


Administ 8656 1 pty0 13:26:43 /cygdrive/c/jdk1.6.0_45/bin/java




提示:


hbase自带的zookeeper版本是3.2.2,但是当你下载zookeeper3.2.2以后,会发现这个版本没有考虑cygwin,所以在cygwin下无法运行。后期版本已经修复了这个问题。如果你比较不同版本的bin/zkEnv.sh,搜索cygwin,你会发现新的版本多出来一些cygwin的判断。这就是之所以要下载zookeeper 3.4.3的原因了。而hbase目录下的zookeeper没关系,就放在那里好了。3.2.2的client连3.4.3的server貌似没什么问题。



5. 启动hadoop



5.1 格式化名称节点


Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/zookeeper-3.4.3


$ [color=blue]cd ../hadoop-0.20.2[/color]



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hadoop-0.20.2


$ [color=blue]./bin/hadoop namenode -format[/color]



5.2 启动hadoop集群


Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hadoop-0.20.2


$ [color=blue]./bin/start-all.sh[/color]


starting namenode, logging to /tmp/logs/hadoop-Administrator-namenode-PC-201308290023.out


localhost: starting datanode, logging to /tmp/logs/hadoop-Administrator-datanode-PC-201308290023.out


localhost: starting secondarynamenode, logging to /tmp/logs/hadoop-Administrator-secondarynamenode-PC-201308290023.out


starting jobtracker, logging to /tmp/logs/hadoop-Administrator-jobtracker-PC-201308290023.out


localhost: starting tasktracker, logging to /tmp/logs/hadoop-Administrator-tasktracker-PC-201308290023.out



5.3 检查集群状态


Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hadoop-0.20.2


$ [color=blue]jps[/color]


7620 NameNode


8988 Jps


6220 QuorumPeerMain


6952 JobTracker



[color=red](这里可能jps有点问题,只能看到多了2个进程,但实际上没问题,下面用ps可以看到多了5个java进程)[/color]



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hadoop-0.20.2


$ [color=blue]ps -ef | grep java[/color]


Administ 6640 1 ? 13:28:33 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 8160 1 pty0 13:28:21 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 8532 1 ? 13:28:40 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 5680 1 ? 13:28:28 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 10160 1 pty0 13:28:36 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 8656 1 pty0 13:26:43 /cygdrive/c/jdk1.6.0_45/bin/java




5.4 创建hdfs目录


Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hadoop-0.20.2


$ [color=blue]./bin/hadoop fs -mkdir /hbase[/color]



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hadoop-0.20.2


$ [color=blue]./bin/hadoop fs -mkdir /hbase/root[/color]



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hadoop-0.20.2


$ [color=blue]./bin/hadoop fs -mkdir /hbase/tmp[/color]



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hadoop-0.20.2


$ [color=blue]./bin/hadoop fs -chmod 777 /hbase/root[/color]



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hadoop-0.20.2


$ [color=blue]./bin/hadoop fs -chmod 777 /hbase/tmp[/color]



以上创建了/hbase/root和/hbase/tmp目录,这个是和hbase-site.xml里定义的一致的。随后我们将权限放出来。因为之前权限没放,而我win7的主用户是administrator,会出现cyg_server没有写权限而出错,权限全面放开就没问题了。不过linux下应该是创建一个hadoop用户,所以权限只给hadoop一个用户就可以了。


设置好以后可以上http://localhost:50070查看hdfs目录、权限是否正确。



6. 启动hbase



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hadoop-0.20.2


$ [color=blue]cd ../hbase-0.20.6[/color]



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hbase-0.20.6


$ [color=blue]./bin/start-hbase.sh[/color]


starting master, logging to /tmp/logs/hbase/hbase-Administrator-master-PC-201308290023.out


localhost: starting regionserver, logging to /tmp/logs/hbase/hbase-Administrator-regionserver-PC-201308290023.out



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hbase-0.20.6


$ [color=blue]jps[/color]


7620 NameNode


10048 Jps


8928 HMaster


6220 QuorumPeerMain


6952 JobTracker



[color=red](这里jps显示依然有点问题,只能看到多了hmaster一个进程,但实际上没问题,下面用ps可以看到8个java进程,也就是说明多出来2个进程(hmaster和hregionserver))[/color]



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hbase-0.20.6


$ [color=blue]ps -ef | grep java[/color]


Administ 6640 1 ? 13:28:33 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 8160 1 pty0 13:28:21 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 6332 1 ? 13:30:40 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 8532 1 ? 13:28:40 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 5680 1 ? 13:28:28 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 10160 1 pty0 13:28:36 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 2108 1 pty0 13:30:36 /cygdrive/c/jdk1.6.0_45/bin/java


Administ 8656 1 pty0 13:26:43 /cygdrive/c/jdk1.6.0_45/bin/java




7. 测试 hbase shell


成败在此一举,很多时候你辛辛苦苦把前面步骤都做完了,到最后一步发现测试不通。不过这次,我们成功了.



Administrator@PC-201308290023 /cygdrive/i/opensource/hadoop/hbase-0.20.6


$ [color=blue]./bin/hbase shell[/color]


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


Version: 0.20.6, r965666, Mon Jul 19 16:54:48 PDT 2010


[color=blue]create 'mytable', 'data'[/color]


create 'mytable', 'data'


0 row(s) in 1.2890 seconds


[color=blue]put 'mytable', 'row1', 'data:1', 'value1'[/color]


put 'mytable', 'row1', 'data:1', 'value1'


0 row(s) in 0.0040 seconds


[color=blue]list[/color]


list


mytable


1 row(s) in 0.0160 seconds


[color=blue]scan 'mytable'[/color]


scan 'mytable'


ROW COLUMN+CELL


row1 column=data:1, timestamp=1416715188693, value=value1


1 row(s) in 0.0220 seconds


[color=blue]exit[/color]


exit



最后要说的是,初学者每一步做完都请确认log里没有错误。log有时候是最好的引导者,有了错误日志,你才能去分析问题,去google问题。同时,遇到问题,这也是你宝贵的经验。