手记

Spark整合Hive过程及遇到的问题

Spark整合Hive过程及遇到的问题

一、前置步骤

安装MySQL,创建用户(当然也可以直接用root用户)并授权

CREATE USER 'bigdata'@'%' IDENTIFIED BY '123568'; 
GRANT ALL PRIVILEGES ON hivedb.* TO 'bigdata'@'%' IDENTIFIED BY '123568' WITH GRANT OPTION;
FLUSH PRIVILEGES;

二、将hive-site.xml放到$SPARK_HOME/conf目录下(可以不安装Hive,只要有配置文件就好了)

<configuration>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

<description>driver class</description>

</property>

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://127.0.0.1:3306/hive</value>

<description>mysql url</description>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>spark</value>

<description>bigdata</description>

</property>

<property>

  <name>javax.jdo.option.ConnectionPassword</name>

  <value>123568</value>

  <description>mysql passwd</description>

</property>

</configuration>

三、添加驱动jar包(当然你也可以在运行是指定)

将mysql-connector-java-5.1.28.jar添加到$SPARK_HOME/jars目录下,并在$SPARK_HOME/conf下的spark-defaults.conf中

添加如下语句:

spark.executor.extraClassPath     $SPARK_HOME/jars/mysql-connector-java-5.1.22.jar:$SPARK_CLASSPATH

四、启动spark-sql

spark/bin/spark-sql --master spark://briup-vm:7077


五、异常

1、启动之后就碰到了问题


com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes

一直报这个错,后面查到了是因为hive需要设置数据库字符集为latin

解决办法:

查看字符集设置

SHOW VARIABLES LIKE 'character%';

如果character_set_database的值不是latin1,执行如下语句:

alter database hivedb character set latin1;

再试着启动spark-sql,如果还是不行,就将hivedb删除,再创建hivedb,然后use hivedb,再执行alter database hivedb character set latin1;

正常启动之后,查看hivedb中的表,其中DBS表中的DB_LOCATION_URI 中的值是你在spark-sql中创建的表的位置,

如果你发现你的这个值不是hadoop集群中的值(格式如hdfs://....),说明你没有把HADOOP_CONF_DIR export到你的环境变量中,所以你要在你的

/etc/profile或者.bashrc中添加

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

(如果你没有配置HADOOP_HOME,也需要配置,按理说如果没配HADOOP_HOME,那应该就没有搭HADOOP集群2333....)

然后你可以修改DBS表中的DB_LOCATION_URI,改成一个hdfs路径,这样你的表就会存放在集群上了

六、建表

在spark-sql中建表

 create table t_boy(
         > id int,
         > name string,
         > age int)
         > row format delimited
         > fields terminated by ','
         > ;

在mysql中执行select * from TBLS;可以看到你建的表哦!


1人推荐
随时随地看视频
慕课网APP