我有一组需要索引的200M文档.每个文档都有一个自由文本和一组额外的稀疏元数据信息(100多列).
似乎自由文本索引的正确工具是Lucene,而结构化稀疏元数据的正确工具是HBase.
我需要查询数据并在自由文本搜索结果和结构化数据结果之间加入(例如,在其文本中获得所有具有短语"早安"的书籍于1980年首次发布).
我应该查看哪些工具/机制来加入结构化和未经检查的查询?结果可能包括数百万条记录(加入前后)
谢谢萨尔
我正在尝试以编程方式创建HFiles并将它们加载到正在运行的HBase实例中.我发现很多信息的HFileOutputFormat,并在LoadIncrementalHFiles
我设法创建了新的HFile,将其发送到集群.在群集Web界面中,将显示新的存储文件,但新的键范围不可用.
InputStream stream = ProgrammaticHFileGeneration.class.getResourceAsStream("ga-hourly.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
String line = null;
Map<byte[], String> rowValues = new HashMap<byte[], String>();
while((line = reader.readLine())!=null) {
String[] vals = line.split(",");
String row = new StringBuilder(vals[0]).append(".").append(vals[1]).append(".").append(vals[2]).append(".").append(vals[3]).toString();
rowValues.put(row.getBytes(), line);
}
List<byte[]> keys = new ArrayList<byte[]>(rowValues.keySet());
Collections.sort(keys, byteArrComparator);
HBaseTestingUtility testingUtility = new HBaseTestingUtility();
testingUtility.startMiniCluster();
testingUtility.createTable("table".getBytes(), "data".getBytes());
Writer writer = new HFile.Writer(testingUtility.getTestFileSystem(),
new Path("/tmp/hfiles/data/hfile"),
HFile.DEFAULT_BLOCKSIZE, Compression.Algorithm.NONE, KeyValue.KEY_COMPARATOR);
for(byte[] key:keys) {
writer.append(new KeyValue(key, "data".getBytes(), "d".getBytes(), rowValues.get(key).getBytes()));
}
writer.appendFileInfo(StoreFile.BULKLOAD_TIME_KEY, Bytes.toBytes(System.currentTimeMillis()));
writer.appendFileInfo(StoreFile.MAJOR_COMPACTION_KEY, Bytes.toBytes(true)); …Run Code Online (Sandbox Code Playgroud) 我在伪分布式模式下使用CDH4,我在使用HBase和Pig时遇到了一些麻烦(但两者都很好).
我正在一步一步地遵循这个很好的教程:http: //blog.whitepages.com/2011/10/27/hbase-storage-and-pig/
所以我的Pig脚本看起来像这样
register /usr/lib/zookeeper/zookeeper-3.4.3-cdh4.1.2.jar
register /usr/lib/hbase/hbase-0.92.1-cdh4.1.2-security.jar
register /usr/lib/hbase/lib/guava-11.0.2.jar
raw_data = LOAD 'input.csv' USING PigStorage( ',' ) AS (
listing_id: chararray,
fname: chararray,
lname: chararray );
STORE raw_data INTO 'hbase://sample_names' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage ('info:fname info:lname');
Run Code Online (Sandbox Code Playgroud)
但是在输入以下命令时
pig -x local hbase_sample.pig
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息
ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2998: Unhandled internal error. org/apache/hadoop/hbase/filter/Filter
Run Code Online (Sandbox Code Playgroud)
我在网上找到的主要原因是类路径,所以这里是当前配置的列表,也许你在我的配置中发现了一些废话:
export HADOOP_HOME=/usr/lib/hadoop
export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce
export HADOOP_CONF_DIR=/etc/hadoop/conf
export HBASE_HOME=/usr/lib/hbase
export HBASE_CONF_DIR=/etc/hbase/conf
export PIG_HOME=/usr/lib/pig
export PIG_CONF_DIR=/etc/pig/conf
export PATH="$HADOOP_HOME/bin:$HBASE_HOME/bin:$HADOOP_MAPRED_HOME/bin:$PIG_HOME/bin:$PATH"
export HADOOP_CLASSPATH="$HBASE_HOME/bin"
export PIG_CLASSPATH="$HBASE_HOME/bin:$PIG_HOME/bin"
Run Code Online (Sandbox Code Playgroud)
如果您需要更多详细信息,请参阅完整的猪堆栈跟踪:
Pig Stack Trace
---------------
ERROR 2998: …Run Code Online (Sandbox Code Playgroud) 所以我试图使用自定义jar在Amazon ec2上查询我的hbase集群,我将其作为MapReduce步骤启动.我的jar(在map函数内)我将Hbase称为:
public void map( Text key, BytesWritable value, Context contex ) throws IOException, InterruptedException {
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, "tablename");
...
Run Code Online (Sandbox Code Playgroud)
问题是,当它到达HTable线并尝试连接到hbase时,步骤失败,我得到以下错误:
2014-02-28 18:00:49,936 INFO [main] org.apache.zookeeper.ZooKeeper: Initiating client connection, connectString=localhost:2181 sessionTimeout=180000 watcher=hconnection
2014-02-28 18:00:49,974 INFO [main] org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper: The identifier of this process is 5119@ip-10-0-35-130.ec2.internal
2014-02-28 18:00:49,998 INFO [main-SendThread(localhost:2181)] org.apache.zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2014-02-28 18:00:50,005 WARN [main-SendThread(localhost:2181)] org.apache.zookeeper.ClientCnxn: Session 0x0 for server …Run Code Online (Sandbox Code Playgroud) hadoop hbase amazon-web-services elastic-map-reduce apache-zookeeper
根据我的要求,我需要在Hbase中获取特定行的第一个版本.假设以下Htable:
row_key cf1:c1 timestamp
----------------------------------------
1 x t1
1 x t2
1 x t3
...
Run Code Online (Sandbox Code Playgroud)
假设我想根据时间戳检索第一个版本的row(1).首先,为此目的是否有任何hbase java方法?第二,如果没有这样的方法,我可以通过获取行(1)的最后版本来将时间戳的排序顺序更改为DESC以检索此类单元吗?对hbase的时间戳排序进行此更改有什么顾虑?
我为我的测试类启动了一个Hbase集群.我使用那个助手类:
并使用它像:
private static final HBaseClusterSingleton cluster = HBaseClusterSingleton.build(1);
Run Code Online (Sandbox Code Playgroud)
我按如下方式检索配置对象:
cluster.getConf()
Run Code Online (Sandbox Code Playgroud)
我在Spark上使用它如下:
sparkContext.newAPIHadoopRDD(conf, MyInputFormat.class, clazzK,
clazzV);
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,不需要启动Hbase集群,因为Spark将连接到我的虚拟集群.但是,当我运行我的测试方法时,它会抛出一个错误:
2015-08-26 01:19:59,558 INFO [执行任务启动worker-0-SendThread(localhost:2181)] zookeeper.ClientCnxn(ClientCnxn.java:logStartConnect(966)) - 打开到服务器localhost/127.0.0.1的套接字连接:2181.不会尝试使用SASL进行身份验证(未知错误)
2015-08-26 01:19:59,559 WARN [执行任务启动worker-0-SendThread(localhost:2181)] zookeeper.ClientCnxn(ClientCnxn.java:run(1089)) - 服务器空的会话0x0,意外错误,关闭套接字连接并尝试重新连接 java.net.ConnectException: 在org.apache.zookeeper的sun.nio.ch.SocketChannelImpl.finckConnect(SocketChannelImpl.java:739)的sun.nio.ch.SocketChannelImpl.checkConnect(本地方法)中拒绝连接 .ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:350)at org.apache.zookeeper.ClientCnxn $ SendThread.run(ClientCnxn.java:1068)
不在Spark上运行的Hbase测试运行良好.当我检查日志时,我看到群集和Spark正确启动:
2015-08-26 01:35:21,791 INFO [main] hdfs.MiniDFSCluster(MiniDFSCluster.java:waitActive(2055)) - 群集处于活动状态
2015-08-26 01:35:40,334 INFO [main] util.Utils(Logging.scala:logInfo(59)) - 在端口56941上成功启动了服务'sparkDriver'.
我意识到当我从命令行启动一个hbase时,我的Spark测试方法会连接到它!
那么,这是否意味着它不关心我传递给它的conf?关于如何解决它的任何想法?
我创建了下表:
CREATE TABLE IF NOT EXISTS "events" (
"product.name" VARCHAR(32),
"event.name" VARCHAR(32),
"event.uuid" VARCHAR(32),
CONSTRAINT pk PRIMARY KEY ("event.uuid")
)
Run Code Online (Sandbox Code Playgroud)
插入活动:
upsert into "events" ("event.uuid", "event.name", "product.name") values('1', 'click', 'api')
Run Code Online (Sandbox Code Playgroud)
从HBase shell获取数据:
hbase(main):020:0> scan 'events'
ROW COLUMN+CELL
1 column=0:_0, timestamp=1449417795078, value=
1 column=0:event.name, timestamp=1449417795078, value=click
1 column=0:product.name, timestamp=1449417795078, value=api
1 row(s) in 0.0200 seconds
Run Code Online (Sandbox Code Playgroud)
没有列的家庭;-(
从HBase shell,尝试插入数据:
hbase(main):021:0> put 'events', '2', 'event:name','buy'
ERROR: Unknown column family! Valid column names: 0:*
Run Code Online (Sandbox Code Playgroud)
为什么?
我正在使用hbase的本机API编写Hbase Java客户端.
我可以使用我创建的Hbase客户端连接到hbase并运行各种查询.我使用"hbase classpath"命令运行我的hbase客户端.这解决了所有依赖项.
现在我们希望这个hbase客户端成为项目的一部分,并将其作为其组件之一.因此,在集成之后,我们需要将其作为项目的War文件的一部分运行(我们需要将其作为rest API的一部分运行).我添加了hbase-site.xml.hdfs-site.xml和core-site.xml作为资源,并设置为Resource to configuration object.
Configuration conf = HBaseConfiguration.create()
URL hbaseUrl=HbaseManagerServiceImpl.class.getClassLoader().getResource("hbase-site.xml");
conf.addResource(hbaseUrl.toString());
URL hdfsUrl=HbaseManagerServiceImpl.class.getClassLoader().getResource("hdfs-site.xml");
conf.addResource(hdfsUrl.toString());
URL coreUrl=HbaseManagerServiceImpl.class.getClassLoader().getResource("core-site.xml");
conf.addResource(coreUrl.toString());
Run Code Online (Sandbox Code Playgroud)
当我试图只添加core-site.xml时,我收到错误说"包含失败"哪个文件存在于该主机上,因此在资源较旧时添加了该文件,这解决了我的问题.
HTable table = new HTable(conf , "tableName");
Run Code Online (Sandbox Code Playgroud)
我可以成功扫描并获取行操作并获取结果.
Scan scanTable = new Scan();
Get row = new Get(key);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试做"Result rowData = table.get(row); "
我的代码卡住了,没有显示任何错误.
我可以使用""hbase classpath"命令运行相同的代码.我是否需要设置$ HADOOP_CLASSPATH和$ HBASE_CLASSPATH变量,我通过jetty webserver运行我的代码.
以下是错误跟踪:
java.io.InterruptedIOException: Giving up trying to location region in meta: thread is interrupted.
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegionInMeta(HConnectionManager.java:1391)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:1169)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:1123)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionLocation(HConnectionManager.java:964)
at org.apache.hadoop.hbase.client.RegionServerCallable.prepare(RegionServerCallable.java:72)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:113)
at org.apache.hadoop.hbase.client.HTable.get(HTable.java:780)
at …Run Code Online (Sandbox Code Playgroud) 我是CDH的新手(我使用的当前版本是5.7.1)
我已经添加了HBase thrift角色并在Hue中设置,但我仍然遇到以下问题.

HBase Browser Failed to authenticate to HBase Thrift Server, check authentication configurations.
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
什么时候创建多个表而不是创建具有大量列的单个表是有意义的。我知道表通常只有几个列族(1-2),每个列族可以支持1000多个列。
当HBase在单个表中可能包含大量列的情况下表现良好时,何时创建单独的表才有意义?