Bootstrap

ubuntu20.04.1安装java-hadoop-spark-python-hbase-mysql-kafka及伪分布式配置

这里我选择Hadoop2.7.0版本,java8版本,spark2.4.5版本,python3.6版本,hbase 1.2.0,MySQL8.0.23。注意以上版本对应关系不然安装后可能无法使用

 

1 安装ssh以及配置无密码登录

 

集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server:

 

输入如下命令:

$sudo apt-get update

$sudo apt-get install openssh-server       #一般的ubuntu不自带服务器的ssh,都有客服端的ssh,需要安装服务器端的ssh

$ssh localhost      #启动ssh

#下面配置无密码ssh登录

$cd ~/.ssh/      # 若没有该目录,请先执行一次ssh localhost,~表示用户的主文件夹

$ssh-keygen -t rsa     # 会有提示,一直按回车就可以

$cat ./id_rsa.pub >> ./authorized_keys    # 加入授权

此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了

 

2 安装java

打开终端

$cd /usr/lib

$sudo mkdir jvm             #创建/usr/lib/jvm目录用来存放JDK文件

$cd ~                     #进入hadoop用户的主目录

$cd Downloads                 #注意区分大小写字母,刚才已经通过FTP软件把JDK安装包jdk-8u162-linux-x64.tar.gz上传到该目录(downloads)下

$sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm         #把JDK文件解压到/usr/lib/jvm目录下

$cd ~

$gedit ~/.bashrc

打开了hadoop这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

保存.bashrc文件并退出

$source ~/.bashrc

$java -version                #查看是否安装成功

 

3 安装hadoop

打开hadoop文件包目录下的终端,输入以下代码显示安装成功

我们选择将 Hadoop 安装至 /usr/local/ 中:

$sudo tar -zxf ~/下载/hadoop-2.6.0.tar.gz -C /usr/local            # 解压到/usr/local中

$cd /usr/local/

$sudo mv ./hadoop-2.6.0/ ./hadoop          # 将文件夹名改为hadoop

$sudo chown -R yinchen ./hadoop           # 修改文件权限

$cd /usr/local/hadoop

$./bin/hadoop version                              #出现版本信息,表示hadoop安装成功了

 

Hadoop伪分布式配置

 

Hadoop伪分布式配置参考:http://dblab.xmu.edu.cn/blog/install-hadoop/

 

修改配置文件 core-site.xml (通过 gedit 编辑会比较方便: gedit ./etc/hadoop/core-site.xml),将当中最后两行的内容的

<configuration>

</configuration>

修改为:

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

 

hadoop.tmp.dir 是 hadoop文件系统依赖的基本配置,很多配置路径都依赖它,它的默认位置是在 /tmp/{$user}下面,注意这是个临时目录!!!

因此,它的持久化配置很重要的! 如果选择默认,一旦因为断电等外在因素影响,/tmp/{$user}下的所有东西都会丢失,哇咔咔。。。趟过坑的应该知道多么酸爽。。。

注意
修改完配置需要重新格式化NameNode!!!
所以,建议:最好在安装配置HADOOP的时候,就给配置OK!!!

fs.defaultFS配置数据传输的地址

 

同样的,修改配置文件 hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>

 

dfs.replication设置文件备份数量

dfs.namenode.name.dir设置namenode文件存储的文件夹

dfs.datanode.data.dir设置datanode文件存储的文件夹

 

$cd /usr/local/hadoop

$./bin/hdfs namenode -format       #格式化namenode节点

$cd /usr/local/hadoop

$./sbin/start-dfs.sh                             #start-dfs.sh是个完整的可执行文件,中间没有空格

启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程:

通过jps查看启动的Hadoop进程

此外,若是 DataNode 没有启动,可尝试如下的方法(注意这会删除 HDFS 中原有的所有数据,如果原有的数据很重要请不要这样做):

  1. # 针对 DataNode 没法启动的解决方法
  2. cd /usr/local/hadoop
  3. ./sbin/stop-dfs.sh # 关闭
  4. rm -r ./tmp # 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
  5. ./bin/hdfs namenode -format # 重新格式化 NameNode
  6. ./sbin/start-dfs.sh # 重启

 

 

成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。

Hadoop的Web界面Hadoop的Web界面

 

 

运行Hadoop伪分布式实例

$./bin/hdfs dfs -mkdir -p /user/hadoop

