操作系统:虚拟机中搭建的Ubuntu18.04
Spark版本:spark-2.3.0-bin-hadoop2.7
MySQL版本:
JDBC驱动压缩包:mysql-connector-java-8.0.16.jar
安装并使用MySQL的前提:已经安装好了Spark并且能正常运行。
MySQL的下载安装及配置:
1、MySQL的下载安装
Ubuntu系统中安装MySQL相当容易,只需要执行以下命令:
(1)更新apt-get命令:
sudo apt-get updata
(2)安装MySQL:
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
(3)安装MySQL的可视化图形界面(mysql workbench):可选,不安装也不影响使用
sudo apt-get install mysql-workbench
(4)配置MySQL:
执行命令:
sudo mysql_secure_installation
会进入MySQL的配置页面,在这里会设置root账户的密码等等,一共有6项配置,如下:
#1
VALIDATE PASSWORD PLUGIN can be used to test passwords...
Press y|Y for Yes, any other key for No: N (我的选项)#2
Please set the password for root here...
New password: (输入密码)
Re-enter new password: (重复输入)#3
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them...
Remove anonymous users? (Press y|Y for Yes, any other key for No) : N (我的选项)#4
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network...
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y (我的选项)#5
By default, MySQL comes with a database named 'test' that
anyone can access...
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : N (我的选项)#6
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y (我的选项)
配置结束后可以执行下面的命令进行检查:
systemctl status mysql.service
结果如下午所示即配置成功:
至此,MySQL的安装、配置就全部搞定了,好奇的小伙伴可以用命令行来操作一下刚刚装好的MySQL了!
PS:
启动MySQL数据库服务的命令:
service mysql start
进入MySQL的命令:
(1)进入root用户:
sudo mysql -u root -p
(2)进入普通用户:
mysql -u 用户名 -p
退出MySQL的命令:键入exit或者quit都可以,它会跟你Bye的。
停止MySQL数据库服务的命令:
service mysql stop
OK,接下来搞JDBC。
JDBC驱动包的下载及配置:
(1)JDBC的下载
jar包下载地址:https://dev.mysql.com/downloads/connector/j/
选择“Platform Independent”后会出现两个可以下载的压缩文件,随意选择其中一个下载即可。
(2)JDBC的配置:
下载后将其解压至spark安装目录下的jars文件夹中。
再将指定的数据库的JDBC驱动(我的是:mysql-connector-java-8.0.16.jar)包含在Spark的环境变量中,即:
在终端执行
spark-shell --jars /usr/local/spark-2.3.0-bin-hadoop2.7/jars/mysql-connector-java-8.0.16/mysql-connector-java-8.0.16.jar --driver-class-path /usr/local/spark-2.3.0-bin-hadoop2.7/jars/mysql-connector-java-8.0.16/mysql-connector-java-8.0.16.jar
使用JDBC连接MySQL数据库的步骤:
这里举一段代码为例:
//创建Properties类对象需要的包
scala> import java.util.Properties
import java.util.Properties
scala> val jdbcDF = spark.read
//识别读取的是JDBC数据源。
.format("jdbc")
//要连接的JDBC URL属性,其中student是创建的数据库名。
.option("url","jdbc:mysql://localhost:3306/student")
// driver部分是Spark SQL访问数据库的具体驱动类名。
.option("driver","com.mysql.cj.jdbc.Driver")
//dbtable部分是需要访问的student库中的表stu。
.option("dbtable","stu")
//user部分是用于访问mysql数据库的用户
.option("user","root")
//password部分是该用户访问数据库的密码
.option("password","mysql")
.load()
scala> jdbcDF.show()
+---+-------+----------+----------+---------+
| id|name|country| Height|Weight|
+---+-------+----------+----------+---------+
| 1| MI| china| 180.0| 60.0|
| 2| UI | UK| 160.0| 50.0|
| 3| DI | UK| 165.0| 55.0|
| 4| Bo| china| 167.0| 45.0|
+---+-------+----------+----------+---------+
问题总结:
1、连接数据库时,驱动类名网上很多写的都是"com.mysql.jdbc.Driver",但其实这个驱动类名现在已经更新了,输入这个驱动类名会报错,应该写为"com.mysql.cj.jdbc.Driver"。
2、安装好MySQL和JDBC后,在Spark中连接数据库时出现了问题,显示:Access denied for user 'root'@'localhost'
解决办法:
首先声明网上有很多解决这个问题的帖子、博客等等等等,但能尝试的我都尝试了一下,对我都不管用,但这里还是略微总结一下吧,毕竟踩了一天的坑:
(1)可能是账号密码没有输入正确。
(2)若账号密码都正确,可以回到MySQL数据库中,执行权限相关的操作:
GRANT ALL PRIVILEGES ON ComicFM.* TO 'root'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
更改完权限后,执行:
FLUSH PRIVILEGES;
上面这些都没能解决我的问题,最后我选择了重新建立一个MySQL的账户并为其分配相应的权限。
再次尝试连接时就成功了,截屏留念:
附上两个有用的链接:
MySQL查看并修改端口号:https://www.cnblogs.com/tianlangshu/p/5665290.html
命令行下创建MySQL数据库与创建用户以及授权:https://blog.csdn.net/sunzhenhua0608/article/details/80382960
参考博客:
《Ubuntu18.04 安装MySQL》:https://blog.csdn.net/weixx3/article/details/80782479
《Ubuntu安装mysql和简单操作》:https://www.cnblogs.com/zhuyp1015/p/3561470.html
《Ubuntu mysql安装,还有可视化界面》:https://www.cnblogs.com/sevenun/p/5565291.html
《pyspark 使用jdbc 连接mysql 数据库报错 Access denied for user 'root'@'localhost'》:https://www.cnblogs.com/Ray-Lei/p/9989664.html
《java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)错误原因》:https://blog.csdn.net/zhoudahuifbi/article/details/79871893
emmmmmm,最近重新在虚拟机里面装了一遍MySQL,到最后一步的时候碰到了新错误,记录如下:
连接数据库的时候报错:java.lang.NullPointerException
狗血原因如下:(我还来回看了两遍,都没有发现这个破错误)
忘记在箭头指示的地方加冒号(:)了,再见.jpg
为了防止以后再出现这种错误,干脆把这段代码记下来,省的以后再出别的问题:
val jdbcDF = spark.read.format("jdbc").option("url","jdbc:mysql://localhost:3306/student").option("driver","com.mysql.cj.jdbc.Driver").option("dbtable","stu").option("user","bhw-mysql").option("password","123456").load()