1:首先创建好一个maven项目,创建项目这一步我就不说了,如果不会的话请看我的另一篇博客,完成后在porm.xml中加入依赖,这里需要注意要有hadoop-client,且不使用默认的hhadoop-client版本。
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>1.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>1.6.0</version>
<exclusions>
<exclusion>
<!--默认是1.0.4版本,要去掉-->
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-hive -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>1.6.0</version>
</dependency>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
</dependencies>
我这里是1.6.0版本的,有版本匹配的可以直接copy
2:第一小步完成,下面随便写一个demo,并把hive-site.xml放到你的项目
resources目录下:
val conf = new SparkConf()
.setMaster("local").setAppName("test")
val sc = new SparkContext(conf)
println("程序start!")
val hiveContext = new HiveContext(sc)
hiveContext.sql(
"""
|show databases
""".stripMargin).show()
右键执行,报错如下:
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
这里报了两个错,第一个错误很多人都是遇到过的,没有安装本地local hadoop,在你的项目里没有涉及到与hadoop有关的内容时这个错误对程序本身没有任何影响,但是当涉及到需要连接hadoop时就必须安装本地local hadoop,第二个错误也是由于没有安装本地hadoop导致的,所以
2:安装本地hadoop
下载hadoop2.6.0(你自己对应的hadoop版本)的tar包,解压到本地的某个目录,这里由于是本地的windows hadoop,因此需要一些额外的插件,下载插件解压后把winutils.exe、hadoop.dll放到hadoop的bin目录下,(插件稀缺资源啊,找了大半天,所有的资源我都放最后面,这里是适用于hadoop2.4以上的,在github上有hadoop2.2的,适用于hadoop2-hadoop2.4以下的版本)
再执行上面的demo程序,这里要配置环境变量,或者用于测试的话先直接把环境path写死在程序中
System.setProperty("hadoop.home.dir", "D:\\hadoopHome\\hadoop-2.6.0")
val conf = new SparkConf()
.setMaster("local").setAppName("test")
val sc = new SparkContext(conf)
println("程序start!")
val hiveContext = new HiveContext(sc)
hiveContext.sql(
"""
|show databases
""".stripMargin).show()
}
然而又报错:
Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: The root
scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rwx------
可以看到没有写的权限,那我们就给它权限:
hadoop bin目录下执行:winutils.exe chmod 777 \tmp\hive
再执行程序:
这次可以连接hive了,直接显示出了结果:
但是结尾会爆临时日志删除失败的error,但是并不影响程序,打包放到集群上运行没有任何错误,估计是spark的一个bug吧,所以放心大胆的去使用这种方法吧。
hadoop2.6.0下载地址
本地hadoop的插件百度网盘地址:
链接:https://pan.baidu.com/s/126nHNWLY28hefuzdG52Nog
提取码:iisf
复制这段内容后打开百度网盘手机App,操作更方便哦