SparkSQL读写Hive整合

博客主要围绕 Spark 展开,包含修改 Hive 配置、Spark 配置与启动,还提及启动时的异常及解决办法。此外,介绍了用相关操作创建 Hive 表、加载数据,以及切换时的启动和语句使用。

修改 Hive 的 hive-site.xml

  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
    <description>location of default database for the warehouse</description>
  </property>
  
  <property>
    <name>hive.metastore.uris</name>
    <value>thirft://node01:9083<value/>
    <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://192.168.34.25:3306/hive?createDatabaseIfNotExist=true</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    <description>Username to use against metastore database</description>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
    <description>password to use against metastore database</description>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>

启动 nohup /export/servers/hive1.2.2/bin/hive --service metastore 2>&1 >> /var/log.log &
在这里插入图片描述

配置 Spark

1 . 复制 hive-site.xml
命令 cp hive-site.xml /export/servers/spark/conf/

2 . 复制 core-site.xml hdfs-site.xml
命令 cp core-site.xml hdfs-site.xml /export/servers/spark/conf/

启动 bin/hive

异常:

Logging initialized using configuration in jar:file:/export/servers/hive1.2.2/lib/hive-common-1.2.2.jar!/hive-log4j.properties
Exception in thread "main" java.lang.RuntimeException: java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)
        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:677)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        at org.apache.hadoop.fs.Path.initialize(Path.java:205)
        at org.apache.hadoop.fs.Path.<init>(Path.java:171)
        at org.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:563)
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:508)
        ... 8 more
Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        at java.net.URI.checkPath(URI.java:1823)
        at java.net.URI.<init>(URI.java:745)
        at org.apache.hadoop.fs.Path.initialize(Path.java:202)
        ... 11 more

解决:

  <property>
    <name>hive.exec.scratchdir</name>
    <value>/tmp/hive</value>
    <description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/&lt;username&gt; is created, with ${hive.scratch.dir.permission}.</description>
  </property>
  <property>
    <name>hive.exec.local.scratchdir</name>
    <value>/tmp/hive/local</value>
    <description>Local scratch space for Hive jobs</description>
  </property>
  <property>
    <name>hive.downloaded.resources.dir</name>
    <value>/tmp/hive/resources</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
  </property>

Hive 创建 表

create external table account
(
  name STRING,
  app_name STRING,
  integral_val INT
)
row format delimited fields terminated by '\t' lines terminated by '\n' stored as TEXTFILE location '/dataset/hive';

加载数据

load data inpath '/dataset/t_new_account.txt' overwrite into table account;

在这里插入图片描述

切换至 Spark

1 . ./bin/spark-shell --master local[6] 启动

2 . 直接使用语句
spark.sql("use spark01")
spark.sql("select * from account limit 10")
res2.show

