Java + Spark SQL + Hive + Maven简单实现和异常问题

30 篇文章 9 订阅
15 篇文章 0 订阅

一. 前期准备

1.linux搭建Java和Scala环境搭建
2. linux搭建hadoop+spark+hive分布式集群

hadoop分布式集群搭建:hadoop分布式集群搭建

spark分布式集群搭建:spark分布式集群搭建

hive分布式集群搭建:待完善

二.项目代码实现

1 需求

通过Spark Sql 查询Hive数据库数据

数据库:bi_ods;

表:owms_m_locator

2 maven 项目搭建

新增一个Mave project工程


maven project工程
3 实现代码
package com.lm.hive.SparkHive;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.hive.HiveContext;

/**
 * Spark sql获取Hive数据
 *
 */
public class App 
{
    public static void main( String[] args ) 
    {
        SparkConf sparkConf = new SparkConf().setAppName("SparkHive").setMaster("local[2]");
        JavaSparkContext sc = new JavaSparkContext(sparkConf);
        
        //不要使用SQLContext,部署异常找不到数据库和表
        HiveContext hiveContext = new HiveContext(sc);
        SQLContext sqlContext = new SQLContext(sc);
        //查询表前10条数据
        hiveContext.sql("select * from bi_ods.owms_m_locator limit 10").show();
        
        sc.stop();
    }
}

