在spark集群中通过hive访问mysql数据库


1. 相关知识
1) hive:是一种基于hdfs的数据仓库,提供类似sql的语句来操作hdfs上的数据
2) hive创建数据库、表,它会在hive.metastore.warehouse.dir目录下创建与数据库或表的名字相应的目录(参考 https://my.oschina.net/winHerson/blog/190131
3) hive从文件中导入数据到hive的表中的时候,实际上是把文件移动到表的目录之下
4) 元数据:存储hive的数据库名、表名、表结构等逻辑信息的数据
5) hive的表分为普通表和外部表;删除外部表只是删除了外部表的元数据(参考 http://www.aboutyun.com/thread-7458-1-1.html
6) hive的元数据保存模式:
①derby模式:这是默认的启动模式,以内嵌的derby数据库保存hive的元数据,只允许一个会话连接
②local模式(mysql为例):以本机的mysql数据库保存元数据;通过网络连接到一个数据库中,是最经常使用到的模式
③remote模式(mysql为例):
以远程mysql数据库保存元数据;
启动hive之前需要启动hive metastore server;
在服务器端启动一个 MetaStoreServer,客户端利用 Thrift 协议通过 MetaStoreServer 访问元数据库

2. 安装mysql(local模式与remote模式)
1) 查看系统当前是否已安装mysql
rpm -qa | grep mysqk # 列出和mysql相关的包,本机的结果只有一条 mysql-libs-5.1.66-2.el6_3.x86_64
2) 卸载已安装的 mysql 包
rpm -e mysql-libs-5.1.66-2.el6_3.x86_64 # 普通删除模式
rpm -e --nodeps mysql-libs-5.1.66-2.el6_3.x86_64 # 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除
3) 查看yum提供的mysql相关安装包
yum list | grep mysql
4) 通过yum的方式安装
yum install -y mysql-server mysql mysql-devel #安装 mysql,mysql-server 和 mysql-devel
5) 设置root用户的登录密码
mysqladmin -u root password 'XXX'
6) 登录root用户
mysql -u root -p
7) 配置
/etc/my.cnf # mysql的主配置文件;
/var/lib/mysql # mysql数据库的数据库文件存放位置;
/var/log # mysql数据库的日志输出存放位置;

3. 创建用于 hive 操作的 mysql 账号(local模式与remote模式)
1) mysql -u root -p #使用root账户登录mysql
2) create user 'zzls' identified by 'XXX';
3) grant all privileges on *.* to 'zzls' with grant option;
4) flush privileges;

4. 配置hive的环境
1) 安装spark集群(参考http://blog.csdn.net/ronaldo4511/article/details/52886672)
2) 安装hive
① 从 https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-2.1.0/ 下载hive-2.1.0
② 解压安装包: tar xzvf apache-hive-2.0.1-bin.tar.gz
③ 设置hive的环境变量
sudo gedit /etc/profile #打开profile文件
#添加以下内容
export HIVE_HOME=/usr/mywork/software/hive210
export PATH=$PATH:$HIVE_HOME/bin
④ 在 hive_home/conf 目录下创建文件 hive-site.xml
⑤ 如果要配置remote-mysql模式,需要把hive拷贝到非master机器
scp -r /usr/mywork/software/hive210 pa://usr/mywork/software
scp -r /etc/profile pa://etc/profile
3) 配置 hive-site.xml
① derby 模式:在spark集群的 master 机器 的 hive-site.xml 文件中添加如下内容
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- derby 模式的配置-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:/usr/mywork/software/hive210/metastore_db;create=true</value>
<description>JDBC connect string for a JDBC metastore;'value' represents a local path</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/spark/hive210/warehouse</value>
<description>location of default database for the warehouse;'value' represents a hdfs path</description>
</property>
<property>
<name>hive.execution.engine</name>
<value>spark</value>
<description>set hive engine</description>
</property>
</configuration>
② local 模式:在spark集群的 master 机器 的 hive-site.xml 文件中添加如下内容
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/spark/hive/warehouse</value>
<description>location of default database for the warehouse;'value' represents a hdfs path</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/spark/hive/log</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://pmaster:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>zls</value><-- 这里的用户名是mysql数据库中mysql database的user表中一个用户名 -->
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>XXX</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.execution.engine</name>
<value>spark</value>
<description>set hive engine</description>
</property>
</configuration>
③ remote 模式:在spark集群的 master 机器 的 hive-site.xml 文件中添加同上内容
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://pmaster:9083</value>
</property>
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>
</configuration>

5. 配置 mysql 驱动包(local模式与remote模式)
1) 从 http://dev.mysql.com/downloads/connector/j/5.1.html 下载 Platform Independent 的 mysql-connector-java-5.1.40.tar.gz
2) 解压:tar -xzvf mysql-connector-java-5.1.40.tar.gz
3) 拷贝 mysql-connector-java-5.1.40-bin.jar 到 hive_home/lib目录下