<think>嗯,用户现在想了解Hive on SparkSpark on Hive之间的区别。首先,我需要回顾之前提供的引用内容,确保准确理解这两个概念。根据引用[1],Hive on Spark是让Hive使用Spark作为执行引擎,而Spark on Hive则是Spark利用Hive的元数据和存储机制。引用[3]提到,Spark on Hive指的是在Spark应用中使用Hive作为元数据存储和查询引擎。引用[5]说明Hive on Spark是Cloudera等公司推动的项目,旨在将Spark作为Hive的计算引擎提升性能。 接下来,我需要将这两个概念进行对比,从架构、核心目标、数据管理、使用场景等方面展开。要注意用户可能混淆这两者的应用场景,需要明确区分。比如,Hive on Spark适合已有Hive生态但想提升速度的用户,而Spark on Hive适合使用Spark但需要Hive元数据支持的情况。 另外,用户之前的问题是关于MySQL多版本登录,但现在转向大数据处理框架,可能用户的工作涉及数据分析和处理,需要同时使用多种工具。因此,回答时要考虑实际应用中的选择建议,帮助用户根据自身需求决定使用哪种方案。 还要检查是否有其他引用内容需要整合,比如引用[2]提到性能比较,引用[4]涉及SparkHive的关系,这些可以作为补充信息。确保回答结构清晰,分点明确,避免技术术语过于晦涩,同时引用正确的来源标注。 最后,生成的相关问题需要与当前主题相关,帮助用户深入理解,比如优化方法、应用场景或与其他技术的对比。需要确认所有引用标注正确,没有遗漏或错误。</think>基于站内引用内容与Hive/Spark技术原理,Hive on SparkSpark on Hive的核心差异可归纳为以下六个维度: --- ### 一、架构角色差异 | 维度 | Hive on Spark | Spark on Hive | |--------------|----------------------------|----------------------------| | **主导框架** | HiveSQL引擎)为核心 | Spark(计算引擎)为核心 | | **依赖关系** | Spark作为Hive的执行引擎[^5] | Hive作为Spark的元数据服务[^3] | | **组件关系** | 架构层级:Hive > Spark | 架构层级:Spark > Hive | --- ### 二、核心目标差异 1. **Hive on Spark** - 解决Hive执行引擎MapReduce速度瓶颈(引用[2]的性能对比结论) - 通过替换执行引擎提升Hive查询性能(官方测试提升10-100倍[^2]) - 保持Hive原有语法与工作流(例如HQL、UDF等) 2. **Spark on Hive** - 扩展Spark的数据管理能力(通过Hive Metastore实现结构化数据访问) - 使Spark能直接读写Hive表(无需数据迁移即可访问数仓数据) - 支持SparkSQL与DataFrame API操作Hive元数据[^3] --- ### 三、数据管理差异 | 特性 | Hive on Spark | Spark on Hive | |---------------------|----------------------------------------|----------------------------------------| | **元数据存储** | 仍使用Hive Metastore | 必须依赖Hive Metastore(或独立部署) | | **数据目录访问** | 通过Hive Server访问 | Spark直接连接Hive Metastore[^3] | | **数据格式兼容性** | 需适配Hive表存储格式(ORC/Parquet等) | 支持更多Spark原生格式(如Delta Lake) | --- ### 四、执行流程对比 #### Hive on Spark执行链(HQL查询示例) ```mermaid graph LR A[Hive CLI] --> B(Hive Driver解析HQL) B --> C{生成Spark RDD/DAG} C --> D[Spark Cluster执行] D --> E[返回结果给Hive] ``` **特点**:全程由Hive控制执行计划,仅将物理计划转换为Spark任务[^5] #### Spark on Hive执行链(SparkSQL查询示例) ```mermaid graph LR A[Spark Shell] --> B(Spark Catalyst解析SQL) B --> C[通过Hive Metastore获取表结构] C --> D{生成Spark执行计划} D --> E[Spark Cluster直接执行] ``` **特点**:Spark自主优化执行流程,仅需Hive元数据支持[^3] --- ### 五、适用场景对比 | 场景类型 | Hive on Spark优势场景 | Spark on Hive优势场景 | |---------------------|----------------------------------------|----------------------------------------| | **存量系统迁移** | 已有Hive生态需提速(引用[2]对比结论) | 新建Spark项目需继承Hive表结构 | | **开发人员技能** | 熟悉HQL的数据分析师 | 熟悉Spark API/DataFrame的工程师 | | **数据治理要求** | 需要严格沿用Hive权限管理体系 | 需要灵活结合Spark生态工具(如MLlib) | --- ### 六、配置差异示例 1. **Hive on Spark**配置要点(hive-site.xml): ```xml <property> <name>hive.execution.engine</name> <value>spark</value> </property> <property> <name>spark.master</name> <value>yarn</value> </property> ``` 2. **Spark on Hive**配置要点(spark-defaults.conf): ```properties spark.sql.catalogImplementation=hive spark.hadoop.hive.metastore.uris=thrift://hive-metastore:9083 ``` --- ### 关键选择建议 1. **优先选择Hive on Spark**:当存在以下情况时 - 已有大量Hive脚本需要延续使用 - 需要兼容Hive UDF/UDAF等扩展(引用[5]的兼容性设计) - 团队主要使用Hive进行ETL开发 2. **优先选择Spark on Hive**:当存在以下情况时 - 需要结合Spark Streaming/MLlib等高级功能 - 使用DataFrame API进行复杂数据处理 - 要求更低延迟的交互式查询(Spark内存计算优势) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值