一、前言
1. 前提
因为hbase的运行模式是伪分布式,需要用到hdfs,所以在此之前,我已经完成了hadoop-eclipse的开发环境搭建,详细看另一篇文章:hadoop开发环境部署——通过eclipse远程连接hadoop2.7.3进行开发,本篇的目的是在windows端部署开发环境,使之能连上服务端进行运行测试。
2. 环境
服务端系统:centos6.5
hadoop版本:2.7.3
java版本:1.8
hbase版本:1.2.6
eclipse版本:juno,4.2.0(windows)
二、安装maven及eclipse插件
1. 安装maven
下载maven安装包和eclipse插件,我用的版本是3.3.9,为了方便大家,把maven和插件打包分享到网盘:
百度网盘:https://pan.baidu.com/s/18p3vIPC7tw14gBI-doulZw
密码:croh
解压maven压缩包到文件夹,设置环境变量MAVEN_HOME和添加path:
如果在cmd中敲入mvn -v中有版本信息输出的话证明安装成功。
2. 修改maven仓库存放地址
为了避免重装系统等原因删掉了已经下载的依赖,可以把maven的仓库地址修改到另一个位置,步骤如下:
- 找到%MAVEN_HOME%/conf/settings.xml文件
- 找到localRepository标签,增加路径配置加上自己的路径
在cmd里敲入命令mvn help:system,下载完依赖就可以在设定的仓库路径看到具体的信息了。
3. 安装maven插件
一般来说,在eclipse安装插件有两种方式:
1) 在线安装,主要操作是选择一个下载地址,然后指定下载这个地址里面的插件,当然也可以添加另外的有效地址,一般步骤是,在菜单栏中选择Help,然后选择Install New Software…,接着你会看到一个Install对话框,点击Work with:字段边上的Add按钮,你会得到一个新的Add Repository对话框,在Name字段中输入m2e,Location字段中输入http://m2eclipse.sonatype.org/sites/m2e,然后点击OK。
在线安装的缺点是,很多插件地址是在国外的,速度慢不说,还经常安装不成功。
2) 离线安装
下载完插件之后,可以发现在插件文件夹里面,有两个文件夹:features和plugins,在eclipse home目录新建一个文件夹,名字可以随便取,我取的mvnplugin,把刚才说的那两个文件夹拷贝进去。
在eclipse home目录找到dropins目录,新建一个文件maven.link,填入:
path=C:\eclipse_juno\eclipse\mvnplugin
根据自己的情况进行调整。
重启eclipse,检查插件有没有安装成功,Windows –> Preferences:
离线安装优点有几个,一是免于在线安装的龟速和地址失效造成的安装失败,二是用link的方式,方便安装和插拔,推荐用这种方式去安装插件。
4. 配置maven
选择本机安装的maven路径:
使用自己安装maven的配置:
至此,完成maven及其eclipse插件的安装和配置。
三、搭建hbase开发环境
1. 创建maven项目
File->New->Other->Maven->Maven Project,type为maven-archetype-quickstart,工程名为MyHBase。
2. 添加配置文件到资源路径
从集群的hadoop配置文件夹复制core-site.xml,hdfs-site.xml,mapred-site.xml三个文件放在hadoop文件夹,从集群的hbase配置文件夹复制hbase-site.xml放在hbase文件夹,然后把这两个文件夹分别添加到项目的资源文件夹路径下:
/src/main/resources/hadoop
/src/main/resources/hbase
3. 将配置路径加到classpath中
最后的目录结构:
4. 修改hbase-site.xml
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://harry.com:9000/hbase</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>harry.com</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> </configuration>
harry.com是linux主机域名,在此之前已经在windows的host文件添加了映射。
5. 同步hbase库
将HBase集群下的lib目录拷贝到Windows下,并在eclipse中将lib下的所有库添加到工程。
6. 新建测试类HBaseTest
代码如下:
package com.harry.hbase.myHbase; //package com.eric.hbase; 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.util.Bytes; public class HBaseTest { private static final String TABLE_NAME = "demo_table"; public static Configuration conf = null; public HTable table = null; public HBaseAdmin admin = null; static { conf = HBaseConfiguration.create(); System.out.println(conf.get("hbase.zookeeper.quorum")); } /** * 创建一张表 */ public static void creatTable(String tableName, String[] familys) throws Exception { HBaseAdmin admin = new HBaseAdmin(conf); if (admin.tableExists(tableName)) { System.out.println("table already exists!"); } else { HTableDescriptor tableDesc = new HTableDescriptor(tableName); for (int i = 0; i < familys.length; i++) { tableDesc.addFamily(new HColumnDescriptor(familys[i])); } admin.createTable(tableDesc); System.out.println("create table " + tableName + " ok."); } } /** * 删除表 */ public static void deleteTable(String tableName) throws Exception { try { HBaseAdmin admin = new HBaseAdmin(conf); admin.disableTable(tableName); admin.deleteTable(tableName); System.out.println("delete table " + tableName + " ok."); } catch (MasterNotRunningException e) { e.printStackTrace(); } catch (ZooKeeperConnectionException e) { e.printStackTrace(); } } /** * 插入一行记录 */ public static void addRecord(String tableName, String rowKey, String family, String qualifier, String value) throws Exception { try { HTable table = new HTable(conf, tableName); Put put = new Put(Bytes.toBytes(rowKey)); put.add(Bytes.toBytes(family), Bytes.toBytes(qualifier), Bytes.toBytes(value)); table.put(put); System.out.println("insert recored " + rowKey + " to table " + tableName + " ok."); } catch (IOException e) { e.printStackTrace(); } } /** * 删除一行记录 */ public static void delRecord(String tableName, String rowKey) throws IOException { HTable table = new HTable(conf, tableName); List list = new ArrayList(); Delete del = new Delete(rowKey.getBytes()); list.add(del); table.delete(list); System.out.println("del recored " + rowKey + " ok."); } /** * 查找一行记录 */ public static void getOneRecord(String tableName, String rowKey) throws IOException { HTable table = new HTable(conf, tableName); Get get = new Get(rowKey.getBytes()); Result rs = table.get(get); for (KeyValue kv : rs.raw()) { System.out.print(new String(kv.getRow()) + " "); System.out.print(new String(kv.getFamily()) + ":"); System.out.print(new String(kv.getQualifier()) + " "); System.out.print(kv.getTimestamp() + " "); System.out.println(new String(kv.getValue())); } } /** * 显示所有数据 */ public static void getAllRecord(String tableName) { try { HTable table = new HTable(conf, tableName); Scan s = new Scan(); ResultScanner ss = table.getScanner(s); for (Result r : ss) { for (KeyValue kv : r.raw()) { System.out.print(new String(kv.getRow()) + " "); System.out.print(new String(kv.getFamily()) + ":"); System.out.print(new String(kv.getQualifier()) + " "); System.out.print(kv.getTimestamp() + " "); System.out.println(new String(kv.getValue())); } } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { // TODO Auto-generated method stub try { String tablename = "scores"; String[] familys = { "grade", "course" }; HBaseTest.creatTable(tablename, familys); // add record zkb HBaseTest.addRecord(tablename, "zkb", "grade", "", "5"); HBaseTest.addRecord(tablename, "zkb", "course", "", "90"); HBaseTest.addRecord(tablename, "zkb", "course", "math", "97"); HBaseTest.addRecord(tablename, "zkb", "course", "art", "87"); // add record baoniu HBaseTest.addRecord(tablename, "baoniu", "grade", "", "4"); HBaseTest .addRecord(tablename, "baoniu", "course", "math", "89"); System.out.println("===========get one record========"); HBaseTest.getOneRecord(tablename, "zkb"); System.out.println("===========show all record========"); HBaseTest.getAllRecord(tablename); System.out.println("===========del one record========"); HBaseTest.delRecord(tablename, "baoniu"); HBaseTest.getAllRecord(tablename); System.out.println("===========show all record========"); HBaseTest.getAllRecord(tablename); } catch (Exception e) { e.printStackTrace(); } } }
7. 添加日志配置
文件名log4j.properties,内容如下:
# Configure logging for testing: optionally with log file #log4j.rootLogger=debug,appender log4j.rootLogger=info,appender #log4j.rootLogger=error,appender #u8F93u51FAu5230u63A7u5236u53F0 log4j.appender.appender=org.apache.log4j.ConsoleAppender #u6837u5F0Fu4E3ATTCCLayout log4j.appender.appender.layout=org.apache.log4j.TTCCLayout
添加完这两个文件,目录结构为:
8. 运行代码
右键-->Run as -->java application,如果成功的话,console会有如下输出:
至此,hbase在windows系统下的eclipse开发环境就部署成功了。
四、参考
4. HBase 开发环境搭建(Eclipse+Maven)
(完)