spark连接hive(spark-shell和eclipse两种方式)
我的原创地址:http://dongkelun.com/2018/03/25/sparkHive/
1、在服务器(虚拟机)spark-shell连接hive
1.1 将hive-site.xml拷贝到spark/conf里
cp /opt/apache-hive-2.3.2-bin/conf/hive-site.xml /opt/spark-2.2.1-bin-hadoop2.7/conf/
1.2 将mysql驱动拷贝到spark/jar里
cp /opt/apache-hive-2.3.2-bin/bin/mysql-connector-java-5.1.46-bin.jar /opt/spark-2.2.1-bin-hadoop2.7/jars/
1.3 启动spark-shell,输入代码测试
spark-shell import org.apache.spark.sql.hive.HiveContext val hiveContext = new HiveContext(sc) hiveContext.sql("select * from test").show()
1.4 异常及解决
在执行hiveContext.sql(“select * from test”).show() 报了一个异常:
The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rwxr-xr-x;
解决办法:
1.4.1 更改HDFS目录/tmp/hive的权限:
hadoop fs -chmod 777 /tmp/hive
1.4.2 同时删HDFS与本地的目录/tmp/hive:
hadoop fs -rm -r /tmp/hive rm -rf /tmp/hive
这次错误采用的是第二种解决办法,有的情况下用第一种方法,比如一次在启动hive时候报这种错误~。
错误截图:
参考:http://www.cnblogs.com/czm1032851561/p/5751722.html
2、win10+eclipse上连接hive
2.1 将hive-site.xml拷贝到项目中的resources文件夹下
2.2 在sbt里添加对应版本的mysql依赖
"mysql" % "mysql-connector-java" % "5.1.46"
2.3 代码
2.3.1 旧版api(1.6以上)
package com.dkl.leanring.spark.sql import org.apache.spark.SparkConf import org.apache.spark.sql.SQLContext import org.apache.spark.sql.hive.HiveContext import org.apache.spark.SparkContext /** * 旧版本spark-hive测试 */ object OldSparkHiveDemo { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("OldSparkHiveDemo").setMaster("local") val sc = new SparkContext(conf) val sqlContext = new SQLContext(sc) import sqlContext.implicits._ val hiveCtx = new HiveContext(sc) hiveCtx.sql("select * from test").show() val data = Array((3, "name3"), (4, "name4"), (5, "name5")) val df = sc.parallelize(data).toDF("id", "name") df.createOrReplaceTempView("user") hiveCtx.sql("insert into test select id,name from user") hiveCtx.sql("select * from test").show() } }
(注:其中df.createOrReplaceTempView(“user”)改为df.registerTempTable(“user”),因为createOrReplaceTempView方法是2.0.0才有的,registerTempTable是旧版的方法,1.6.0就有了,嫌麻烦就不改代码重新贴图了)
2.3.2 新版api
package com.dkl.leanring.spark.sql import org.apache.spark.sql.SparkSession /** * 新版本spark-hive测试 */ object NewSparkHiveDemo { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() .appName("Spark Hive Example") .master("local") .config("spark.sql.warehouse.dir", "/user/hive/warehouse/") .enableHiveSupport() .getOrCreate() import spark.implicits._ import spark.sql sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)") val data = Array((1, "val1"), (2, "val2"), (3, "val3")) var df = spark.createDataFrame(data).toDF("key", "value") df.createOrReplaceTempView("temp_src") sql("insert into src select key,value from temp_src") sql("SELECT * FROM src").show() } }
2.4 异常及解决方法
在执行insert语句时会出现如下异常信息:
org.apache.hadoop.security.AccessControlException: Permission denied: user=dongkelun, access=EXECUTE, inode="/user/hive/warehouse":root...
原因是:启动 Spark 应用程序的win用户对spark.sql.warehouse.dir没有写权限
解决办法:
hadoop fs -chmod 777 /user/hive/warehouse/
附异常信息截图:
3、更新:写hive方法
直接用下面这句代码即可将df里的全部数据存到hive表里
df.write.mode(SaveMode.Append).saveAsTable(tableName)
4、更新(2018.11.29)
4.1 关于hive-site.xml
上面讲的hive-site.xml为我在博客centos7 hive 单机模式安装配置配置的。
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.44.128:3306/hive_metadata?&createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>Root-123456</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>datanucleus.schema.autoCreateAll</name> <value>true</value> </property> <property> <name>hive.metastore.schema.verification</name> <value>false</value> </property> </configuration>
后来在工作中发现可以不用将整个hive-site.xml全部拷过来,用一个metastore就可以搞定~
用下面的命令启动metastore
nohup hive --service metastore &
在nohup.out文件里看一下启动日志,如果启动成功的话,就可以将hive-site.xml改为
<configuration> <property> <name>hive.metastore.uris</name> <value>thrift://192.168.44.128:9083</value> </property> </configuration>
这样就可以用上面讲的代码连接Hive了,一般我都是用这种方式连接Hive,至于优缺点我没有深入研究,表面上看起来有两点
- 配置比较简单
- 不用暴漏元数据库mysql的用户名、密码等。
如何关闭metastore(Linux基础)
-bash-4.2# ps aux | grep metastore root 8814 2.6 6.2 2280480 240040 pts/0 Sl 03:10 0:18 /opt/jdk1.8.0_45/bin/java -Xmx256m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.7.5/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/opt/hadoop-2.7.5 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,console -Djava.library.path=/opt/hadoop-2.7.5/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Xmx512m -Dhadoop.security.logger=INFO,NullAppender org.apache.hadoop.util.RunJar /opt/apache-hive-2.3.2-bin/lib/hive-metastor-2.3.2.jar org.apache.hadoop.hive.metastore.HiveMetaStore root 9073 0.0 0.0 114724 984 pts/0 S+ 03:22 0:00 grep --color=auto metastore -bash-4.2# kill 8814
4.2 另一个读取hive表的简单方法
用下面这行代码就可以读取整个Hive表了
spark.table("test")
4.3 关于上面的代码
下面这个配置可以去掉
.config("spark.sql.warehouse.dir", "/user/hive/warehouse/")

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
centOS安装hadoop、编写wordCount小程序
#为了方便后续管理,添加hadoop用户,并设置密码 adduser hadoop passwd hadoop #hadoop用户赋权(加sudo可以执行root的操作) #给sudoers文件读写权 chmod u+w /etc/sudoers #赋权 vim /etc/sudoers #在root ALL = (ALL) ALL 下添加 hadoop ALL=(ALL) ALL 并保存 #为了安全撤销写权限 chmod u-w /etc/sudoers 用户赋权 hadoop依赖1.7+的jdk 如果是3.0+版本的hadoop依赖1.8+的idk,安装jdk #安装jdk 这边我通过ftp把jdk1.8 tar包传到服务器 #进入相应目录解压 cd /usr/local/tools tar -zxvf jdk-8u171-linux-x64.tar.gz #配置环境变量 sudo vim /etc/profile #文件中添加 JAVA_HOME=/usr/local/tools/jdk1.8.0_171 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=$...
- 下一篇
四大行的CIO们如何看待大数据
中国建设银行 中国建设银行信息技术管理部资深经理林磊明 1、银行压力越来越大 从十二五走到十三五期间,银行业面临的各方面的压力越来越大,从我们的年报数字可以看出去年四大行的利润增长基本上趋近于零增长。在这样的情况下,我们怎样通过IT的引领提升传统银行的竞争力,这是摆在我们面前的一个很重要的课题。 2、过去十多年期间,银行业务出现两个拐点 大数据怎么样能够在智慧银行的方向上起到更大的作用呢? 通过银行的历程佐证这样一个观点。过去十多年期间银行基本上有两个拐点: 第一个拐点就是发生在互联网银行慢慢取代柜员,IT支持从支持几万十几万的柜员到支持面向所有的互联网客户,这里面发生了一个根本性的变化,无论是服务的形态还是IT的支撑,都发生了很根本的变化,这是移动和云要在里面发挥作用。 下一个拐点是什么?银行要从原来做的账务性的、交易性的处理转向能够渗透到经济生活的方方面面,这是一个场景化,如果抓不住这个拐点,银行就要被互联网金融颠覆或者管道化。 3、三大互联网渠道已建立,具备大数据基础 这几年银行三大互联网渠道已经建立: 手机银行,已达到1.8亿多 网上银行,我们有2亿 微信银行,它占的客服服务总...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Linux系统CentOS6、CentOS7手动修改IP地址