spark的hive操作和常见的bug

参考官网:http://spark.apache.org/docs/latest/sql-data-sources-hive-tables.html

package hive

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

object HiveDome {
  def fun1(): Unit = {
    val conf = new SparkConf().setAppName("hive1")
    val spark = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()

    import spark.sql
    //创建件hive表
    sql("create table if not exists user3(id int,value String) row format delimited fields terminated by ','")
    sql("load data local inpath '/user.log' into table user3")

    sql("select * from user").show()
    sql("select count(*) from user").show()

    val sqlDF = sql("select key,value from user where key<10 order BY key")
    import spark.implicits._    //隐式转化
    val stringDS = sqlDF.map { case org.apache.spark.sql.Row(id: Int, value: String) => s"key:$id,value:$value" }
    stringDS.show()
    spark.stop()
  }

  def main(args: Array[String]): Unit = {
    fun1()
  }
}

写完之后在idea 打成jar包,将jar包写到liunx下的根目录下

然后配置环境

1.把hive的配置 hive-site.xml 复制到 spark/conf 
    cp /usr/hive/apache-hive-2.3.3-bin/conf/hive-site.xml   /usr/spark/spark-

2.1.1-bin-hadoop2.7/conf/
       
2.把mysql的驱动jar放入到 spark/spark-2.1.1-bin-hadoop2.7/jars/ 
    mysql-connector-java-5.1.38.jar

3.修改spark-env.sh文件 
    export SPARK_CLASSPATH=$SPARK_CLASS:$SPARK_HOME/jars/mysql-connector-java-5.1.38.jar

4.在集群上执行
    spark-submit --master spark://zhiyou01:7077 --class 类名的全称    --total-executor-cores 2 --executor-memory 512m /jar包路径

如果不配置环境会出现以下错误

Exception in thread "main" java.lang.UnsupportedOperationException: loadTable is not implemented

运行过程出现的bug:

1> Got exception: org.apache.hadoop.ipc.RemoteException Operation category READ is not supported in state standby

原因:我的机器是spark的MASTER是nameNode,另外一个work是nameNode,  但是运行执行 spark-submit提交的进程时,主机(master和nameNode的机器)的nameNode会挂掉,而且主机的nameNode一直都是备用状态,然后就回报这个错误, 主机的nameNode重新启动还是报这个错,最后将主从切换下

//将主机的nameNode切换成active  如果切换后再次执行还是报这个错,可以将第二个nameNode的进程给杀掉在启动执行

hdfs haadmin --transitionToActive nn1    //nn1是nameNode的名字

2>io错误,说是hdfs下的user.log文件不存在,意思就是在想hive中加载数据的时候,需要先将user.log数据加载到hdfs上,然后在穿件hive与数据创建关联;但是加载失败,因为说hdfs下找不见user.log文件,但是网页中又能查看的到一些文件的数据,说明hdfs处于一个安全的保护状态(就是集群在重启或是升级的时候会进入一个安全保护的状态,只能查看文件,但是不能对文件进行修改或添加文件的操作)

 解决方法

//hadoop刚启动或是升级会进入安全模式,只能读文件,不能写文件
命令:  hadoop dfsadmin -safemode get  查看安全模式状态
命令:  hadoop dfsadmin -safemode enter    进入安全模式状态
命令:  hadoop dfsadmin -safemode leave   离开安全模式
原文地址:https://www.cnblogs.com/han-guang-xue/p/10041150.html