我想为HBase数据库编写自己的ActiveRecord适配器,因为目前还没有.但是,我一直在网上搜索一下,找不到有关如何编写ActiveRecord适配器的任何好资源.您将如何进行此操作,或者您可以推荐任何链接?
请告诉我HBase如何跨区域服务器分区表.
例如,假设我的行键是从0到10M的整数,我有10个regionservers.
这是否意味着第一个区域服务器将存储所有行的键值为0 - 10M,第二个1M - 2M,第三个2M-3M,......第十个9M - 10M?
我希望我的行密钥是时间戳,但我认为大多数查询都适用于最新日期,所有查询只会由一个区域服务器处理,这是真的吗?
或者这些数据可能会以不同的方式传播?
或者也许我可以以某种方式创建比我有区域服务器更多的区域,因此(根据给定的示例)服务器1将具有0 - 0,5M和3M - 3,5M的密钥,这样我的数据将更均匀地传播,这是可能?
更新
我刚发现有选择hbase.hregion.max.filesize,你认为这会解决我的问题吗?
HBase有一个主从模型,而Cassandra有一个点对点模型.我知道在主从模型中,主服务器是SPOF(单点故障),并且在对等模型中没有这样的东西.
每种型号还有其他优缺点吗?特别是我正在寻找主对手在对等模型上的任何优势.
我安装HBase 0.92了Hadoop 1.0.0它,它在完全分布式模式下工作正常,但一个恼人的警告不断出现.我怎么能摆脱它?
.......
hbase(main):001:0> status
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in
[jar:file:/opt/hbase-0.92.0/lib/slf4j-log4j12-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in
[jar:file:/opt/hadoop-1.0.0/lib/slf4j-log4j12-1.4.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
: See http://www.slf4j.org/codes.html#multiple_bindings for an
explanation.
3 servers, 0 dead, 0.6667 average load
.......
Run Code Online (Sandbox Code Playgroud)
PS我没有设置$CLASSPATH变量hbase-env.sh.我运行Hadoop start-all.sh,然后启动HBase start-hbase.sh.
我是Eclipse,Java和Linux的新手.我搜索这个问题,但我没有回答.我想编写一个操作HBase表的程序.所以我有一些与HBase相关的Jar文件.在普通的Java应用程序中,我通过以下指令添加Jar文件
构建路径 - >配置构建路径 - >添加外部JAR
所以在Dynamic Web Project中声音就像不同.经过一些搜索后,我了解Jar文件必须添加到WEB-INF/lib或%TOMCAT_HOME%/ lib中.所以我从%TOMCAT_HOME%/ lib得到了答案,但我真的不知道如何在WEB-INF/lib中添加jar文件.我复制文件夹中的所有jar文件,但它不起作用.
请详细帮我.
还有一个关于NoSQL选择的问题.但是,我还没有找到有人要求这种目的,消息存储......
我有一个Erlang聊天服务器,我已经使用MySQL存储好友列表,以及"JOIN needed"信息.
我想存储消息(用户因为离线而没有收到消息......)并检索它们.
我已经预先选择了NoSQL,我不能使用像MongoDB这样的东西,因为它是面向RAM的范例,并且不能像其他人一样集群.我想我的列表中有3个选项:
我知道他们的模型不同,一个使用键/值,另一个使用SuperColumns和co.
到目前为止,由于它是Erlang的稳定客户端库,我对Riak有偏好.
我知道我可以使用Cassandra和Thrift,但是对于Erlang来说似乎不太稳定(我没有得到很好的回报)
我现在对HBase一无所知,只知道它存在并且基于像Cassandra和Riak这样的Dynamo.
所以这就是我需要做的事情:
现在,我对那些NoSQL DB真的很陌生,我一直都是MySQL爱好者,这就是为什么我问你这个问题,作为一个新手,会有比我更多经验的人帮我选择哪一个更好,并且会让我做我想做的一切,不用太麻烦......
谢谢 !
我有一个连接到HBASE的map reduce作业,我无法弄清楚我遇到这个错误的位置:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
Caused by: java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: rsrc:hbase-common-0.98.1-hadoop2.jar
at org.apache.hadoop.fs.Path.initialize(Path.java:206)
at org.apache.hadoop.fs.Path.<init>(Path.java:172)
at org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.findOrCreateJar(TableMapReduceUtil.java:703)
at org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.addDependencyJars(TableMapReduceUtil.java:656)
at org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.addHBaseDependencyJars(TableMapReduceUtil.java:573)
at org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.addDependencyJars(TableMapReduceUtil.java:617)
at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.configureIncrementalLoad(HFileOutputFormat2.java:398)
at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.configureIncrementalLoad(HFileOutputFormat2.java:356)
at com.ancestry.bigtree.hfile.JsonToHFileDriver.run(JsonToHFileDriver.java:117)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at com.ancestry.bigtree.hfile.JsonToHFileDriver.main(JsonToHFileDriver.java:69)
... 10 more
Caused by: java.net.URISyntaxException: Relative path in absolute URI: rsrc:hbase-common-0.98.1-hadoop2.jar
at java.net.URI.checkPath(URI.java:1804)
at java.net.URI.<init>(URI.java:752)
at org.apache.hadoop.fs.Path.initialize(Path.java:203)
Run Code Online (Sandbox Code Playgroud)
如果我没有Hbase库,那么工作运行正常.生成的相对路径在哪里?如何强制生成的路径是绝对的? …
我在Hbase中有一个表让我们说"tbl",我想用Hive查询它.因此,我将表格映射到hive,如下所示:
CREATE EXTERNAL TABLE tbl(id string, data map<string,string>)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,data:")
TBLPROPERTIES("hbase.table.name" = "tbl");
Run Code Online (Sandbox Code Playgroud)
查询如下:
select * from tbl", "select id from tbl", "select id, data
from tbl
Run Code Online (Sandbox Code Playgroud)
真的很快
但查询喜欢
select id from tbl where substr(id, 0, 5) = "12345"
select id from tbl where data["777"] IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
非常慢.
相反,从Hbase shell运行时:
"scan 'tbl', {
COLUMNS=>'data', STARTROW='12345', ENDROW='12346'}" or
"scan 'tbl', { COLUMNS=>'data', "FILTER" =>
FilterList.new([qualifierFilter('777')])}"
Run Code Online (Sandbox Code Playgroud)
它闪电般快!
当我查看由jobtracker上的hive生成的mapred作业时,我发现"map.input.records"计算Hbase表中的所有项目,这意味着作业在它甚至启动任何映射器之前进行全表扫描!此外,我怀疑它在执行之前将所有数据从Hbase表复制到hdfs到mapper tmp输入文件夹.
所以,我的问题是 - 为什么hive的hbase存储处理程序不会将hive查询转换为适当的hbase函数?为什么它扫描所有记录然后使用"where"子句对它们进行切片?怎么改进?
任何提高Hive查询性能的建议(映射到HBase表).
我们可以在HBase表上创建二级索引吗?
我们正在使用HBase和Hive集成并尝试调整Hive查询的性能.
作为开发人员,我通过使用现有MySQL表导入数据为我们的项目创建了HBase表sqoop job.问题是我们的数据分析师团队熟悉MySQL语法,暗示他们可以HIVE轻松查询表.对他们来说,我需要在HIVE中公开HBase表.我不想通过在HIVE中再次填充数据来复制数据.此外,复制数据将来可能会出现一致性问题.
我可以在没有重复数据的情况下暴露HIVE中的HBase表吗?如果是,我该怎么办?另外,如果insert/update/delete我的HBase表中的数据将更新数据出现在HIVE中而没有任何问题?
有时,我们的数据分析团队会在HIVE中创建表格并填充数据.我可以将它们暴露给HBase吗?如果有,怎么样?
假设我们可以直接从HDFS而不是使用HBase API来更快地访问数据,我们正在尝试基于HBase的表快照构建RDD.
所以,我有一个名为"dm_test_snap"的快照.我似乎能够使大多数配置工作正常,但我的RDD为空(尽管Snapshot本身存在数据).
我有一段时间找到一个使用Spark对HBase快照进行离线分析的人的例子,但我不敢相信我一个人试图让这个工作起来.非常感谢任何帮助或建议.
这是我的代码片段:
object TestSnap {
def main(args: Array[String]) {
val config = ConfigFactory.load()
val hbaseRootDir = config.getString("hbase.rootdir")
val sparkConf = new SparkConf()
.setAppName("testnsnap")
.setMaster(config.getString("spark.app.master"))
.setJars(SparkContext.jarOfObject(this))
.set("spark.executor.memory", "2g")
.set("spark.default.parallelism", "160")
val sc = new SparkContext(sparkConf)
println("Creating hbase configuration")
val conf = HBaseConfiguration.create()
conf.set("hbase.rootdir", hbaseRootDir)
conf.set("hbase.zookeeper.quorum", config.getString("hbase.zookeeper.quorum"))
conf.set("zookeeper.session.timeout", config.getString("zookeeper.session.timeout"))
conf.set("hbase.TableSnapshotInputFormat.snapshot.name", "dm_test_snap")
val scan = new Scan
val job = Job.getInstance(conf)
TableSnapshotInputFormat.setInput(job, "dm_test_snap",
new Path("hdfs://nameservice1/tmp"))
val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableSnapshotInputFormat],
classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
classOf[org.apache.hadoop.hbase.client.Result])
hBaseRDD.count()
System.exit(0)
}
}
Run Code Online (Sandbox Code Playgroud)
更新以包含解决方案 诀窍是,正如@Holden在下面提到的那样,conf没有通过.为了解决这个问题,我能够通过将对newAPIHadoopRDD的调用更改为:
val hBaseRDD …Run Code Online (Sandbox Code Playgroud) hbase ×10
hadoop ×5
cassandra ×2
hive ×2
java ×2
activerecord ×1
apache-hive ×1
apache-spark ×1
bulkloader ×1
eclipse ×1
erlang ×1
integration ×1
jsp ×1
mapreduce ×1
master-slave ×1
nosql ×1
p2p ×1
performance ×1
riak ×1
ruby ×1
scala ×1
slf4j ×1
sqoop ×1