当前位置:   article > 正文

Window使用idea操作spark连接hive_idea中通过spark访问hive的详细案例

idea中通过spark访问hive的详细案例

首先说下这样做的好处,不用每次都打成jar包在集群测试,直接在本地就可以测试。

平台环境:hadoop 2.6.0-CDH5.7 Hive 1.1.0 Spark 1.6.0 Scala 2.11.5

项目环境:jdk 1.8 scala2.11.0

1.创建新工程
1.创建一个maven工程,不做赘述。

工程目录结构如下:
在这里插入图片描述

2.配置环境
1.左上角File ->Project Structure ->Modules

添加依赖环境 scala-sdk-2.11.0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.选中刚才下的scala-sdk-2.11.0 ->Add selected 添加
在这里插入图片描述

回到 project structure->Apply。工程环境即可看到scala-sdk-2.11.0

在这里插入图片描述

3.在Project Structuer 添加 scala 文件夹

右击main->New Folder 命名为scala
在这里插入图片描述

选中scala文件夹 点击上面Sources,一定要设置,不然无法在scala目录下创建scala Class

点击Aplly

创建scala object

4.配置本地HADOOP_HOME

下载winutils的windows的版本,地址:https://github.com/srccodes/hadoop-common-2.2.0-bin,直接下载此项目的zip包,下载后是文件名是hadoop-common-2.2.0-bin-master.zip,随便解压到一个目录 例如:(D:\profile\)

方法1:加入代码

System.setProperty(“hadoop.home.dir”, “D:\profile\hadoop-common-2.2.0-bin-master”)

方法2:设置环境变量

增加用户变量HADOOP_HOME,值是下载的zip包解压的目录(D:\jars\hadoop-common-2.2.0-bin-master),然后在系统变量path里增加%HADOOP_HOME%\bin 即可

原因:程序需要根据HADOOP_HOME找到winutils.exe,由于win并没有配置该环境变量,所以程序报 null\bin\winutils.exe

5.配置pom.xml

<properties>
    <spark.version>1.6.0</spark.version>
    <scala.version>2.10</scala.version>
</properties>


<dependencies>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_${scala.version}</artifactId>
    <version>${spark.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming_${scala.version}</artifactId>
    <version>${spark.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_${scala.version}</artifactId>
    <version>${spark.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_${scala.version}</artifactId>
    <version>${spark.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-mllib_${scala.version}</artifactId>
    <version>${spark.version}</version>
</dependency>
</dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

6.将hive-conf下hive-site.xml;hadoop-conf下core-site.xml;hdfs-conf下hfds-site.xml 放入工程目录resources下
将hive-site.xml复制到Spark-Home/conf目录下 重启集群生效

3.测试代码

import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.{SparkConf, SparkContext}


object App {
  def main(args: Array[String]): Unit = {
    System.setProperty("hadoop.home.dir", "D:\\profile\\hadoop-common-2.2.0-bin-master")

    val conf = new SparkConf().setAppName("firstsparkapp").setMaster("local[*]")
    val sc = new SparkContext(conf)
    val hiveContext = new HiveContext(sc)

    hiveContext.sql("use database_name")
    hiveContext.sql("select * from user").show()
    sc.stop()

  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

如果运气好,你的win配置和集群配置都配过会一次跑通,控制台会打印出user表的内容

报错
1:idea scala SDK版本需要与依赖scala jar包保持一致
报错:java.lang.NoSuchMethodError:scala,predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;

ERROR Shell: Failed to locate the winutils binary in the hadoop binary path
可能原因:上述配置环境2.4处没配置正确。

java.lang.RuntimeException: java.lang.RuntimeException: The root scratch dir: /tmp/hive on HDFS should be writable.
修改hdfs上/tmp/hive 文件夹权限

[root@n1 ~]# hadoop fs -chmod -R 777 /tmp/hive
  • 1

在hdfs-site.xml 添加如下内容,或者将你的dfs.permissinos 设为false。(目的:关闭hdfs的权限检查,在操作hdfs上的文件时不对当前用户做权限检查)

<property>

<name>dfs.permissions</name>

<value>false</value>

</property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

修改重启集群生效

不识别hive-site.xml配置的主机名
需要在hosts文件做映射

C:\Windows\System32\drivers\etc\hosts 文末添加如下内容

192.168.1.181 n1

192.168.1.182 n2

192.168.1.183 n3

无法删除 spark临时文件
ERROR ShutdownHookManager: Exception while deleting Spark temp dir: C:\Users\wgh\AppData\Local\Temp\spark-2920e89f-1a08-4f9a-b684-96a38637c3ee

不影响,win连接spark的bug

Permission denied: user=root, access=WRITE, inode=”/user”:hdfs:supergroup:dr
这个问题的原因是因为Idea在执行程序时,使用了系统用户作为向Hadoop进行写的用户了。比如,你的电脑系统用户是:administrator,而你的Hadoop用户是:hadoop,用户不一样,所以写不进去。

解决办法:设置“HADOOP_USER_NAME=hadoop”为环境变量。
设置的办法有两个:

在Idea里进行设置,点上面的“Edit Configurations”,然后选择要执行的Application,在右边进行设置“Environment Variables”。

设置完后,可以用System.getenv()方法进行测试,看是否能读取到。

spark初学者,有不对的地方请大牛指点指点。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/987867
推荐阅读
相关标签
  

闽ICP备14008679号