我正在hadoop中构建实时流应用程序,我已经尝试了以下技术来将数据推送到hbase,但我正在寻找有关可用技术的更多细节
- Spark Streaming-使用微批处理
- Kafka Connect-没有可用的连接器
- Nifi-看起来有效,但它仍然在批量推送数据
有没有其他技术可以完美地将数据实时推送到Hbase以发布实时仪表板。
保证了一个语义,避免了批处理,并且可以实时将数据推送到任何nosql数据库和开源?
似乎flink、splunk、fluid、beam是一些可以进行实验的技术,对这些技术的深入了解任何nosql数据库都会有很大帮助。
我建议您使用Spark Structured Streaming。
内部结构化流式查询也使用微批处理引擎进行处理,但端到端延迟低至100毫秒,并保证了一次容错。
此外,自Spark 2.3以来,通过一种名为Continuous processing的新的低延迟处理模型,我们可以在至少一次保证的情况下实现低至1毫秒的端到端延迟。
有一个开源的Hortonworks Spark Hbase连接器包:"com.Hortonworks:shc core:1.1.0-2.1-s_2.11'。
要将Datafram摄取到HBase目录表,需要包含架构信息。下面的目录为HBase表定义了一个模式,名称为table1,行键为键,列数为(col1-col8(。请注意,行键还必须在详细信息中定义为一列(col0(,该列具有特定的cf(rowkey(。
import org.apache.spark.sql.{SQLContext, _}
import org.apache.spark.sql.execution.datasources.hbase._
import org.apache.spark.{SparkConf, SparkContext}
import spark.sqlContext.implicits._
def catalog = s"""{
|"table":{"namespace":"default", "name":"table1"},
|"rowkey":"key",
|"columns":{
|"col0":{"cf":"rowkey", "col":"key", "type":"string"},
|"col1":{"cf":"cf1", "col":"col1", "type":"boolean"},
|"col2":{"cf":"cf2", "col":"col2", "type":"double"},
|"col3":{"cf":"cf3", "col":"col3", "type":"float"},
|"col4":{"cf":"cf4", "col":"col4", "type":"int"},
|"col5":{"cf":"cf5", "col":"col5", "type":"bigint"},
|"col6":{"cf":"cf6", "col":"col6", "type":"smallint"},
|"col7":{"cf":"cf7", "col":"col7", "type":"string"},
|"col8":{"cf":"cf8", "col":"col8", "type":"tinyint"}
|}
|}""".stripMargin
df.writeStream.options(
Map(HBaseTableCatalog.tableCatalog -> catalog, HBaseTableCatalog.newTable -> "5"))
.outputMode("update")
.format("org.apache.spark.sql.execution.datasources.hbase")
.start()
请参阅:https://github.com/hortonworks-spark/shc
Flume的构建正是为了实现您想要的目的:将数据从一个系统推送到另一个系统。由于您可以将其配置为具有所需的批处理大小(如果您只关心延迟,则会非常小(,因此它应该尽可能好。它已经为HBase提供了一个接收器,但如果将来你需要切换存储,最糟糕的情况是你必须自己实现接收器。
Flink也可以做你想做的事情,因为你也可以将其配置为针对延迟进行优化。然而,它的构建是为了让您可以执行更精细的转换,所以我希望它的性能比Flume差一点,但没有什么比为您的特定用例自己进行基准测试更好的了。