将上面代码打包后 放在hadoop上通过执行:bin/hadoop jar XX.jar 包.类执行的时候,报错如下:Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
错误原因: hadoop2 节点无法加载到hbase包
处理方式:将hbase jar拷贝到hadoop 节点上,比如 /usr/local/hbaselib
然后在 hadooop/etc/hadoop/hadoop-env.sh中 增加如下:
for f in /usr/local/hbaselib/*.jar; do
if [ "$HADOOP_CLASSPATH" ]; then
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f
else
export HADOOP_CLASSPATH=$f
fi
done
最后 可以在 hadoop/bin/mapred classpath下 查看是否已经将hbase lib 加载进来。
Java操作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.MasterNotRunningException;
- import org.apache.hadoop.hbase.ZooKeeperConnectionException;
- 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 {
- public static String TableName = “stu”;
- public static String RowKey = “m1”;
- public static String FamilyColumn1 = “base”;
- public static String FamilyColumn2 = “more”;
- /**
- * 1 创建表, 删除表 此时只涉及表名 列族名称
- * 2 表中新增记录,追加记录,删除记录 只有在表记录新增,查询时 才涉及rowkey
- * 3 表中查询记录
- * HBaseAdmin
- * HTable
- */
- public static void main(String[] args) throws Exception {
- // 0 创建配置信息
- Configuration conf = getConf();
- // 1 ddl语句
- ddl(conf,TableName,FamilyColumn1,FamilyColumn2);
- // 2 dml语句
- //dml(conf);
- }
- private static void dml(Configuration conf) throws IOException {
- // 1 创建dml操作类 HTable
- HTable hTable = new HTable(conf, TableName);
- // 2 指定新增记录操作类 Put 并初始化
- List<Put> puts = new ArrayList<Put>();
- Put put1 = new Put(Bytes.toBytes(RowKey)); // 指定行健是在Put上指定的
- put1.add(Bytes.toBytes(FamilyColumn1), Bytes.toBytes(“name”), Bytes.toBytes(“张三”));
- Put put2 = new Put(Bytes.toBytes(RowKey)); // 指定行健
- put2.add(Bytes.toBytes(FamilyColumn2), Bytes.toBytes(“age”), Bytes.toBytes(29));
- puts.add(put1);
- puts.add(put2);
- // 3 新增到hbase表中
- hTable.put(puts);
- // 4 查看记录:
- Get get = new Get(Bytes.toBytes(RowKey)); // 查询时 指定要查询的是那条记录—》根据rowkey确定
- Result result = hTable.get(get);
- System.out.println(result); // keyvalues={m1/f1:name/1419389290472/Put/vlen=6/ts=0, m1/f2:age/1419389290474/Put/vlen=4/ts=0}
- String nameVal = Bytes.toString(result.getValue(Bytes.toBytes(FamilyColumn1), Bytes.toBytes(“name”))); // 根据列族名和列名来查询对应value数值
- System.out.println(nameVal); // 打印出 : 张三
- int ageVal = Bytes.toInt(result.getValue(Bytes.toBytes(FamilyColumn2), Bytes.toBytes(“age”))); // 根据列族名和列名来查询对应value数值
- System.out.println(ageVal); // 打印出 :29
- }
- // 更细节的查询方式 scan
- private static void scan() throws IOException {
- final Configuration conf = getConf();
- final HTable hTable = new HTable(conf, TableName);
- //使用scan对象可以设定startRow、stopRow
- Scan scan = new Scan();
- //scan.addColumn(family, qualifier); 扫描时 详细扫描范围
- //scan.addFamily(family)
- //scan.setStartRow(startRow);
- //scan.setStopRow(stopRow);
- //scan.setFilter(filter);
- final ResultScanner scanner = hTable.getScanner(scan);
- //指定列簇、列
- //final ResultScanner scanner = hTable.getScanner(Bytes.toBytes(“f1”), Bytes.toBytes(“c1”));
- for (Result result : scanner) {
- System.out.println(result);
- }
- hTable.close();
- }
- private static void ddl(Configuration conf, String tableName, String…familyNames)
- throws MasterNotRunningException, ZooKeeperConnectionException,IOException {
- // 1 创建表
- HBaseAdmin hBaseAdmin = new HBaseAdmin(conf);
- HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
- // 1.1 给表增加列族
- for(String familyName : familyNames) {
- HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(familyName);
- hTableDescriptor.addFamily(hColumnDescriptor);
- }
- // 1.2 开始创建表
- if(!hBaseAdmin.tableExists(TableName)){
- hBaseAdmin.createTable(hTableDescriptor);
- }
- System.out.println(“创建后,表”+TableName+“是否存在: “ + hBaseAdmin.tableExists(TableName));
- // 2 更改表状态
- //hBaseAdmin.disableTable(TableName); // 停用此表 会输出: Started disable of myhbasetable Disabled myhbasetable
- //hBaseAdmin.enableTable(TableName); // 启动此表
- // 3 删除表
- //hBaseAdmin.deleteTable(TableName); // 删除表
- //System.out.println(“删除后,表”+TableName+”是否存在: ” + hBaseAdmin.tableExists(TableName));
- }
- /**
- * master在本地host配置为 : master 192.168.1.110
- * 搭建hbase 集群为:
- * h2master 192.168.1.110
- * h2sliver113 192.168.1.113
- * h2sliver114 192.168.1.114
- * hadoop单节点:
- * h2single 192.168.1.221
- * @return
- */
- private static Configuration getConf() {
- Configuration conf = HBaseConfiguration.create();
- conf.set(“hbase.rootdir”, “hdfs://h2single:9000/hbase”); // 指定hbase在hdfs的路径
- conf.set(“hbase.zookeeper.quorum”, “h2sliver113:2181”); // 指定zk集群 这里只写一个zk节点就可以了
- return conf;
- }
- }
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.MasterNotRunningException;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
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 {
public static String TableName = “stu”;
public static String RowKey = “m1”;
public static String FamilyColumn1 = “base”;
public static String FamilyColumn2 = “more”;
/**
* 1 创建表, 删除表 此时只涉及表名 列族名称
* 2 表中新增记录,追加记录,删除记录 只有在表记录新增,查询时 才涉及rowkey
* 3 表中查询记录
* HBaseAdmin
* HTable
*/
public static void main(String[] args) throws Exception {
// 0 创建配置信息
Configuration conf = getConf();
// 1 ddl语句
ddl(conf,TableName,FamilyColumn1,FamilyColumn2);
// 2 dml语句
//dml(conf);
}
private static void dml(Configuration conf) throws IOException {
// 1 创建dml操作类 HTable
HTable hTable = new HTable(conf, TableName);
// 2 指定新增记录操作类 Put 并初始化
List<Put> puts = new ArrayList<Put>();
Put put1 = new Put(Bytes.toBytes(RowKey)); // 指定行健是在Put上指定的
put1.add(Bytes.toBytes(FamilyColumn1), Bytes.toBytes(“name”), Bytes.toBytes(“张三”));
Put put2 = new Put(Bytes.toBytes(RowKey)); // 指定行健
put2.add(Bytes.toBytes(FamilyColumn2), Bytes.toBytes(“age”), Bytes.toBytes(29));
puts.add(put1);
puts.add(put2);
// 3 新增到hbase表中
hTable.put(puts);
// 4 查看记录:
Get get = new Get(Bytes.toBytes(RowKey)); // 查询时 指定要查询的是那条记录—》根据rowkey确定
Result result = hTable.get(get);
System.out.println(result); // keyvalues={m1/f1:name/1419389290472/Put/vlen=6/ts=0, m1/f2:age/1419389290474/Put/vlen=4/ts=0}
String nameVal = Bytes.toString(result.getValue(Bytes.toBytes(FamilyColumn1), Bytes.toBytes(“name”))); // 根据列族名和列名来查询对应value数值
System.out.println(nameVal); // 打印出 : 张三
int ageVal = Bytes.toInt(result.getValue(Bytes.toBytes(FamilyColumn2), Bytes.toBytes(“age”))); // 根据列族名和列名来查询对应value数值
System.out.println(ageVal); // 打印出 :29
}
// 更细节的查询方式 scan
private static void scan() throws IOException {
final Configuration conf = getConf();
final HTable hTable = new HTable(conf, TableName);
//使用scan对象可以设定startRow、stopRow
Scan scan = new Scan();
//scan.addColumn(family, qualifier); 扫描时 详细扫描范围
//scan.addFamily(family)
//scan.setStartRow(startRow);
//scan.setStopRow(stopRow);
//scan.setFilter(filter);
final ResultScanner scanner = hTable.getScanner(scan);
//指定列簇、列
//final ResultScanner scanner = hTable.getScanner(Bytes.toBytes(“f1”), Bytes.toBytes(“c1”));
for (Result result : scanner) {
System.out.println(result);
}
hTable.close();
}
private static void ddl(Configuration conf, String tableName, String…familyNames)
throws MasterNotRunningException, ZooKeeperConnectionException,IOException {
// 1 创建表
HBaseAdmin hBaseAdmin = new HBaseAdmin(conf);
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
// 1.1 给表增加列族
for(String familyName : familyNames) {
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(familyName);
hTableDescriptor.addFamily(hColumnDescriptor);
}
// 1.2 开始创建表
if(!hBaseAdmin.tableExists(TableName)){
hBaseAdmin.createTable(hTableDescriptor);
}
System.out.println(“创建后,表”+TableName+”是否存在: ” + hBaseAdmin.tableExists(TableName));
// 2 更改表状态
//hBaseAdmin.disableTable(TableName); // 停用此表 会输出: Started disable of myhbasetable Disabled myhbasetable
//hBaseAdmin.enableTable(TableName); // 启动此表
// 3 删除表
//hBaseAdmin.deleteTable(TableName); // 删除表
//System.out.println(“删除后,表”+TableName+”是否存在: ” + hBaseAdmin.tableExists(TableName));
}
/**
* master在本地host配置为 : master 192.168.1.110
* 搭建hbase 集群为:
* h2master 192.168.1.110
* h2sliver113 192.168.1.113
* h2sliver114 192.168.1.114
* hadoop单节点:
* h2single 192.168.1.221
* @return
*/
private static Configuration getConf() {
Configuration conf = HBaseConfiguration.create();
conf.set(“hbase.rootdir”, “hdfs://h2single:9000/hbase”); // 指定hbase在hdfs的路径
conf.set(“hbase.zookeeper.quorum”, “h2sliver113:2181”); // 指定zk集群 这里只写一个zk节点就可以了
return conf;
}
}
2 java操作hbase精简版代码:
- 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.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;
- public class HBaseTest1 {
- private static final String TABLE_NAME = “stu”;
- private static final String FAMILY_NAME = “f1”;
- private static final String COLUMN_NAME = “name”;
- private static final String COLUMN_AGE = “age”;
- private static final String ROW_KEY1 = “r1”;
- private static final String ROW_KEY2 = “r2”;
- public static void main(String[] args) throws Exception {
- //构造能够访问HBase的configuration对象
- Configuration conf = HBaseConfiguration.create();
- conf.set(“hbase.rootdir”, “hdfs://h2single:9000/hbase”);
- conf.set(“hbase.zookeeper.quorum”, “h2sliver113:2181”);
- //HBaseAdmin是对HBase进行ddl操作的核心类
- HBaseAdmin hBaseAdmin = new HBaseAdmin(conf);
- if(!hBaseAdmin.tableExists(TABLE_NAME)){
- HTableDescriptor htableDescriptor = new HTableDescriptor(TABLE_NAME);
- htableDescriptor.addFamily(new HColumnDescriptor(FAMILY_NAME));
- hBaseAdmin.createTable(htableDescriptor);
- System.out.println(“table create success”);
- }else{
- System.out.println(“table exists”);
- }
- //使用HTable可以对HBase的表中的数据进行增删改查
- HTable hTable = new HTable(conf, TABLE_NAME);
- // 增加数据
- List<Put> putList = new ArrayList<Put>();
- Put put1 = new Put(ROW_KEY1.getBytes());
- put1.add(FAMILY_NAME.getBytes(), COLUMN_NAME.getBytes(), “zhangsan”.getBytes());
- put1.add(FAMILY_NAME.getBytes(), COLUMN_AGE.getBytes(), “23”.getBytes());
- putList.add(put1);
- Put put2 = new Put(ROW_KEY2.getBytes());
- put2.add(FAMILY_NAME.getBytes(), COLUMN_NAME.getBytes(), “lisi”.getBytes());
- put2.add(FAMILY_NAME.getBytes(), COLUMN_AGE.getBytes(), “24”.getBytes());
- putList.add(put2);
- hTable.put(putList);
- // 根据rowkey得到记录后 获取此记录对应的列信息
- Get get = new Get(ROW_KEY1.getBytes());
- Result get1 = hTable.get(get);
- String name1 = new String(get1.getValue(FAMILY_NAME.getBytes(), COLUMN_NAME.getBytes()));
- String age1 = new String(get1.getValue(FAMILY_NAME.getBytes(), COLUMN_AGE.getBytes()));
- //System.out.println(get1+”\t”+name1+”\t”+age1);
- // 指定行范围来查询多条记录
- Scan scan = new Scan();
- scan.setStartRow(ROW_KEY1.getBytes());
- scan.setStopRow(ROW_KEY2.getBytes());
- ResultScanner scanner = hTable.getScanner(scan);
- for (Result result : scanner) {
- String rowKey = new String(result.getRow());
- String name = new String(result.getValue(FAMILY_NAME.getBytes(), COLUMN_NAME.getBytes()));
- String age = new String(result.getValue(FAMILY_NAME.getBytes(), COLUMN_AGE.getBytes()));
- System.out.println(rowKey+“\t”+name+“\t”+age1);
- }
- // 根据rowkey删除记录
- Delete delete = new Delete(ROW_KEY1.getBytes());
- hTable.delete(delete);
- // 删除表
- hBaseAdmin.disableTable(TABLE_NAME);
- hBaseAdmin.deleteTable(TABLE_NAME);
- }
- }
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.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;
public class HBaseTest1 {
private static final String TABLE_NAME = “stu”;
private static final String FAMILY_NAME = “f1”;
private static final String COLUMN_NAME = “name”;
private static final String COLUMN_AGE = “age”;
private static final String ROW_KEY1 = “r1”;
private static final String ROW_KEY2 = “r2”;
public static void main(String[] args) throws Exception {
//构造能够访问HBase的configuration对象
Configuration conf = HBaseConfiguration.create();
conf.set(“hbase.rootdir”, “hdfs://h2single:9000/hbase”);
conf.set(“hbase.zookeeper.quorum”, “h2sliver113:2181”);
//HBaseAdmin是对HBase进行ddl操作的核心类
HBaseAdmin hBaseAdmin = new HBaseAdmin(conf);
if(!hBaseAdmin.tableExists(TABLE_NAME)){
HTableDescriptor htableDescriptor = new HTableDescriptor(TABLE_NAME);
htableDescriptor.addFamily(new HColumnDescriptor(FAMILY_NAME));
hBaseAdmin.createTable(htableDescriptor);
System.out.println(“table create success”);
}else{
System.out.println(“table exists”);
}
//使用HTable可以对HBase的表中的数据进行增删改查
HTable hTable = new HTable(conf, TABLE_NAME);
// 增加数据
List<Put> putList = new ArrayList<Put>();
Put put1 = new Put(ROW_KEY1.getBytes());
put1.add(FAMILY_NAME.getBytes(), COLUMN_NAME.getBytes(), “zhangsan”.getBytes());
put1.add(FAMILY_NAME.getBytes(), COLUMN_AGE.getBytes(), “23”.getBytes());
putList.add(put1);
Put put2 = new Put(ROW_KEY2.getBytes());
put2.add(FAMILY_NAME.getBytes(), COLUMN_NAME.getBytes(), “lisi”.getBytes());
put2.add(FAMILY_NAME.getBytes(), COLUMN_AGE.getBytes(), “24”.getBytes());
putList.add(put2);
hTable.put(putList);
// 根据rowkey得到记录后 获取此记录对应的列信息
Get get = new Get(ROW_KEY1.getBytes());
Result get1 = hTable.get(get);
String name1 = new String(get1.getValue(FAMILY_NAME.getBytes(), COLUMN_NAME.getBytes()));
String age1 = new String(get1.getValue(FAMILY_NAME.getBytes(), COLUMN_AGE.getBytes()));
//System.out.println(get1+”\t”+name1+”\t”+age1);
// 指定行范围来查询多条记录
Scan scan = new Scan();
scan.setStartRow(ROW_KEY1.getBytes());
scan.setStopRow(ROW_KEY2.getBytes());
ResultScanner scanner = hTable.getScanner(scan);
for (Result result : scanner) {
String rowKey = new String(result.getRow());
String name = new String(result.getValue(FAMILY_NAME.getBytes(), COLUMN_NAME.getBytes()));
String age = new String(result.getValue(FAMILY_NAME.getBytes(), COLUMN_AGE.getBytes()));
System.out.println(rowKey+”\t”+name+”\t”+age1);
}
// 根据rowkey删除记录
Delete delete = new Delete(ROW_KEY1.getBytes());
hTable.delete(delete);
// 删除表
hBaseAdmin.disableTable(TABLE_NAME);
hBaseAdmin.deleteTable(TABLE_NAME);
}
}
3 在 hbase + hadoop2 + zk 构建的集群的时候注意事项:
hbase: h2master主 h2sliver113 从 h2sliver114从
hadoop: h2single
zookeeper: h2master h2sliver113 h2sliver114