Spark与Hive可以相互结合,同时Spark也可以使用DataFrame读取HBase里的数据,Hive也同样可以直接读取HBase的数据。只不过在Spark和Hive读取HBase数据的时候,需要做列簇或列映射,对于列不确定的需要列簇映射。 几种数据读取和分析思路
- Hive on HBase做好表映射,然后使用Tez替换MR引擎,使用Hive做数据分析
- 这是最基本的一种方式,对于上层的数据分析可以提供基础支持,同时也可以通过写脚本的方式来做数据分析。但是跟别的数据源关联和分析比较麻烦,不像Spark可以提供多种数据源连接。
- Spark SQL链接HBase,使用DataFrame做数据分析(由Spark构建表映射)
- HuaweiBigData/astro,hortonworks-spark/shc,这是两个连接映射器,不过我目前没有去探索过。
- Hive on HBase,开启Hive的thrift server,通过JDBC连接提取数据
- 这种方式与普通的JDBC取关系型数据库一样,可在SQL语句里传入Hive相应的处理函数,利用Hive来做计算然后提取结果。如果是Spark取数据的话,还不需要Spark做HBase表列的映射,很多函数可以使用Hive本身的。
- 但是,在目前Hive 1.2的JDBC版本里面,使用它会报错:
java.sql.SQLException: Method not supported at org.apache.hive.jdbc.HiveResultSetMetaData.isSigned
,这是因为在目前的JDBC版本里,甚至以后的Hive 2.0版本里,isSigned
这个方法都没有做实现,并且在Spark 1.5及以上版本
里,这个方法被Spark SQL的resolveTable
所调用,所以在这些版本的Spark里,这种方式都无法使用,低版本的Spark或许可以。
- Hive on HBase,Spark SQL使用HiveContext接触Hive的元数据信息,然后自己做数据提取和分析
- HBase表列的映射不需要做,可以在Hive映射的基础上提取数据。
- 需要配置Spark识别Hive所映射的HBase表(默认无法识别)。
- 首先配置Spark在提交Job的时候加上以下jar包(博主使用的HDP2.4.0.0-169): hive-hbase-handler-1.2.1000.2.4.0.0-169.jar hbase-client-1.1.2.2.4.0.0-169.jar hbase-protocol-1.1.2.2.4.0.0-169.jar hbase-common-1.1.2.2.4.0.0-169.jar hbase-server-1.1.2.2.4.0.0-169.jar htrace-core-3.1.0-incubating.jar guava-12.0.1.jar protobuf-java-2.5.0.jar 上述的jar包分别在Hive和HBase的lib目录下找。具体配置如下:在
spark-defaults.conf
的配置文件里加入spark.executor.extraClassPath
和spark.driver.extraClassPath
,其值是上述jar包的路径,多个jar包之间以:
分割。如:spark.executor.extraClassPath /usr/hdp/2.4.0.0-169/spark/extrajars/hbase-client-1.1.2.2.4.0.0-169.jar:/usr/hdp/2.4.0.0-169/spark/extrajars/hbase-protocol-1.1.2.2.4.0.0-169.jar
,在Ambari里配置就更简单了,在Custom spark-defaults里添加这两条配置即可。 - 其次,需将
hbase-site.xml
文件拷贝至HADOOP_CONF_DIR
文件夹(/etc/hadoop/conf
)下,因为在spark-env.sh
里配置了HADOOP_CONF_DIR
,里面的文件会被默认加载,所以hbase的配置也会被加载。其中有用的配置是以下几个: hbase.zookeeper.quorum zookeeper.znode.parent hbase.client.scanner.caching 其中caching这个值默认是100,为了性能可以适当提高,比如5000
- 首先配置Spark在提交Job的时候加上以下jar包(博主使用的HDP2.4.0.0-169): hive-hbase-handler-1.2.1000.2.4.0.0-169.jar hbase-client-1.1.2.2.4.0.0-169.jar hbase-protocol-1.1.2.2.4.0.0-169.jar hbase-common-1.1.2.2.4.0.0-169.jar hbase-server-1.1.2.2.4.0.0-169.jar htrace-core-3.1.0-incubating.jar guava-12.0.1.jar protobuf-java-2.5.0.jar 上述的jar包分别在Hive和HBase的lib目录下找。具体配置如下:在
- Hive的各种函数和map, struct等数据结构在Spark里都可以找到对应的,处理数据更加简单。如下是取hive表里的
struct
类型字段,字段原型rowkey_struct struct<hash:string, resid:string, time_stamp:string>
对于有些列名是动态变化的,比如存放外键关联字段的时候,并不知道列名和有多少个列。必须通过hive的map映射,映射的字段怎么处理呢?需要把map里的key-value键值对转换为行,然后将行转列,需要用到val sqlContext = new HiveContext(sc) sqlContext.table("cbd.summary").select("rowkey_struct", "Amount"). select($"rowkey_struct".getField("hash").as("hash"),$"rowkey_struct".getField("time_stamp").as("time_stamp").cast(LongType), $"Amount".cast(LongType))
explode
函数。如下是处理map
类型字段,字段原型project_info map<String, string>
case classFilterField(EstiType: String, ProjectType: String) val sqlContext = new HiveContext(sc) sqlContext.table("cbd.project").select("rowkey","project_info").explode($"project_info") { case Row(project_info: Map[String, String]) => val projectType = project_info.filterKeys(_.contains("工程类型")).map(_._2).headOption.getOrElse("NaN") // 不知列名的采用匹配,已知列名的可以直接取 Array(FilterField(project_info.getOrElse("计价方式", "NaN"), projectType)) }.select("rowkey", "EstiType", "ProjectType")
- 同样的语句,执行速度比Hive on Tez快
- 在Ambari里,Spark默认已经配置好可以读取Hive的元数据信息
- Hive on HBase,由Hive做好分析后,把数据写入到Hive其他的表里,然后Spark再从Hive表里取数据。 这种就比较绕,除非Hive里有的函数很重要但是Spark里不具备,可以这么干,否则直接使用Spark读取Hive的元数据信息更合适。
欢迎转载,但请注明出处:https://my.oschina.net/u/2539801/blog/750858
相关推荐
Spark与HBase的结合,通过Spark的HBase连接器,可以实现高效的数据导入导出和实时分析。 在这个压缩包中,"spark-2.4.0-old"可能指的是Spark的旧版本库,可能是为了兼容性或者回滚目的而保留的。这个文件可能包含了...
Scala、Hive与HBase是大数据处理领域中的关键组件,它们在Java开发环境中扮演着重要角色。本压缩包"scala-hive-HBASE-Api.7z"包含了2019年8月至10月间用于工作的相关jar包,主要用于支持Scala、Hive和HBase的集成...
接下来,Spark作为一个分布式计算框架,提供了一种灵活且高性能的方式来处理数据。在Hive和ClickHouse之间传输数据时,Spark可以作为一个中间层,利用其强大的数据处理能力,将Hive表的数据转换为适合ClickHouse存储...
在实际应用中,Spark可以与其他大数据工具如Hive、HBase、Cassandra等结合使用,提供更强大的数据分析功能。此外,Spark的弹性分布式数据集(Resilient Distributed Datasets, RDD)是其核心概念,它提供了一种在...
5. **索引与查询**:虽然HBase本身不支持复杂的SQL查询,但可以通过Secondary Index或者与Spark、Hive等工具结合,实现高效的查询。 使用HBase的Java API,开发者可以方便地进行以下操作: - **创建表**:通过...
DataFrame 支持多种数据源,包括HDFS、Cassandra、HBase等,与Hadoop 2.7的兼容性使得数据读取和写入更为方便。Dataset 是DataFrame的类型安全版本,结合了RDD的高性能和DataFrame的API便利性,是面向对象编程的理想...
早期版本主要依赖于MapReduce,但后来引入了更高效的Tez和Spark执行引擎,减少数据读取和写入的开销,提升查询性能。 7. **Hive的优化器**:Hive的查询优化器负责转化HQL为执行计划,包括选择最佳的执行路径、合并...
Spark是Apache Hadoop生态系统中的一个快速、通用且可扩展的大数据处理框架,它设计的目标是提供一种高效的数据处理方式,支持交互式数据挖掘和实时数据分析。Spark SQL是Spark的一个重要组件,它允许用户通过SQL...
- HBase适合需要快速随机读写的场景,而Hive则更适合于批处理和数据分析任务。 - 两者可以通过Hive-on-HBase的方式结合使用,即利用Hive的SQL接口来查询HBase中的数据,增强了HBase的查询灵活性。 #### 2. HBase...
总的来说,Spark SQL的出现解决了Shark的局限性,提供了更高效、易用的数据处理方式,使得开发人员在处理大数据时能更好地利用SQL的便利性,同时结合Spark的并行计算优势,极大地提升了大数据处理的效率和灵活性。
【Impala-Kudu-HBase-Spark安装文档】是关于在分布式计算环境中集成多个组件的详细指南,主要包括四个关键部分:Impala、Kudu、HBase和Spark。这些组件都是大数据处理和分析的重要工具,用于构建高效的数据仓库和...
用户可以使用两种方法创建RDD:读取一个外部数据集,或在驱动器程序中分发驱动器程序中的对象集合,比如list或者set。 RDD的转化操作都是惰性求值的,这意味着我们对RDD调用转化操作,操作不会立即执行。相反,Spark...
3.12 HBase API使用 - 读取数据 3.13 HBase优化 - 表设计 3.14 HBase优化 - 表操作 3.15 ElasticSearch简介 3.16 ElasticSearch特点与应用 3.17 ElasticSearch生态圈与架构 3.18 ElasticSearch缓存和倒排索引 3.19 ...
Spark SQL结合了Spark的高性能计算能力和SQL查询的便利性,使得开发者能够通过SQL或者DataFrame API来处理大规模数据。它是一个分布式SQL查询引擎,提供了对多种数据源的支持,如HDFS、Hive、HBase、Parquet等,使得...
Apache Atlas的HBase Hook允许我们捕获Spark SQL对HBase表的操作,如读取、写入或更新,生成相应的元数据和血缘信息。 在具体实施过程中,首先需要配置Apache Atlas以支持Spark SQL和HBase。这包括在Atlas中定义...
HBase是一种分布式、基于列族的NoSQL数据库,由Apache软件基金会开发并维护,是Hadoop生态系统中的重要组件。这份“HBase官方文档中文版”提供了全面深入的HBase知识,帮助用户理解和掌握如何在大数据场景下有效地...
- **兼容性**:Hive 的元数据和数据模型可以在 Spark 上无缝使用。 3. **与 HBase 的结合** - **实时查询**:HBase 提供了对 Hive 表的实时访问能力。 - **混合使用**:可以将频繁查询的数据存储在 HBase 中,而...
这门课程深入浅出地介绍了大数据处理技术,包括Hadoop、Hbase、Hive以及Spark,并且提供了丰富的PPT课件,内含习题,共计30页,旨在帮助学习者掌握大数据领域的核心概念和实际操作。 Hadoop是大数据处理的基础框架...
在实际应用中,Hive通常与其他Hadoop组件如HDFS、HBase、Spark等配合使用,构建大数据处理和分析的生态系统。例如,Hive可以读取HDFS上的数据,或者通过HBase进行实时查询。同时,Hive也可以与YARN结合,以提供资源...
spark2.3 读取hive问题处理读取不到hive中的数据库?spark通过hive读取hbase外连表,报Class Not Found等异常?手动指定s