好久没搭起来测测了,今天顺手搭起来用用。结果遇到了很多问题,下面一一说明
一、部署
简单起见,我使用了stand-alone模式。直接下载解压即可,注意的是需要改动hbase-site.xml:
<configuration> <property> <name>hbase.rootdir</name> <value>file:///root/zhangtieying/hbase</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/root/zhangtieying/zookeeper</value> </property> </configuration>
另外,注意修改/etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 10.1.102.104 ccf04 10.20.14.16 dt16 10.20.14.17 dt17 10.20.14.18 dt18 10.20.14.19 dt19 10.20.14.20 dt20 10.20.14.21 dt21 10.20.14.22 dt22 10.20.14.23 dt23 10.20.14.24 dt24 10.20.14.25 dt25
一定注意:ccf04为主机名,要和实际ip10.1.102.104对应上
ccf04添加为主机名的方法:vim /etc/sysconfig/network:
NETWORKING=yes HOSTNAME=ccf04
二、java客户端连接
这里给出我的测试代码(部分代码是copy的)
/** * Created by Michael on 2015/6/20. */ 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.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 TestHbase { static Configuration conf=null; static{ conf=HBaseConfiguration.create();//hbase的配置信息 conf.set("hbase.zookeeper.quorum", "10.1.102.104:2181"); //zookeeper的地址 } public static void main(String[] args)throws Exception { TestHbase t=new TestHbase(); t.createTable("test-zty", new String[]{"name","age"}); //t.insertRow("test-zty", "2", "age", "myage", "100"); // t.getOneDataByRowKey("test-zty", "2"); //t.showAll("test"); } /*** * 创建一张表 * 并指定列簇 * */ public void createTable(String tableName,String cols[])throws Exception{ HBaseAdmin admin=new HBaseAdmin(conf);//客户端管理工具类 if(admin.tableExists(tableName)){ System.out.println("此表已经存在......."); }else{ HTableDescriptor table=new HTableDescriptor(tableName); for(String c:cols){ HColumnDescriptor col=new HColumnDescriptor(c);//列簇名 table.addFamily(col);//添加到此表中 } admin.createTable(table);//创建一个表 admin.close(); System.out.println("创建表成功!"); } } /** * 添加数据, * 建议使用批量添加 * @param tableName 表名 * @param row 行号 * @param columnFamily 列簇 * @param column 列 * @param value 具体的值 * * **/ public void insertRow(String tableName, String row, String columnFamily, String column, String value) throws Exception { HTable table = new HTable(conf, tableName); Put put = new Put(Bytes.toBytes(row)); // 参数出分别:列族、列、值 put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value)); table.put(put); table.close();//关闭 System.out.println("插入一条数据成功!"); } /** * 删除一条数据 * @param tableName 表名 * @param row rowkey * **/ public void deleteByRow(String tableName,String rowkey)throws Exception{ HTable h=new HTable(conf, tableName); Delete d=new Delete(Bytes.toBytes(rowkey)); h.delete(d);//删除一条数据 h.close(); } /** * 删除多条数据 * @param tableName 表名 * @param row rowkey * **/ public void deleteByRow(String tableName,String rowkey[])throws Exception{ HTable h=new HTable(conf, tableName); List<Delete> list=new ArrayList<Delete>(); for(String k:rowkey){ Delete d=new Delete(Bytes.toBytes(k)); list.add(d); } h.delete(list);//删除 h.close();//释放资源 } /** * 得到一条数据 * * @param tableName 表名 * @param rowkey 行号 * ***/ public void getOneDataByRowKey(String tableName,String rowkey)throws Exception{ HTable h=new HTable(conf, tableName); Get g=new Get(Bytes.toBytes(rowkey)); Result r=h.get(g); for(KeyValue k:r.raw()){ System.out.println("行号: "+Bytes.toStringBinary(k.getRow())); System.out.println("时间戳: "+k.getTimestamp()); System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily())); System.out.println("列: "+Bytes.toStringBinary(k.getQualifier())); //if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){ // System.out.println("值: "+Bytes.toInt(k.getValue())); //}else{ String ss= Bytes.toString(k.getValue()); System.out.println("值: "+ss); //} } h.close(); } /** * 扫描所有数据或特定数据 * @param tableName * **/ public void showAll(String tableName)throws Exception{ HTable h=new HTable(conf, tableName); Scan scan=new Scan(); //扫描特定区间 //Scan scan=new Scan(Bytes.toBytes("开始行号"),Bytes.toBytes("结束行号")); ResultScanner scanner=h.getScanner(scan); for(Result r:scanner){ System.out.println("=================================="); for(KeyValue k:r.raw()){ System.out.println("行号: "+Bytes.toStringBinary(k.getRow())); System.out.println("时间戳: "+k.getTimestamp()); System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily())); System.out.println("列: "+Bytes.toStringBinary(k.getQualifier())); //if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){ // System.out.println("值: "+Bytes.toInt(k.getValue())); //}else{ String ss= Bytes.toString(k.getValue()); System.out.println("值: "+ss); //} } } h.close(); } }
工程使用maven,其pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.codesolid</groupId> <artifactId>HelloJUnit</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-core</artifactId> <version>1.0.4</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase</artifactId> <version>0.94.5</version> </dependency> </dependencies> </project>
三、遇到的问题
This server is in the failed servers list: localhost/127.0.0.1:60718
出现该问题的原因是没有在服务端配置主机名和真实ip的映射,因此需要再/etc/hosts中加上10.1.102.104 ccf04(ccf04为服务器的主机名)
同时,需要在你跑程序的机器上添加ccf04的映射,我的是在windows上跑的java程序,需要修改windows的host文件,最后一行加入10.1.102.104 ccf04即可
时间: 2024-11-06 02:36:32