SparkSQL On Hive和spark的内存分配问题

本文详细介绍如何在Spark环境中集成Hive,包括配置hive-site.xml,启动Hadoop和SparkSQL服务,以及通过Beeline连接Hive进行数据操作。同时,解决Spark版本升级导致的jar包路径变更问题,深入解析Spark内存分配机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spark On Hive

 

1.SparkSQL集成Hive,需将hive-site.xml复制到{SAPRK_HOME/conf}目录下,即可!!
  a.将hive-site.xml复制到{SAPRK_HOME/conf}目录下;
  b.将hive-site.xml复制到所有Spark节点;
  c.将MySQL驱动包[mysql-connector-java-5.1.36-bin.jar]复制到{SPARK_HOME/jars};
  d.开启Hadoop;
    $>zKServer.sh start
    $>start-dfs.sh
    $>strat-yarn.sh
  e.开启sparkSQL
    $>spark-sql //默认开启“Local模式”
      等价于:spark-sql --master local
  f.如果在Standalone模式下:
    $>spark-sql --master spark://master:7077
   如果在Spark on yarn模式下:
    $>spark-sql --master yarn
  g.在spark-sql命令行中,编写HQL
    spark-sql>show databases;
    spark-sql>use hive;
    spark-sql>select * from student;

thriftServer Beeline 连接 Hive

 

 

1.将hive-site.xml复制到{SAPRK_HOME/conf}目录下;
  <!--配置hiveserver2主机(这里最好是配置ip地址,以便于从Windows连接)-->
    <property>
      <name>hive.server2.thrift.bind.host</name>
      <value>master</value>
    </property>
  <!--配置beeline远程客户端连接时的用户名和密码。这个用户名要在对应的hadoop的配置文件core-site.xml中也配置-->
    <property>
      <name>hive.server2.thrift.client.user</name>
      <value>Alex_lei</value>
    </property>
    <property>
      <name>hive.server2.thrift.client.password</name>
      <value>123456</value>
    </property>
2.开启hive的ThriftServer服务
  $>hiveserver2
3.在{SPARK_HOME/bin}目录下,执行beeline
  $>beeline
  Beeline version 1.2.1.spark2 by Apache Hive
  beeline>
4.在{beeline>}光标处,添加!connect,如下:
  beeline>!connect jdbc:hive2://master:10000/default
5.添加用户名:
  beeline> !connect jdbc:hive2://master:10000/default
  Connecting to jdbc:hive2://master:10000/default
  Enter username for jdbc:hive2://master:10000/default:Alex_lei
6.添加密码:
  beeline> !connect jdbc:hive2://master:10000/default
  Connecting to jdbc:hive2://master:10000/default
  Enter username for jdbc:hive2://master:10000/default: Alex_lei
  Enter password for jdbc:hive2://master:10000/default: ******
7.成功连接!
  beeline> !connect jdbc:hive2://master:10000/default
  Connecting to jdbc:hive2://master:10000/default
  Enter username for jdbc:hive2://master:10000/default: Alex_lei
  Enter password for jdbc:hive2://master:10000/default: ******
  18/09/07 12:51:11 INFO jdbc.Utils: Supplied authorities: master:10000
  18/09/07 12:51:11 INFO jdbc.Utils: Resolved authority: master:10000
  18/09/07 12:51:11 INFO jdbc.HiveConnection: Will try to open client transport with JDBC Uri: jdbc:hive2://master:10000/default
  Connected to: Apache Hive (version 1.2.1)
  Driver: Hive JDBC (version 1.2.1.spark2)
  Transaction isolation: TRANSACTION_REPEATABLE_READ
  0: jdbc:hive2://master:10000/default>
  0: jdbc:hive2://master:10000/default>
  0: jdbc:hive2://master:10000/default>
  0: jdbc:hive2://master:10000/default> show databases;
8.退出
  0: jdbc:hive2://master:10000/default> !quit
  Closing: 0: jdbc:hive2://master:10000/default

 

问题:cannot access /home/hyxy/soft/spark/lib/spark-assembly-*.jar: No such file or directory