6. hive的初始化与启动(参考 http://www.micmiu.com/bigdata/hive/hive-metastore-config/
1) 内嵌Derby方式
执行初始化命令:schematool -dbType derby -initSchema(需要重新初始化时,删除 /usr/mywork/software/hive210/metastore_db 文件夹即可)
查看初始化后的信息: schematool -dbType derby -info
2) Local方式(以mysql为例)
执行初始化命令:schematool -dbType mysql -initSchema
查看初始化后信息 schematool -dbType mysql -info
3) Remote方式(以mysql为例)
执行初始化命令:schematool -dbType mysql -initSchema
启动hive metastore server:hive --service metastore &
服务器启动hive:hive
客户端启动hive:hive_home/bin/hive

7. hive 命令
1) 创建表
create table people(name string,age int) row format delimited fields terminated by ',' lines terminated by '\n';
2) 导入本地文件的数据
load data local inpath '/home/zls/Desktop/tbldate' into table tbldate;
3) 导入hdfs文件的数据
load data inpath 'pmaster:9000/spark/sql/tbldate' into table tbldate;

8. spark sql 连接hive+mysql 的代码例子(参考 https://www.iteblog.com/archives/1560
package spark_sql

import java.util.Properties

import org.apache.spark.sql.{SQLContext, SparkSession}

/**
  * Created by zls on 16-12-1.
  */
object AccessMysql {

  def start = {
    val spark = SparkSession
      .builder()
      .appName("Spark Hive Example")
      .enableHiveSupport()
      .getOrCreate()
    f1(spark.sqlContext)
    //f2(spark.sqlContext)
  }

  /**
    * call this method only if
    * 1. copy hite-site.xml to spark_home/conf
    * 2. submit like below
    *   spark-submit --master spark://pmaster:7077 --class testy.MyEntry /usr/mywork/project/scala/NonSBTProject/out/artifacts/NonSBTProjectJar/NonSBTProject.jar
    */
  def f1(sqlContext: SQLContext) = {
    val df = sqlContext.sql("show databases")
    df.show
  }

  /**
    * call this method if
    * 1. spark_home/conf doesn't contain hite-site.xml
    * 2. submit like below
    *   spark-submit --master spark://pmaster:7077 --jars /usr/mywork/software/mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar --class testy.MyEntry /usr/mywork/project/scala/NonSBTProject/out/artifacts/NonSBTProjectJar/NonSBTProject.jar
    */
  def f2(sqlContext: SQLContext) = {
    val dbtype = "jdbc:mysql"
    val host = "pmaster:3306"
    val db = "zls"
    val user = "zzls"
    val pw = "XXX"
    val url = dbtype + "://" + host + "/" + db + "?user=" + user + "&password=" + pw
    val table = "people"

    val df = sqlContext.read.jdbc(url, table, new Properties)
    df.show
  }

}


9. 可能的错误
1) 启动hive的时候出现如下错误
java.sql.SQLException: Access denied for user 'mysql username'@'master machine hostname' (using password: YES)
解决方法:删除 mysql 的root 用户下 mysql 数据库的 user 表中 用户名为空的用户
mysql -u root -p
use mysql;
delete from user where user='';
2) 初始化或者重新初始化 hive 的时候出现如下错误
Duplicate key name 'PCS_STATS_IDX' (state=42000,code=1061)
解决方法:删除 mysql 的hive用户下 名为hive的数据库
mysql -u zzls -p
drop database hive;
3) 使用 idea 编写操作 mysql 存储模式的hive 的工程,通过以下命令
spark-submit --master spark://pmaster:7077 --jars /usr/mywork/software/mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar --class testy.MyEntry
向spark集群提交任务时,出现 ClassNotFoundException: com.mysql.jdbc.Driver 错误时
解决方法一:
① 把jar添加到spark_home/jars目录下;
② 添加jar参数提交
spark-submit --master spark://pmaster:7077 --jars /usr/mywork/software/mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar --class testy.MyEntry /usr/mywork/project/scala/NonSBTProject/out/artifacts/NonSBTProjectJar/NonSBTProject.jar
解决方法二:(参考 http://www.lxway.com/91422142.htm
① 将 $HIVE_HOME/conf/hive-site.xml 拷贝至 $SPARK_HOME/conf/ 目录下
② 提交
spark-submit --master spark://pmaster:7077 --class testy.MyEntry /usr/mywork/project/scala/NonSBTProject/out/artifacts/NonSBTProjectJar/NonSBTProject.jar


参考
http://www.cnblogs.com/payton/p/5843280.html
http://blog.csdn.net/blue_jjw/article/details/50479263
http://dev.mysql.com/downloads/connector/j/5.1.html

猜你喜欢

转载自blog.csdn.net/ronaldo4511/article/details/53412190