您的位置:首页 > 其它

Window使用idea操作spark连接hive

2018-12-04 15:02 483 查看

首先说下这样做的好处,不用每次都打成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>

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()

}
}

如果运气好,你的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

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

<property>

<name>dfs.permissions</name>

<value>false</value>

</property>

修改重启集群生效

不识别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初学者,有不对的地方请大牛指点指点。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: