从hadoop取出文件写入hbase表中

本文介绍了一个使用MapReduce将文件数据导入HBase的具体示例。该示例通过定义特定的Mapper和Reducer来处理文件输入,并将其转换为适合HBase的数据格式。Mapper负责读取文件并写入临时数据,而Reducer则将这些数据聚合并插入到HBase表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

package example2;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

//Administrator
public class ImportFromFileExample {
	
	public static class ImportMapper extends Mapper<LongWritable, Text, ImmutableBytesWritable,Text >{
		
		
		@Override
		protected void map(LongWritable key, Text value, Context context)
				throws IOException, InterruptedException {
			context.write(new ImmutableBytesWritable(Bytes.toBytes(key.get())), value);
		}

		
	}
	
	public static class Reducer1 extends TableReducer<ImmutableBytesWritable, Text, ImmutableBytesWritable> {
		private byte[] family=null;
		private byte[]qualifier=null;
		

		@Override
		protected void setup(Context context) throws IOException,
				InterruptedException {
			String column=context.getConfiguration().get("conf.column");
			byte[][]colkey=KeyValue.parseColumn(Bytes.toBytes(column));
			family=colkey[0];
			if(colkey.length>1){
				qualifier=colkey[1];
			}
		}
		
        public void reduce(ImmutableBytesWritable key, Iterable<Text> values, Context context)
                throws IOException, InterruptedException {
        	String valueCon=null;
        	for(Text text:values){
        		valueCon+=text.toString();
        	}
            Put put = new Put(key.get());
            put.add(family, qualifier, Bytes.toBytes(valueCon));
            context.write(key, put);
        }
    }

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception {
		Configuration conf=HBaseConfiguration.create();
		String []argArray=new GenericOptionsParser(conf, args).getRemainingArgs();
		if(argArray.length!=1){
			System.exit(1);
		}
		conf.set("conf.column", "family1:text");
		Job job=new Job(conf,"import from hdfs to hbase");
		job.setJarByClass(ImportFromFileExample.class);
		job.setMapperClass(ImportMapper.class);
		job.setOutputFormatClass(TableOutputFormat.class);
		job.getConfiguration().set(TableOutputFormat.OUTPUT_TABLE, "testtable");
		job.setMapOutputKeyClass(ImmutableBytesWritable.class);
		job.setMapOutputValueClass(Text.class);
		job.setOutputKeyClass(ImmutableBytesWritable.class);
		job.setOutputValueClass(Put.class);
		TableMapReduceUtil.initTableReducerJob("testtable", Reducer1.class, job);
		FileInputFormat.addInputPaths(job, argArray[0]);
		System.exit(job.waitForCompletion(true) ? 0 : 1);

	}

}

 

