Spark On Hive 配置
配置
1、将Hive-site.xml复制到Spark/conf目录下
如果hive-site中配置了查询引擎,需要将其注掉
<!-- <property> <name>hive.execution.engine</name> <value>tez</value> </property> -->
2、将把 Mysql 的驱动 mysql-connector-java-5.1.27-bin.jar copy 到 Spark/jars/目录下
3、保险起见,可将core-site.xml和hdfs-site.xml 拷贝到Spark/conf/目录下
4、如果hive中表是采用Lzo或snappy等压缩格式,需要配置spark-defaults.conf,详情参考https://www.cnblogs.com/yangxusun9/p/12827957.html#fneQWfJQ,或者直接将lzo包拷贝到jars目录下
花式连接
利用spark-sql 来代替 hive
最普遍的应用就是在脚本中, 用 ''spark-sql --master yarn '' 来代替 " hive",来提高运行速度
开启thriftserver服务,利用beeline连接
开启thriftserver服务
sbin/start-thriftserver.sh \ --master yarn \ --hiveconf hive.server2.thrift.bind.host=hadoop102 \ ##默认 -–hiveconf hive.server2.thrift.port=10000 \ ##默认
使用beeline
bin/beeline # 然后输入 !connect jdbc:hive2://hadoop102:10000 # 然后按照提示输入用户名和密码
利用第三方工具(如IDEA)连接
添加依赖
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.11</artifactId> <version>2.1.1</version> </dependency>
配置文件
保险起见,把core-site.xml,hdfs-site.xml,hive-site.xml都拷贝到Rsource目录下
代码
注意,此时又可能会报权限不足的错 org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied:
需要在代码首行添加用户名
object JDBCDemo { def main(args: Array[String]): Unit = { System.setProperty("HADOOP_USER_NAME", "guigu")//!!!解决权限报错 val conf = new SparkConf().setAppName("JDBCDemo$").setMaster("local[*]") val spark = SparkSession.builder().config(conf) .enableHiveSupport()//!!!!默认不支持外部hive,这里需调用方法支持外部hive .getOrCreate() import spark.implicits._ spark.sql("use gmall") spark.sql("show tables").show() } }
对hive中的表进行读写操作
读按照上面代码就可以进行正常操作,但是写的时候需要注意,创建数据库时数据库位置需要提前声明,不然就是在本地创建,创建表则不用声明
如果之前导入了core-site,需要将其中的lzo配置注掉,并且在指定文件位置时会默认集群位置,如果要用本地,就用 file://
object ConnectDemo { def main(args: Array[String]): Unit = { System.setProperty("HADOOP_USER_NAME", "guigu") val conf = new SparkConf().setAppName("ConnectDemo$").setMaster("local[*]") val spark = SparkSession .builder().config(conf) .enableHiveSupport() //需指明数据库地址,不然就是在本地创建 .config("spark.sql.warehouse.dir", "hdfs://hadoop102:9000/user/hive/warehouse") .getOrCreate() import spark.implicits._ spark.sql("use spark1") // val df = spark.read.json("User") //第一列为 name:string 第二列为salary:long // spark.sql("drop table user") // df.printSchema() // df.write.mode(SaveMode.Append).saveAsTable("user") //saveAsTable写入,要求字段名字和数据类型与原表保持一致,字段顺序可随意 // val df1 = List((1000l, "ace"), (1011l, "jaek")).toDF("salary", "name") //这里数据类型必须跟原表保持一致 // df1.write.mode(SaveMode.Append).saveAsTable("user") //insertInto //要求字段数据类型和顺序必须保持一致,名字可随意,否则 // +------+------+ // | name|salary| // +------+------+ // | Andy| 4500| // |Justin| 3500| // | Berta| 4000| // | jaek| 1011| // | ace| 1000| // | 1000| null| // | 1011| null| // +------+------+ // val df1 = List((1000l, "ace"), (1011l, "jaek")).toDF("s", "n") // df1.write.insertInto("user") // 使用 hive的insert 语句 spark.sql("insert into table user values ('andy',5000)") spark.sql("select * from user").show() } }