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;可以看到你建的表哦!