hadoop环境搭建好了,也学习了在eclipse中调试wordcount了,嘿嘿,下面试试hbase集成进去,年后争取顺利转入hadoop工作
首先 hadoop 和hbase版本需要对应,不然很多未知问题的 对应表如下
Table 2.1. Hadoop version support matrix
HBase-0.92.x | HBase-0.94.x | HBase-0.96.0 | |
---|---|---|---|
Hadoop-0.20.205 | S | X | X |
Hadoop-0.22.x | S | X | X |
Hadoop-1.0.0-1.0.2[a] | S | S | X |
Hadoop-1.0.3+ | S | S | S |
Hadoop-1.1.x | NT | S | S |
Hadoop-0.23.x | X | S | NT |
Hadoop-2.0.x-alpha | X | NT | X |
Hadoop-2.1.0-beta | X | NT | S |
Hadoop-2.2.0 | X | NT | S |
Hadoop-2.x | X | NT | S |
[a] HBase requires hadoop 1.0.3 at a minimum; there is an issue where we cannot find KerberosUtil compiling against earlier versions of Hadoop.
|
S = supported and tested,
X = not supported,
NT = it should run, but not tested enough.
1集群环境下hadoop.1.0.0已经安装成功
确保hadoop集群正常。 hadoop dfsadmin -report 正常就ok
2配置hosts,确保涉及的主机名均可以解析为ip, 解压hbase(hadoop用户安装)
配置好需要安装hbase的机器,因为要用到zoopkeeper最好确保机器个数为奇数个。
注意事项,hbase的版本要兼容hadoop集群的hadoop-core-xxx.jar的版本。最好hbase版本里lib下的hadoop-core-xxx.jar和hadoop集群的一样。
所以这里我选择了HBase-0.94.0, 对应hadoop-core-1.0.0.jar
解压hbase过程略过。
tar -zxvf /home/hadoop/hbase-0.94.0-hadoop1-bin.tar.gz
mv hbase-0.94.0-hadoop1 hbase ##重命名为hbase
①配置环境变量。
su 切换root用户
vi /etc/profile
export HBASE_HOME=/home/hadoop/hbase
export PATH=.:$HBASE_HOME/bin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
②使环境变量生效
source /etc/profile
su hadoop
③验证hbase
hbase version
3编辑$HBASE_HOME/conf/hbase-env.xml
#Java环境
export JAVA_HOME=/usr/java/jdk1.6.0_24
#通过hadoop的配置文件找到hadoop集群
export HBASE_CLASSPATH=/usr/hadoop/conf (我的hadoop放usr下面了)
#使用HBASE自带的zookeeper管理集群
export HBASE_MANAGES_ZK=true
4编辑$HBASE_HOME/conf/hbase-site.xml
在 $HBASE_HOME/conf/hbase-site.xml 添加下面内容(hbase-0.94版本压缩包解压后会有 $HBASE_HOME/src/main/resources/hbase-default.xml (不用全拷,其实就下面的就够了)拷贝里面的内容加入)
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://192.168.40.145:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.session.timeout</name> <value>60000</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> <property> <name>hbase.master.port</name> <value>60000</value> </property> <property> <name>hbase.master</name> <value>Master.Hadoop</value> </property> <property> <name>hbase.tmp.dir</name> <value>/home/hadoop/hbase/hbase-tmp</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>Master.Hadoop</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/hadoop/hbase/hbase-tmp/zookeeper</value> </property> </configuration>
5编辑$HBASE_HOME/conf/regionservers文件
6把Hbase复制到其它节点
7启动Hbase
启动Hbase之前要确保zookeeper起来了
[hadoop@Master logs]$ jps
22484 Jps
21854 SecondaryNameNode
21938 JobTracker
21677 NameNode
22069 QuorumPeerMain
而且hadoop要处于非安全模式下(重要),hadoop启动后默认有30秒属于安全模式
查看命令
hadoop dfsadmin -safemode get
如果是ON ,可以等30秒或者
hadoop dfsadmin -safemode leave
然后再启动hbase
start-hbase.sh
[hadoop@Master logs]$ jps
22513 Jps
21854 SecondaryNameNode
21938 JobTracker
22269 HMaster
21677 NameNode
22069 QuorumPeerMain
停止hbase
stop-hbase.sh
8验证启动
验证:jps 可以查看进程 或者 用 hbase shell尝试进入 hbase环境
9问题总结
2014-01-15 14:03:11,120 DEBUG org.apache.hadoop.hbase.util.FSUtils: Created version file at hdfs://192.168.40.145:9000/hbase set its version at:7
2014-01-15 14:03:11,135 WARN org.apache.hadoop.hdfs.DFSClient: DataStreamer Exception: org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /hbase/hbase.version could only be replicated to 0 nodes, instead of 1
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1558)
at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:696)
at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:563)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1388)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1384)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1382)
试验中,出现上面的问题,在master机器上,HMaster服务起来了一会,自动就关掉了,而http://192.168.40.145:60010/master-status 也打不开,
这个问题可能是存在于 hadoop的 namenode的VERSION不一致了,两个办法
原因:每次namenode format会重新创建一个namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空tmp一下的所有目录。
第一种解决方案如下:
1)先删除"/usr/hadoop/tmp"
rm -rf /usr/hadoop/tmp
2)创建"/usr/hadoop/tmp"文件夹
mkdir /usr/hadoop/tmp
3)删除"/tmp"下以"hadoop"开头文件
rm -rf /tmp/hadoop*
4)重新格式化hadoop
hadoop namenode -format
5)启动hadoop
start-all.sh
使用第一种方案,有种不好处就是原来集群上的重要数据全没有了。假如说Hadoop集群已经运行了一段时间。建议采用第二种。
第二种方案如下:
1)修改每个Slave的namespaceID使其与Master的namespaceID一致。
或者
2)修改Master的namespaceID使其与Slave的namespaceID一致。
该"namespaceID"位于"/usr/hadoop/tmp/dfs/data/current/VERSION"文件中,前面蓝色的可能根据实际情况变化,但后面红色是不变的。
例如:查看"Master"下的"VERSION"文件
保证namenode和datanode上这个一致就ok了
测试环境可以采用第一种直接format,实际生产环境推荐第二种