<think>我们已知用户意图是使用Java进行HBase的读写操作。根据引用内容,我们可以总结出以下步骤: 1. 配置HBase连接信息,包括ZooKeeper的地址(hbase.zookeeper.quorum)。 2. 创建Connection对象,通过ConnectionFactory。 3. 通过Connection对象获取Admin对象(用于管理)和Table对象(用于数据操作)。 4. 进行的创建(如果需要)、删除等管理操作(使用Admin)。 5. 进行数据的增删改查(使用Table对象)。 注意:在操作前需要确保HBase服务已经启动,并且Hadoop集群正常运行(如果HBase是分布式模式)。 具体步骤: 一、环境准备 1. 添加Maven依赖(以HBase 1.4.13为例,版本需与服务器版本匹配): ```xml <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.4.13</version> </dependency> ``` 二、Java操作HBase 1. 创建(使用Admin): - 创建Configuration对象,设置ZooKeeper地址。 - 创建Connection对象。 - 获取Admin对象。 - 使用Admin创建,需要指定名和列族。 2. 插入数据(使用Table): - 创建Put对象,指定行键(row key)。 - 向Put对象添加列(列族、列限定符、值)。 - 通过Table对象执行put操作。 3. 查询数据(使用Table): - 创建Get对象,指定要获取的行键。 - 通过Table对象执行get操作,得到Result对象。 - 从Result对象中解析出各个列的值。 4. 删除数据(使用Table): - 创建Delete对象,指定要删除的行键(或进一步指定列族和列)。 - 通过Table对象执行delete操作。 5. 关闭资源:关闭Table和Connection。 下面给出具体代码示例。 注意:在代码中,我们使用try-with-resources确保资源关闭,或者使用finally块手动关闭。 示例代码: 1. 创建: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.client.TableDescriptorBuilder; import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor; import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder; public class HBaseCreateTable { public static void main(String[] args) throws Exception { // 1. 创建配置对象并设置ZooKeeper地址 Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "master"); // 使用主机名或IP,如192.168.28.130 // 2. 创建连接 try (Connection connection = ConnectionFactory.createConnection(config); Admin admin = connection.getAdmin()) { // 3. 定义名和列族 TableName tableName = TableName.valueOf("test_table"); ColumnFamilyDescriptor familyDescriptor = ColumnFamilyDescriptorBuilder.newBuilder("cf".getBytes()).build(); TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(tableName) .setColumnFamily(familyDescriptor) .build(); // 4. 创建(如果不存在) if (!admin.tableExists(tableName)) { admin.createTable(tableDescriptor); System.out.println("创建成功!"); } else { System.out.println("已存在!"); } } } } ``` 2. 插入数据: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.util.Bytes; public class HBasePutData { public static void main(String[] args) throws Exception { Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "master"); try (Connection connection = ConnectionFactory.createConnection(config); Table table = connection.getTable(TableName.valueOf("test_table"))) { // 创建Put对象,指定行键 Put put = new Put(Bytes.toBytes("row1")); // 添加列:列族cf,列名name,值jack put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("name"), Bytes.toBytes("jack")); // 添加列:列族cf,列名age,值25 put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("age"), Bytes.toBytes("25")); // 插入数据 table.put(put); System.out.println("数据插入成功!"); } } } ``` 3. 查询数据: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.util.Bytes; public class HBaseGetData { public static void main(String[] args) throws Exception { Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "master"); try (Connection connection = ConnectionFactory.createConnection(config); Table table = connection.getTable(TableName.valueOf("test_table"))) { Get get = new Get(Bytes.toBytes("row1")); Result result = table.get(get); // 从结果中取出各列的值 byte[] nameValue = result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("name")); byte[] ageValue = result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("age")); System.out.println("name: " + Bytes.toString(nameValue)); System.out.println("age: " + Bytes.toString(ageValue)); } } } ``` 4. 删除数据(删除整行): ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.util.Bytes; public class HBaseDeleteData { public static void main(String[] args) throws Exception { Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "master"); try (Connection connection = ConnectionFactory.createConnection(config); Table table = connection.getTable(TableName.valueOf("test_table"))) { Delete delete = new Delete(Bytes.toBytes("row1")); table.delete(delete); System.out.println("数据删除成功!"); } } } ``` 注意事项: - 实际应用中,需要根据HBase集群的配置调整连接参数(如ZooKeeper地址、端口等)。 - 操作完成后务必关闭资源(Connection、Table等),避免资源泄露。 - HBase的版本与客户端依赖版本需一致,否则可能出现兼容性问题。 以上代码示例展示了使用Java API进行HBase的基本操作。用户可以根据实际需求扩展。 根据引用[5],我们还可以使用Admin进行的禁用、删除等操作,但要注意这些操作会直接影响结构,需谨慎使用。 如果用户需要更复杂的操作,如扫描(Scan)、过滤器(Filter)等,可以参考HBase官方文档。 最后,请确保HBase服务正常运行,且网络可访问。 相关问题: 1. 如何配置HBase的Java客户端连接参数? 2. 如何使用Java API进行HBase的扫描(Scan)操作? 3. HBase的过滤器(Filter)有哪些常见类型?如何使用? 4. 如何批量操作HBase(如批量插入、批量删除)? 5. HBase的版本控制机制在Java API中如何体现?</think>### Java实现HBase读写操作 在Java中操作HBase需要以下核心步骤: #### 1. **环境配置** ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.*; // 创建HBase配置对象 Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "192.168.28.130"); // ZK集群地址 config.set("hbase.zookeeper.property.clientPort", "2181"); // ZK端口 ``` #### 2. **创建** ```java try (Connection conn = ConnectionFactory.createConnection(config); Admin admin = conn.getAdmin()) { TableName tableName = TableName.valueOf("user"); TableDescriptorBuilder tableDesc = TableDescriptorBuilder.newBuilder(tableName); // 添加列族 ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder("info".getBytes()).build(); tableDesc.setColumnFamily(family); // 创建 if (!admin.tableExists(tableName)) { admin.createTable(tableDesc.build()); System.out.println("创建成功"); } } // 自动关闭资源 ``` #### 3. **写入数据** ```java try (Connection conn = ConnectionFactory.createConnection(config); Table table = conn.getTable(TableName.valueOf("user"))) { Put put = new Put(Bytes.toBytes("row1")); // 行键 put.addColumn( Bytes.toBytes("info"), // 列族 Bytes.toBytes("name"), // 列限定符 Bytes.toBytes("张三") // 值 ); put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"), Bytes.toBytes("28")); table.put(put); // 执行写入 System.out.println("数据写入成功"); } ``` #### 4. **读取数据** ```java try (Connection conn = ConnectionFactory.createConnection(config); Table table = conn.getTable(TableName.valueOf("user"))) { Get get = new Get(Bytes.toBytes("row1")); // 指定行键 Result result = table.get(get); // 解析数据 byte[] name = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("name")); byte[] age = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("age")); System.out.println("姓名: " + Bytes.toString(name)); System.out.println("年龄: " + Bytes.toString(age)); } ``` #### 5. **删除数据** ```java try (Table table = conn.getTable(TableName.valueOf("user"))) { Delete delete = new Delete(Bytes.toBytes("row1")); table.delete(delete); // 删除整行 } ``` ### 关键说明 1. **连接管理** - 使用`ConnectionFactory`创建连接,避免频繁创建销毁(连接是线程安全的) - 通过`try-with-resources`自动关闭资源(JDK7+特性) 2. **数据编码** - 所有字符串需转换为字节数组:`Bytes.toBytes("text")` - 数值类型建议转为字符串再编码 3. **性能优化** - 批量写入使用`table.put(List<Put>)` - 读取大量数据使用`Scan`+`ResultScanner` 4. **依赖配置** Maven依赖示例(版本需匹配HBase服务器): ```xml <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.4.8</version> </dependency> ``` > **注意**:操作前确保HBase服务已启动,且客户端配置的ZK地址与服务器一致[^4][^5]。 --- ### 相关问题 1. HBase的`Put`和`Delete`操作如何实现原子性? 2. 使用Java API扫描HBase数据的最佳实践是什么? 3. HBase如何通过协处理器(Coprocessor)实现二级索引? 4. 如何优化HBase的批量写入(Batch Write)性能? 5. HBase的`WAL`(Write-Ahead Log)机制在Java API中如何配置?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值