HBase-1.0.1.1的Java API使用记录

2 篇文章 0 订阅
1 篇文章 0 订阅

最近项目中使用了HBase作为数据记录,这里简单记录一下使用的Java API,网上很多API都是比较早期的,现在已经属于过时了,所以在这里总结一下。

1. 首先是Configuration类,这个配置类来自org.apache.hadoop.conf.Configuration,首先要初始化它,这是一个重量级操作。Connection接口,来自org.apache.hadoop.hbase.client.Connection,获得这个Connection的一个实例,需要使用ConnectionFactory.createConnection(conf); 创建这个Connection的实现类也是个重量级操作,因此,可以对它进行保留,以备下次使用这个连接类来获取Table实例。得到一个Table实例,可以使用这个方法:Table getTable(TableName tableName) throws IOException; 注意,Connection是线程安全的,而Table不是线程安全的,而且在新版API中,Connection不需要自己创建线程池来管理连接或HTable表池,这些源码里已经帮我们做好了。

下面是实现上述操作的代码:

package com.cyber_space.HBaseManager;

import java.io.IOException;

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.Table;

import com.cyber_space.util.Log;
import com.cyber_space.util.properties.HBaseProperties;
import com.cyber_space.util.properties.SysProperties;

public class HBaseUtil {
	private static Configuration conf;
	private static Connection hConnection;
	static {
		conf = HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum",
				HBaseProperties.getValue("hbase.zookeeper.quorum"));
		conf.set("hbase.zookeeper.property.clientPort",
				HBaseProperties.getValue("hbase.zookeeper.property.clientPort"));
		conf.set("hbase.rpc.protection",
				HBaseProperties.getValue("hbase.rpc.protection"));
		System.setProperty("hadoop.home.dir",
				SysProperties.getValue("hadoop_home"));
		try {
			hConnection = ConnectionFactory.createConnection(conf);
		} catch (IOException e) {
			e.printStackTrace();
			Log.logException(e);
		}
	}

	public Configuration getConf() {
		return conf;
	}

	public static Table getHTable(String tableName) throws IOException {
		return hConnection.getTable(TableName.valueOf(tableName));
	}
}

2.下面是得到数据表后,对表的一些操作,比较简单。参数row代表行键,family代表列族,qualifier代表列名,value是要对列增加的值。这里还要注意一下,这里批量添加数据的方法并不是事务的。

package com.cyber_space.HBaseManager;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

public class FileHTable {
	private Table mTable;

	public FileHTable(String tableName) throws IOException {
		this.mTable = HBaseUtil.getHTable(tableName);
	}

	/**
	 * 添加一行记录
	 * @param row
	 * @param familiy
	 * @param qualifier
	 * @param value
	 * @throws IOException
	 */
	public void putData(String row, String familiy, String qualifier,
			String value) throws IOException {
		Put put = new Put(Bytes.toBytes(row));
		put.addColumn(Bytes.toBytes(familiy), Bytes.toBytes(qualifier),
				Bytes.toBytes(value));
		mTable.put(put);
	}

	/**
	 * 添加多行记录
	 * @param row
	 * @param family
	 * @param map
	 * @throws Exception
	 */
	public void putData(String row, String family, Map<String, String> map)
			throws Exception {
		if (row == null || row.equals("") || family == null
				|| family.equals("") || map == null)
			throw new Exception("null exists in the arguments");
		List<Put> putList = new ArrayList<Put>();
		for (Map.Entry<String, String> item : map.entrySet()) {
			String qualifier = item.getKey();
			String value = item.getValue();
			Put put = new Put(Bytes.toBytes(row));
			put.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier),
					Bytes.toBytes(value));
			putList.add(put);
		}
		mTable.put(putList);
	}
	
	/**
	 * 删除一行数据
	 * @param row
	 * @throws IOException
	 */
	public void deleteData(String row) throws IOException {
		Delete delete = new Delete(Bytes.toBytes(row));
		mTable.delete(delete);
	}

    /**
     * 添加单个数据
     * 
     * @param row
     * @param family
     * @param qualifier
     * @param value
     * @throws IOException
     */
    public void setData(String row, String family, String qualifier,
            String value) throws IOException {
        Put put = new Put(Bytes.toBytes(row));
        put.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier),
                Bytes.toBytes(value));
        mTable.put(put);
    }

    /**
     * 添加多个数据
     * 
     * @param row
     * @param family
     * @param items
     * @throws IOException
     */
    public void setData(String row, String family, Map<String, String> items)
            throws IOException {
        if (row == null || row.equals("") || family == null
                || family.equals("") || items == null || items.size() < 0)
            throw new NullPointerException("argument exist null or ''");
        List<Put> putList = new ArrayList<Put>();
        for (Map.Entry<String, String> item : items.entrySet()) {
            String qualifier = item.getKey();
            String value = item.getValue();
            Put put = new Put(Bytes.toBytes(row));
            put.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier),
                    Bytes.toBytes(value));
            putList.add(put);
        }
        mTable.put(putList);
    }


        public void close() throws IOException {
		if (mTable != null) {
			mTable.close();
		}
	}
}