$./bin/hdfs dfs -mkdir /user/hadoop/input

$./bin/hdfs dfs -put ./etc/hadoop/*.xml /user/hadoop/input

$./bin/hdfs dfs -ls /user/hadoop/input

$./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input output 'dfs[a-z.]+'

$./bin/hdfs dfs -cat output/*

$rm -r ./output # 先删除本地的 output 文件夹(如果存在)

$./bin/hdfs dfs -get output ./output # 将 HDFS 上的 output 文件夹拷贝到本机

$cat ./output/*

$./bin/hdfs dfs -rm -r output # 删除 output 文件夹

$./sbin/stop-dfs.sh        #若要关闭 Hadoop,则运行这行代码

下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行 ./sbin/start-dfs.sh 就可以!

 


 

运行截图

 

 

 

 

 

4 安装python 系统自带的python3.8好像版本太高,运行会有问题

因此需要额外再安装python3.6.1版本

当在命令行输入python时出现python3.6时,说明python安装成功。可通过软链接方式设置,一定不要删除ubuntu自带的python3.8,不然系统可能出现问题。

ubuntu安装python3.6: https://mp.csdn.net/editor/html/113042751

 

 

5 spark的安装

sudo tar -zxf spark安装包 -C /usr/local/        #解压文件

cd /usr/local

sudo mv ./spark-2.4文件名 ./spark       #将解压后的文件重命名为spark

sudo chown -R 用户名 ./spark           #设置用户权限,-R后的参数表示计算机用户名

cd /usr/local/spark

cp ./conf/spark-env.sh.template ./conf/spark-env.sh

sudo gedit ./conf/spark-env.sh               #编辑spark-env.sh文件

在文件最后一行加入:export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)    来使hadoop和spark建立联系

 

之后直接在命令行输入

$./bin/pyspark    就安装成功出现如下界面:

 

学习视频:https://study.163.com/course/courseLearn.htm?courseId=1209408816#/learn/video?lessonId=1279281390&courseId=1209408816

 

 

6 Hbase安装

hbase安装分为3种方式,

单机模式:单纯的用于hbase语法练习

伪分布式模式:用于学习hadoop,spark和hbase之间的交互,模拟实际应用场景

集群模式:用于实际应用场景

 

 

6.1 hbase安装:http://dblab.xmu.edu.cn/blog/install-hbase/

说明:HBase的版本一定要和之前已经安装的Hadoop的版本保持兼容,不能随便选择版本。

安装hbase的条件,– jdk– Hadoop( 单机模式不需要,伪分布式模式和分布式模式需要)– SSH

 

 

6.2 单机模式配置

用gedit命令打开并编辑hbase-env.sh

gedit /usr/local/hbase/conf/hbase-env.sh

添加以下两行内容:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

export HBASE_MANAGES_ZK=true

添加完成后保存退出即可。

第一行表示:配置JAVA环境变量

配置HBASE_MANAGES_ZK为true,表示由hbase自己管理zookeeper,不需要单独的zookeeper。

 

 

配置/usr/local/hbase/conf/hbase-site.xml

<configuration>

<property>

<name>hbase.rootdir</name>

<value>file:///usr/local/hbase/hbase-tmp</value>

</property>

</configuration>

 

不设置的话,hbase.rootdir默认为/tmp/hbase-${user.name},这意味着每次重启系统都会丢失数据。

 

测试运行:

  1. cd /usr/local/hbase
  2. bin/start-hbase.sh
  3. bin/hbase shell

 

 

停止HBase运行:bin/stop-hbase.sh

注意:如果在操作HBase的过程中发生错误,可以通过{HBASE_HOME}目录(/usr/local/hbase)下的logs子目录中的日志文件查看错误原因。

 

 

6.3 伪分布式模式配置及运行

 

1.配置/usr/local/hbase/conf/hbase-env.sh

vi /usr/local/hbase/conf/hbase-env.sh

向文件写入一下信息:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

export HBASE_CLASSPATH=/usr/local/hadoop/conf

export HBASE_MANAGES_ZK=true

 

2.配置/usr/local/hbase/conf/hbase-site.xm

gedit /usr/local/hbase/conf/hbase-site.xml

配置如下内容:

<configuration>
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://localhost:9000/hbase</value>
        </property>
        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>
</configuration>

 

hbase.rootdir指定HBase的存储目录;

hbase.cluster.distributed设置集群处于分布式模式.

 

3.测试运行HBase。SSH->Hadoop->Hbase->Hbase shell
第一步:首先登陆ssh,之前设置了无密码登陆,因此这里不需要密码;再切换目录至/usr/local/hadoop ;再启动hadoop,如果已经启动hadoop请跳过此步骤。命令如下:

ssh localhost
cd /usr/local/hadoop
./sbin/start-dfs.sh

 

输入命令jps,能看到NameNode,DataNode和SecondaryNameNode都已经成功启动,表示hadoop启动成功,截图如下:

 

 

第二步:切换目录至/usr/local/hbase;再启动HBase.命令如下:

cd /usr/local/hbase
bin/start-hbase.sh

启动成功,输入命令jps,看到以下界面说明hbase启动成功

 

第三步:进入shell界面:bin/hbase shell

 

停止HBase运行:bin/stop-hbase.sh

注意:如果在操作HBase的过程中发生错误,可以通过{HBASE_HOME}目录(/usr/local/hbase)下的logs子目录中的日志文件查看错误原因。
这里启动关闭Hadoop和HBase的顺序一定是:登录SSH->启动Hadoop->启动HBase->关闭HBase->关闭Hadoo

 

 

 

6.4 spark连接伪分布式数据库Hbase

启动顺序:SSH->Hadoop->Hbase->pyspark

注意hbase和其他版本配套关系

配置视频:https://study.163.com/course/courseLearn.htm?courseId=1209408816&from=study#/learn/video?lessonId=1279281401&courseId=1209408816

配置文档:http://dblab.xmu.edu.cn/blog/1715-2/

http://dblab.xmu.edu.cn/blog/install-hbase/

(1)创建一个HBase表

cd /usr/local/hadoop
./sbin/start-all.sh

 

启动完成以后,一定要输入jps命令查看是否启动成功:如果少了其中一个进程,说明启动失败

2375 SecondaryNameNode
2169 DataNode
2667 NodeManager
2972 Jps
2045 NameNode
2541 ResourceManager

 

 

hbase> list   #显示当前HBase数据库中有哪些已经创建好的表

如果里面已经有一个名称为student的表,请使用如下命令删除

hbase> disable 'student'
hbase> drop 'student'

 

hbase>  create 'student','info'

hbase> describe 'student'

//首先录入student表的第一个学生记录
hbase> put 'student','1','info:name','Xueqian'
hbase> put 'student','1','info:gender','F'
hbase> put 'student','1','info:age','23'
//然后录入student表的第二个学生记录
hbase> put 'student','2','info:name','Weiliang'
hbase> put 'student','2','info:gender','M'
hbase> put 'student','2','info:age','24'

 

数据录入结束后,可以用下面命令查看刚才已经录入的数据:

//如果每次只查看一行,就用下面命令
hbase> get 'student','1'
//如果每次查看全部数据,就用下面命令
hbase> scan 'student'

可以得到如下结果:

ROW                                    COLUMN+CELL                                                                                                   
 1                                     column=info:age, timestamp=1479640712163, value=23                                                            
 1                                     column=info:gender, timestamp=1479640704522, value=F                                                          
 1                                     column=info:name, timestamp=1479640696132, value=Xueqian                                                      
 2                                     column=info:age, timestamp=1479640752474, value=24                                                            
 2                                     column=info:gender, timestamp=1479640745276, value=M                                                          
 2                                     column=info:name, timestamp=1479640732763, value=Weiliang                                                     
2 row(s) in 0.1610 seconds

 

 

(2)配置Spark

请新建一个终端,执行下面命令

cd  /usr/local/spark/jars
mkdir  hbase
cd  hbase
cp  /usr/local/hbase/lib/hbase*.jar  ./
cp  /usr/local/hbase/lib/guava-12.0.1.jar  ./    #注意自己包的版本
cp  /usr/local/hbase/lib/htrace-core-3.1.0-incubating.jar  ./    ##注意自己包的版本
cp  /usr/local/hbase/lib/protobuf-java-2.5.0.jar  ./   ##注意自己包的版本

 

打开spark-example-1.6.0.jar下载jar包

mkdir -p /usr/local/spark/jars/hbase/
mv ~/下载/spark-examples* /usr/local/spark/jars/hbase/

 

编辑器打开spark-env.sh文件

cd /usr/local/spark/conf
vim spark-env.sh

 

在文件最前面增加下面一行内容:

export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath):$(/usr/local/hbase/bin/hbase classpath):/usr/local/spark/jars/hbase/*

只有这样,后面编译和运行过程才不会出错。

 

插曲:由于我把上面export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath):$(/usr/local/hbase/bin/hbase classpath):/usr/local/spark/jars/hbase/*配置错了导致了如下问题pyspark程序就是不能连接hbase。

yinchen@yc:/usr/local/spark$ ./bin/pyspark --jars ./bin/spark-examples_2.11-1.6.0-typesafe-001.jar 
Python 3.6.8 (default, Jan 23 2021, 13:39:30) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
2021-02-17 23:12:39 WARN  Utils:66 - Your hostname, yc resolves to a loopback address: 127.0.1.1; using 192.168.254.129 instead (on interface ens33)
2021-02-17 23:12:39 WARN  Utils:66 - Set SPARK_LOCAL_IP if you need to bind to another address
2021-02-17 23:12:39 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.0
      /_/

Using Python version 3.6.8 (default, Jan 23 2021 13:39:30)
SparkSession available as 'spark'.
>>> host="localhost"
>>> table="student"
>>> conf={"hbase.zookeeper.quorum":host,"hbase.mapreduce.inputtable":table}
>>> keyConv="org.apache.spark.examples.pythonconverters.ImmutableBytesWritableToStringConverter"
>>> valueConv="org.apache.spark.examples.pythonconverters.HBaseResultToStringConverter"
>>> hbase_rdd=sc.newAPIHadoopRDD("org.apache.hadoop.hbase.mapreduce.TableInputFormat","org.apache.hadoop.hbase.io.ImmutableBytesWritable","org.apache.hadoop.hbase.client.Result",keyConverter=keyConv,valueConverter=valueConv,conf=conf)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/spark/python/pyspark/context.py", line 751, in newAPIHadoopRDD
    jconf, batchSize)
  File "/usr/local/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
  File "/usr/local/spark/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a, **kw)
  File "/usr/local/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD.
: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.io.ImmutableBytesWritable
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.spark.util.Utils$.classForName(Utils.scala:238)
    at org.apache.spark.api.python.PythonRDD$.newAPIHadoopRDDFromClassNames(PythonRDD.scala:312)
    at org.apache.spark.api.python.PythonRDD$.newAPIHadoopRDD(PythonRDD.scala:297)
    at org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD(PythonRDD.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)

 

(3)编写pyspark程序读取HBase数据

启动pyspark:/usr/local/spark/bin/pyspark

输入如下代码:

host = 'localhost'
table = 'student'
conf = {"hbase.zookeeper.quorum": host, "hbase.mapreduce.inputtable": table}
keyConv = "org.apache.spark.examples.pythonconverters.ImmutableBytesWritableToStringConverter"
valueConv = "org.apache.spark.examples.pythonconverters.HBaseResultToStringConverter"
hbase_rdd = sc.newAPIHadoopRDD("org.apache.hadoop.hbase.mapreduce.TableInputFormat","org.apache.hadoop.hbase.io.ImmutableBytesWritable","org.apache.hadoop.hbase.client.Result",keyConverter=keyConv,valueConverter=valueConv,conf=conf)
count = hbase_rdd.count()
hbase_rdd.cache()
output = hbase_rdd.collect()
for (k, v) in output:
        print (k, v)
 
 
1 {"qualifier" : "age", "timestamp" : "1512549772307", "columnFamily" : "info", "row" : "1", "type" : "Put", "value" : "23"}
{"qualifier" : "gender", "timestamp" : "1512549765192", "columnFamily" : "info", "row" : "1", "type" : "Put", "value" : "F"}
{"qualifier" : "name", "timestamp" : "1512549757406", "columnFamily" : "info", "row" : "1", "type" : "Put", "value" : "Xueqian"}
2 {"qualifier" : "age", "timestamp" : "1512549829145", "columnFamily" : "info", "row" : "2", "type" : "Put", "value" : "24"}
{"qualifier" : "gender", "timestamp" : "1512549790422", "columnFamily" : "info", "row" : "2", "type" : "Put", "value" : "M"}
{"qualifier" : "name", "timestamp" : "1512549780044", "columnFamily" : "info", "row" : "2", "type" : "Put", "value" : "Weiliang"}               

 

(4)编写pyspark程序向HBase写入数据

启动pyspark,然后在pyspark shell中输入如下代码

host = 'localhost'
table = 'student'    #定义写入的hbase表格名称
keyConv = "org.apache.spark.examples.pythonconverters.StringToImmutableBytesWritableConverter"
valueConv = "org.apache.spark.examples.pythonconverters.StringListToPutConverter"
conf = {"hbase.zookeeper.quorum": host,"hbase.mapred.outputtable": table,"mapreduce.outputformat.class": "org.apache.hadoop.hbase.mapreduce.TableOutputFormat","mapreduce.job.output.key.class": "org.apache.hadoop.hbase.io.ImmutableBytesWritable","mapreduce.job.output.value.class": "org.apache.hadoop.io.Writable"}     #conf配置连接数据库的相关信息


rawData = ['3,info,name,Rongcheng','4,info,name,Guanhua']     #rawData为通过hadoop写入hbase数据库的内容
// ( rowkey , [ row key , column family , column name , value ] )
sc.parallelize(rawData).map(lambda x: (x[0],x.split(','))).saveAsNewAPIHadoopDataset(conf=conf,keyConverter=keyConv,valueConverter=valueConv)

 

此处发现执行后,pyspark会报如下错误,但是数据仍会插入到hbase中.

pyspark.sql.utils.IllegalArgumentException: 'Can not create a Path from a null string'

执行后,我们可以切换到刚才的HBase终端窗口,在HBase shell中输入如下命令查看结果:

hbase> scan 'student'

hbase

就能查看到新增的数据

 

 

 

7 MySQL安装

 

7.1.首先ubuntu正常安装mysql:

参考博客:https://blog.csdn.net/sa726663676/article/details/113647373

也可参考http://dblab.xmu.edu.cn/blog/install-mysql/(不推荐)

 

7.2.找到系统对应版本的java JDBC8.0.23  版本对应于我刚刚安装的mysql版本8.0.23 。    如果版本不对应可能导致插曲7.5.1错误

java JDBC8.0.23JDBC 下载:    https://dev.mysql.com/downloads/connector/j/?os=26   

 

 

7.3.将下载的tar.gz文件进行解压:

ubuntu的解压命令是tar -zxvf (文件名)**.tar.gz

 

7.4 解压的画圈文件放在 /usr/local/spark/jars  目录下

注意路径是自己安装的spark路径

 

 

使用pyspark连接mysql数据库:

连接之前我们需要先添加些信息

首先打开数据库向数据库添加些表格和信息:

 

7.5 pyspark通过jdbc连接MySQL数据库:

 

打开pyspark输入下面两行代码:

jdbcDF=spark.read.format("jdbc").option("driver","com.mysql.jdbc.Driver").option("url","jdbc:mysql://localhost:3306/spark").option("dbtable","student").option("user","root").option("password","yinchen").load()


jdbcDF.show()

运行结果图:正确连接到了mysql显示了刚刚新建表格的信息

 

以上代码解读

jdbcDF=spark.read.format("jdbc")            

.option("driver","com.mysql.jdbc.Driver")    

.option("url","jdbc:mysql://localhost:3306/spark")      #ip地址localhost和端口号3306以及连接的数据库名spark,mysql默认为3306,如果端口写错会导致插曲7.5.2错误

.option("dbtable","student")                                     #表名student

.option("user","root")                                              #用户名root

.option("password","yinchen")                               #密码yinchen

.load()

本节参考视频:https://study.163.com/course/courseLearn.htm?courseId=1209408816&from=study#/learn/video?lessonId=1279274539&courseId=1209408816

 

 

插曲7.5.1:如果JDBC文件没有复制到pyspark子目录的jar目录中,出现错误如下,因此当出现下面错误的时候考虑JDBC.jar包是否存在或者版本是否正确:

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.0
      /_/

Using Python version 3.6.8 (default, Jan 23 2021 13:39:30)
SparkSession available as 'spark'.

>>> jdbcDF=spark.read.format("jdbc").option("driver","com.mysql.jdbc.Driver").option("url","jdbc:mysql://localhost:3306/spark").option("dbtable","student").option("user","root").option("password","yinchen").load()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/spark/python/pyspark/sql/readwriter.py", line 172, in load
    return self._df(self._jreader.load())
  File "/usr/local/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
  File "/usr/local/spark/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a, **kw)
  File "/usr/local/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o29.load.
: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.apache.spark.sql.execution.datasources.jdbc.DriverRegistry$.register(DriverRegistry.scala:45)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$5.apply(JDBCOptions.scala:99)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$5.apply(JDBCOptions.scala:99)
    at scala.Option.foreach(Option.scala:257)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:99)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:35)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:32)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:318)
    at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:223)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:211)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:167)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)

 

 

插曲7.5.2  使用JDBC连接mysql时端口写错了

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.0
      /_/

Using Python version 3.6.8 (default, Jan 23 2021 13:39:30)
SparkSession available as 'spark'.

>>> jdbcDF=spark.read.format("jdbc").option("driver","com.mysql.jdbc.Driver").option("url","jdbc:mysql://localhost:33060/spark").option("dbtable","student").option("user","root").option("password","yinchen").load()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/spark/python/pyspark/sql/readwriter.py", line 172, in load
    return self._df(self._jreader.load())
  File "/usr/local/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
  File "/usr/local/spark/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a, **kw)
  File "/usr/local/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o37.load.
: java.sql.SQLNonTransientConnectionException: Unsupported protocol version: 11. Likely connecting to an X Protocol port.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:79)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:833)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:453)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
    at org.apache.spark.sql.execution.datasources.jdbc.DriverWrapper.connect(DriverWrapper.scala:45)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:63)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:54)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:56)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation$.getSchema(JDBCRelation.scala:210)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:35)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:318)
    at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:223)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:211)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:167)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)
Caused by: com.mysql.cj.exceptions.UnableToConnectException: Unsupported protocol version: 11. Likely connecting to an X Protocol port.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
    at com.mysql.cj.protocol.a.NativeCapabilities.setInitialHandshakePacket(NativeCapabilities.java:112)
    at com.mysql.cj.protocol.a.NativeProtocol.readServerCapabilities(NativeProtocol.java:506)
    at com.mysql.cj.protocol.a.NativeProtocol.beforeHandshake(NativeProtocol.java:385)
    at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1348)
    at com.mysql.cj.NativeSession.connect(NativeSession.java:157)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:953)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:823)
    ... 24 more

 

8.安装kafka

8.1 下载安装kafka

kafka的官方下载地址为:https://kafka.apache.org/downloads  

#这里我安装的是0.11.0.3:安装的时候最好注意下版本匹配,此安装包内已经附带zookeeper,不需要额外安装zookeeper.按顺序执行如下步骤:

 

 

打开文件下载位置的终端,然后运行如下命令

cd ~/下载
sudo tar -zxf kafka_2.11-0.10.1.0.tgz -C /usr/local
cd /usr/local
sudo mv kafka_2.11-0.10.1.0/ ./kafka
sudo chown -R  yinchen ./kafka    #注意红色为你自己的电脑用户名

 

8.2 测试简单实例

接下来在Ubuntu系统环境下测试简单的实例。Mac系统请自己按照安装的位置,切换到相应的指令。按顺序执行如下命令:

 

# 进入kafka所在的目录
cd /usr/local/kafka
bin/zookeeper-server-start.sh config/zookeeper.properties

 

命令执行后不会返回Shell命令输入状态,zookeeper就会按照默认的配置文件启动服务,请千万不要关闭当前终端.启动新的终端,输入如下命令:

cd /usr/local/kafka
bin/kafka-server-start.sh config/server.properties

 

kafka服务端就启动了,请千万不要关闭当前终端。启动另外一个终端,输入如下命令:

cd /usr/local/kafka
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic dblab

 

topic是发布消息发布的category,以单节点的配置创建了一个叫dblab的topic.可以用list列出所有创建的topics,来查看刚才创建的主题是否存在

bin/kafka-topics.sh --list --zookeeper localhost:2181  

 

可以在结果中查看到dblab这个topic存在。接下来用producer生产点数据:

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic dblab

 

并尝试输入如下信息:

hello hadoop
hello xmu
hadoop world

然后再次开启新的终端或者直接按CTRL+C退出。然后使用consumer来接收数据,输入如下命令:

cd /usr/local/kafka
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic dblab --from-beginning  

便可以看到刚才产生的三条信息。说明kafka安装成功。

 

kafka安装参考:http://dblab.xmu.edu.cn/blog/1096-2/

 

 

 

 

 

 

 

 

 

 

;