4. pom.xml文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.lm.hive</groupId>
	<artifactId>SparkHive</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>SparkHive</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.39</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.22</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-client</artifactId>
			<version>2.6.4</version>
		</dependency>

		<dependency>
			<groupId>org.apache.spark</groupId>
			<artifactId>spark-sql_2.10</artifactId>
			<version>1.6.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.spark</groupId>
			<artifactId>spark-hive_2.10</artifactId>
			<version>1.6.0</version>
		</dependency>

		<dependency>
			<groupId>org.apache.spark</groupId>
			<artifactId>spark-streaming_2.10</artifactId>
			<version>1.6.0</version>
			<exclusions>
				<exclusion>
					<artifactId>slf4j-log4j12</artifactId>
					<groupId>org.slf4j</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.spark</groupId>
			<artifactId>spark-core_2.10</artifactId>
			<version>1.6.0</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
		<dependency>
			<groupId>org.apache.hive</groupId>
			<artifactId>hive-jdbc</artifactId>
			<version>2.1.1</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
		<dependency>
			<groupId>org.apache.hive</groupId>
			<artifactId>hive-exec</artifactId>
			<version>2.1.1</version>
		</dependency>

	</dependencies>
	<build>

		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-shade-plugin</artifactId>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>shade</goal>
						</goals>
						<configuration>
							<shadedArtifactAttached>true</shadedArtifactAttached>
							<shadedClassifierName>allinone</shadedClassifierName>
							<artifactSet>
								<includes>
									<include>*:*</include>
								</includes>
							</artifactSet>
							<filters>
								<filter>
									<artifact>*:*</artifact>
									<excludes>
										<exclude>META-INF/*.SF</exclude>
										<exclude>META-INF/*.DSA</exclude>
										<exclude>META-INF/*.RSA</exclude>
									</excludes>
								</filter>
							</filters>
							<transformers>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>reference.conf</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/spring.handlers</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/spring.schemas</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
									<manifestEntries>
										<Main-Class></Main-Class>
									</manifestEntries>
								</transformer>
							</transformers>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>


三. 项目部署

1 maven项目编译成jar包

本文编译成 SparkHive-0.0.1-SNAPSHOT-allinone.jar

2 上传jar包至linux服务器

通过rz命令上传

3 通过spark-submit命令运行jar包

命令:

sh bin/spark-submit --class com.lm.hive.SparkHive.App --master yarn  --files /home/winit/spark-1.6.0/conf/hive-site.xml  java_jar/SparkHive-0.0.1-SNAPSHOT-allinone.jar

结果:


运行结果

四.异常问题

在网上搜索,很多是通过SQLContext实例去查询Hive数据,当本人使用时,出现以下异常

1. Exception in thread "main" org.apache.spark.sql.AnalysisException: Table not found: `bi_ods`.`owms_m_locator`;


SQLContext查询异常

解决:

SQLContext sqlContext = new SQLContext(sc);

替换为:

HiveContext hiveContext = new HiveContext(sc);

2. Exception in thread "main" java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package

解决:

javax.servlet相关包重复导入引起的

hadoop-client或hadoop-common排除java.servelt等包

<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-client</artifactId>
			<version>2.6.4</version>
			<exclusions>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>*</artifactId>
				</exclusion>
			</exclusions>
		</dependency>


五. SQLContext和HiveContext区别和联系

Spark SQL程序的主入口是SQLContext类或它的子类。创建一个基本的SQLContext,你只需要SparkContext

除了基本的SQLContext,也可以创建HiveContext。SQLContext和HiveContext区别与联系为:

SQLContext现在只支持SQL语法解析器(SQL-92语法)

HiveContext现在支持SQL语法解析器和HiveSQL语法解析器,默认为HiveSQL语法解析器,用户可以通过配置切换成SQL语法解析器,来运行HiveSQL不支持的语法。

使用HiveContext可以使用Hive的UDF,读写Hive表数据等Hive操作。SQLContext不可以对Hive进行操作。

Spark SQL未来的版本会不断丰富SQLContext的功能,做到SQLContext和HiveContext的功能容和,最终可能两者会统一成一个Context

HiveContext包装了Hive的依赖包,把HiveContext单独拿出来,可以在部署基本的Spark的时候就不需要Hive的依赖包,需要使用HiveContext时再把Hive的各种依赖包加进来。

SQL的解析器可以通过配置spark.sql.dialect参数进行配置。在SQLContext中只能使用Spark SQL提供的”sql“解析器。在HiveContext中默认解析器为”hiveql“,也支持”sql“解析器。

详情见:SQLContext和HiveContext区别与联系


代码下载地址:Java + Spark SQL + Hive + Maven简单实例代码



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Hive on Spark是一种将HiveSpark结合起来使用的方式,可以提高数据处理的效率和性能。下面是配置Hive on Spark的步骤: 1. 配置Maven 首先需要安装Maven,并配置好环境变量。可以在Maven官网下载最新版本的Maven。 2. 编译Spark 下载Spark源码,使用Maven编译Spark。在Spark源码目录下执行以下命令: mvn -DskipTests clean package 编译完成后,在target目录下可以找到编译好的Spark包。 3. 配置Hive 下载Hive源码,使用Maven编译Hive。在Hive源码目录下执行以下命令: mvn clean package -DskipTests -Pspark 编译完成后,在packaging/target目录下可以找到编译好的Hive包。 4. 配置SparkHive的环境变量 在.bashrc或.bash_profile文件中添加以下环境变量: export SPARK_HOME=/path/to/spark export HIVE_HOME=/path/to/hive 5. 配置Hive on SparkHive的conf目录下创建hive-site.xml文件,并添加以下配置: <property> <name>hive.execution.engine</name> <value>spark</value> </property> 6. 启动Hive on Spark 使用以下命令启动Hive on Spark: $HIVE_HOME/bin/hive --service sparkthriftserver 启动成功后,可以使用JDBC连接到Hive on Spark,并执行SQL语句。 ### 回答2: Hive on Spark是将HiveSpark结合起来使用的一种方式,通过Hive on Spark可以在Spark执行引擎上执行HiveSQL语句,实现更好的性能和可伸缩性。在使用Hive on Spark之前,需要先进行一些配置和编译工作。 首先是配置Maven,需要在pom.xml文件中添加SparkHive on Spark的依赖。在配置Spark时,需要注意Spark的版本与Hive on Spark的版本的匹配,以避免出现兼容性问题。接下来需要在SparkHive的配置文件中,分别配置Spark的Master地址和Hive的元数据存储地址。 然后进行Spark的编译工作,可以通过maven命令将spark源代码打包成jar文件。在编译过程中,需要根据实际情况添加必要的Spark插件和依赖项,以确保编译成功并与Hive on Spark兼容。 最后进行Hive的配置工作,需要在hive-site.xml文件中配置Hive on Spark的参数,如spark.master,spark.executor.memory等参数,以达到最优的运行效果。 总之,Hive on Spark的配置涉及多个方面,需要正确配置Maven依赖、SparkHive配置、进行Spark的编译和进行Hive的参数配置,才能使Hive on Spark正常运行。配置过程中需要注意兼容性问题,以避免出现不必要的错误。 ### 回答3: Hive on Spark是基于Apache Spark的开源数据处理平台。用于支持对Hive进行实时查询和复杂分析的工具。为了配置Hive on Spark,需要以下步骤: 1.配置Maven 在进行Hive on Spark配置之前,需要先安装MavenMaven是一个用于管理Java项目的构建工具,它可以轻松地管理spark-core和spark-sql等包,从而方便Hive on Spark的使用。 2.编译SparkSpark官网下载源代码后,运行以下命令进行编译: ``` build/mvn -DskipTests clean package ``` 以上命令会跳过所有测试,并将代码打包成可执行的JAR文件。 3.配置Hive 在进行Hive on Spark配置前,需要先安装Hadoop和Hive。安装好后,进行以下配置: 在hive-site.xml文件中添加以下配置: ``` <property> <name>hive.execution.engine.spark</name> <value>true</value> </property> <property> <name>spark.master</name> <value>local[*]</value> </property> <property> <name>spark.executor.memory</name> <value>2g</value> </property> ``` 4.将Spark包添加到Hive中 在Hive服务器上,进入Hive源代码目录,执行以下命令来将Spark包添加到Hive中: ``` ./build/dist/bin/addSbtPlugin.sh ``` 运行上述命令后,Spark包将被添加到Hive中。 5.使用Hive on Spark 现在,可以启动Hive并开始使用Hive on Spark。运行以下命令: ``` hive --hiveconf hive.execution.engine=spark ``` 以上就是Hive on Spark配置的过程。Maven管理Spark编译过程的包便于Hive on Spark使用和扩展。通过这些步骤,您可以轻松地开始使用Hive on Spark,从而帮助您更好地分析和管理数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值