本地IDEA远程连接hive的问题解决

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.

报错1
报错2
这里报了两个错,第一个错误很多人都是遇到过的,没有安装本地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------

报错3
可以看到没有写的权限,那我们就给它权限:
hadoop bin目录下执行:winutils.exe chmod 777 \tmp\hive
再执行程序:
这次可以连接hive了,直接显示出了结果:
结果
但是结尾会爆临时日志删除失败的error,但是并不影响程序,打包放到集群上运行没有任何错误,估计是spark的一个bug吧,所以放心大胆的去使用这种方法吧。
hadoop2.6.0下载地址
本地hadoop的插件百度网盘地址:
链接:https://pan.baidu.com/s/126nHNWLY28hefuzdG52Nog
提取码:iisf
复制这段内容后打开百度网盘手机App,操作更方便哦

猜你喜欢

转载自blog.csdn.net/qq_39719415/article/details/99735803