### 回答1: rtmpdump是一个开源的命令行工具,用于从流媒体服务器上下载或录制RTMP流(Real-Time Messaging Protocol)。vc工程是指使用VC++编写的工程项目。将两者结合起来,意味着在VC++环境下使用rtmpdump工具进行流媒体下载或录制。 要在VC++中使用rtmpdump工具,首先需要下载并安装rtmpdump源代码。然后在VC++项目中添加rtmpdump的相关文件,并在代码中引用相关的头文件。接下来,就可以使用rtmpdump提供的函数来实现对RTMP流的下载或录制。 具体而言,可以使用rtmpdump的rtmpdump()函数指定要下载或录制的RTMP流的URL,并设置保存的文件路径。通过调用该函数,rtmpdump将连接到流媒体服务器并获取流媒体数据,并将其写入指定的文件中。在下载或录制过程中,还可以使用rtmpdump的其他函数来处理数据流,例如解密、分段等操作。 在VC++中使用rtmpdump工程可以为流媒体下载或录制提供更灵活和定制化的功能。通过使用VC++的编程特性,可以进行更高级的数据处理和界面设计,实现更复杂的功能需求。同时,rtmpdump的开源性质也使得用户能够根据自己的需求对其进行修改和扩展。 总之,通过在VC++中使用rtmpdump工程,可以方便地实现对RTMP流的下载或录制,并根据需要进行定制化的功能扩展。这为开发者提供了更大的灵活性和自由度,以满足不同的流媒体处理需求。 ### 回答2: rtmpdump是一款用于从RTMP流媒体服务器下载或录制音频/视频内容的开源工具。vc工程是指使用Visual C++编程语言和开发环境创建的软件项目。 要创建一个rtmpdump的vc工程,首先需要下载rtmpdump的源代码,然后使用Visual C++打开相应的工程文件。接下来需要配置工程的编译环境,确保所需的头文件和库文件路径正确。 在工程中,会有一些源代码文件,这些文件负责实现rtmpdump的各种功能,例如建立与RTMP服务器的连接、发送请求、接收数据、数据解析等等。这些文件会被编译成可执行的二进制文件。 在编译期间可能会遇到一些依赖项问题,例如需要额外链接一些库文件以支持某些功能。开发人员需要根据编译过程中的错误信息,对工程进行适当的配置和调整,以确保成功编译。 一旦vc工程成功编译完成,就可以生成一个可执行文件,该文件可以在命令行中运行。通过指定RTMP服务器的URL和相关参数,可以让rtmpdump工具连接到服务器并下载或录制所需的音频/视频内容。 总的来说,创建一个rtmpdump的vc工程需要下载源代码、配置编译环境、解决依赖项问题,并根据需要添加自定义功能。通过编译和运行工程生成的可执行文件,就能实现从RTMP流媒体服务器下载或录制音频/视频内容的操作。 ### 回答3: rtmpdump是一个用于下载和保存RTMP流的工具。它提供了用于处理RTMP协议的源代码,可以自定义编译和构建,获得一个可以在不同平台上运行的RTMP下载工具。 RTMP是一种用于流媒体传输的协议,它是Adobe公司开发的一种实时通信协议,常用于视频直播、在线游戏和音频通信等领域。rtmpdump工具可以连接到RTMP服务器,读取和接收RTMP流,并将其保存为本地文件。 vc工程是指使用Visual C++编译器创建的工程。通过将rtmpdump的源代码加入到Visual C++工程中,我们可以使用VC++的功能和特性来构建和调试rtmpdump工具。这样,我们就可以根据自己的需求进行修改和定制,使其能够更好地满足我们的需求。 在vc工程中,我们可以使用rtmpdump的源代码来构建一个命令行界面的工具,以便用户可以通过命令行输入相关参数来下载RTMP流。我们可以利用Visual C++的调试功能来排查和修复可能存在的问题,提高工具的稳定性和性能。 除了在vc工程中进行开发和调试,rtmpdump还可以在不同的平台上进行编译和构建,如Linux、Mac和Android等。这使得rtmpdump工具具有更广泛的适用性和可移植性。 总结来说,rtmpdump vc工程是指使用Visual C++编译器创建的工程,并集成了rtmpdump的源代码,使其能够在Windows平台上运行和定制化,从而实现对RTMP流进行下载和保存的功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值