原因:我们开启Hive客户端找不到这个jar包,是由于saprk2.0之后没有lib这个目录了,这个jar包也不存在,spark2.0之前还是存在的。

解决方案

  (1)修改spark版本(不建议)

  (2)修改{HIVE_HOME/bin}目录下的hive可执行脚本

      修改【sparkAssemblyPath=`ls ${SPARK_HOME}/lib/spark-assembly-*.jar`】:

        --> 【sparkAssemblyPath=`ls ${SPARK_HOME}/jars/*.jar`】

Spark的内存分配问题

 

  版本:2.1.2,其他的版本我暂时没有确认,2.0之前的与2.0之后的不一样。

  1.先介绍几个名词:

      --> Reserved Memory(预留内存)

      --> User Memory(用户内存)

      --> Spark Memory(包括Storage Memory 和 Execution Memory)

      -->Spark内存默认为1G

  2.

  预留内存=300M,不可更改。

  用户内存是1G=(1024M-300M)*0.25

  spark Memory = (1024M-300M)*0.75

  存储内存=Spark Memory*0.5

  计算内存=Spark Memory*0.5

  3.

  作用:

    预留内存:用于存储Spark相关定义的参数,如sc,sparksession等。

    用户内存:用于存储用户级别相关定义的数据,如:参数或变量。

    Spark内存:用于计算(Execution Memory)和cache缓存(Storage Memory)。

  4.在分配executor内存,需考虑最小内存数为:450M

    val minSystemMemory = (reservedMemory * 1.5).ceil.toLong

  5.内存抢占问题

     a.缓存数据大于执行数据(RDD):storage Memory强占Execution Memory

     b.Execution Memory占优,storage Memory必须释放!!
     Execution Memory优先级比较高

转载于:https://www.cnblogs.com/lyr999736/p/10229653.html

### 比较 Hive on Spark SparkSQL #### 区别 Hive on Spark 是一种允许 Hive 使用 Spark 作为其执行引擎的方式,而不是默认的 MapReduce 执行引擎。这种方式使得 Hive 可以利用 Spark 更高效的内存管理并行处理机制来提升查询性能[^1]。 另一方面,SparkSQL 提供了一个更全面的数据处理框架,它不仅能够读取写入 Hive 表,还可以支持多种其他数据源,并提供了丰富的 API 来操作结构化数据。此外,SparkSQL 还引入了自己的优化器 Catalyst,这有助于进一步提高查询效率[^2]。 #### 性能差异 当涉及到性能方面时,在大多数情况下,由于 Spark内存计算特性,无论是 Hive on Spark 或者纯 SparkSQL 查询都比传统的基于 MapReduce 的 Hive 查询要快得多。然而,两者之间的相对表现取决于具体的使用案例: - 对于简单的 SQL 查询,如果这些查询可以直接映射到 HiveQL 而不需要额外的功能,则 Hive on Spark 可能会显示出更好的兼容性相似甚至稍好的性能。 - 当涉及复杂分析任务或需要更多高级功能(如窗口函数、UDF 用户定义函数等),则 SparkSQL 往往表现出更强的能力,因为它拥有更加灵活且强大的API集合以及内置的支持[^3]。 #### 应用场景 选择哪一个解决方案应该依据实际需求考虑如下因素: - **现有基础设施**:如果你已经有了成熟的 Hive 生态环境并且希望最小化迁移成本,那么可以选择 Hive on Spark;反之,如果没有特别的历史包袱或者正在构建新的应用,则可以优先考虑 SparkSQL[^4]。 - **查询复杂度**:对于较为复杂的ETL流程或是数据分析工作负载来说,SparkSQL 凭借着更为先进的特性更高的灵活性通常是更好的选项。 - **社区支持**:考虑到长期维护技术演进的角度出发,Apache Spark 社区非常活跃,这意味着 SparkSQL 将持续获得改进发展,相比之下,虽然 Hive on Spark 同样得到了一定关注,但在某些特定领域内可能不如前者那样具有优势。 ```sql -- 示例 Hive on Spark 查询语句 SELECT * FROM table_name WHERE condition; -- 示例 SparkSQL 查询语句 spark.sql("SELECT * FROM table_name WHERE condition") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值