Spark SQL慕课网日志分析(1)--系列软件(单机)安装配置使用
来源:
慕课网 Spark SQL慕课网日志分析_大数据实战
目标:
spark系列软件的伪分布式的安装、配置、编译
spark的使用
系统:
mac 10.13.3 /ubuntu 16.06,两个系统都测试过
软件:
hadoop,hive,spark,scala,maven
hadoop伪分布式、spark伪分布式
详细:
software 存放安装的软件包
app 所有软件的安装目录
data 课程中所有使用的测试数据目录
source 软件源码目录,spark
1)下载hadoop
archive.cloudera.com/cdh5/cdh/5/
2)Java环境配置
vim ~/.bashrc
source ~/.bashrc
export JAVA_HOME=/home/sumeng/app/jdk1.8.0_161
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/home/sumeng/app/hadoop-2.6.0-cdh5.7.0
export PATH=$HADOOP_HOME/bin:$PATH
3)机器参数
修改机器名 sudo vim /etc/hostname
修改IP与hostname的映射关系 sudo vim /etc/hosts
ssh免密码登录
ssh-keygen -t rsa,然后一路回车
~$ ls -la 可以查看隐藏文件
~$ cd .ssh 打开隐藏文件ssh
里面有两个文件 id_rsa id_rsa.pub
~$ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
4)Hadoop配置文件修改:~/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop(伪分布式)
1、hadoop-env.sh
vim etc/hadoop/hadoop-env.sh,修改其中的这句话:
export JAVA_HOME=/home/sumeng/app/jdk1.8.0_161
2、core-site.xml
vim etc/hadoop/core-site.xml,添加
#在hadoop2.x中用8020,1.x中端口是9000
<property>
<name>fs.defaultFS</name>
<value>hdfs://lenove:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/sumeng/app/temp</value>
</property>
3、hdfs-site.xml
vim etc/hadoop/hdfs-site.xml
#hdfs的副本数
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
5)格式化HDFS
注意:这一步操作,只是在第一次时执行,每次如果都格式化的话,HDFS上的数据就会被清空
~$ bin/hdfs namenode -format
INFO common.Storage: Storage directory /home/sumeng/app/temp/dfs/name has been successfully formatted.
6)启动HDFS
在~/app/hadoop-2.6.0-cdh5.7.0安装目录下,bin是客户端的脚本,etc是配置文件,sbin是服务器相关的脚本(比如启动停止)
#启动namenode datanode
$ sbin/start-dfs.sh
可以访问lenove:50070
7)停止HDFS
$ sbin/stop-dfs.sh
#########################################################
HDFS shell常用命令
hadoop fs -ls / 查看hdfs的根目录
##########################################################
YARN 架构
一个ResourceManager 多个 NodeManager。ResourceManager:负责整个集群的资源管理和调度
修改配置文件
1)yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
2)mapred-site.xml
$ cd /home/sumeng/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop
$ cp mapred-site.xml.template mapred-site.xml
$ vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3)启停YARN
$ sbin/start-yarn.sh
$ sbin/stop-yarn.sh
4)web地址:http://lenove:8088/
########################################################
Mapreduce作业提交到Yarn上运行
在目录/home/sumeng/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce下
ha
########################################################
大数据数据仓库 Hive
简单容易上手,提供类似SQL查询语言HQL
为超大数据集设计的计算/存储扩展能力(MR计算,HDFS存储)
统一的元数据管理(可与Prestp/SparkSQL共享数据)
Hive 底层执行引擎:Mapreduce、Spark
1)下载Hive
网址:archive.cloudera.com/cdh5/cdh/5/
搜索:hive-1.1.0-cdh5.7.0.tar.gz
进入software目录,输入命令:wget http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0.tar.gz
解压到~/app/下
2)系统环境变量vim ~/.bashrc
export HIVE_HOME=/home/sumeng/app/hive-1.1.0-cdh5.7.0
export PATH=$HIVE_HOME/bin:$PATH
3)修改配置文件
1)hive-env.sh
在目录/home/sumeng/app/hive-1.1.0-cdh5.7.0/conf下
cp hive-env.sh.template hive-env.sh
vim hive-env.sh
添加一句HADOOP_HOME=/home/sumeng/app/hadoop-2.6.0-cdh5.7.0
2)hive-site.xml
~/app/hive-1.1.0-cdh5.7.0/conf$ vim hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://127.0.0.1:3306/sparkSQL?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
</configuration>
4)安装mysql:
https://www.jianshu.com/p/a8e4068a7a8a
在系统偏好中启动mysql服务
登陆命令:mysql -uroot -p
下载mysql驱动:
将mysql-connector-java-5.1.46-bin.jar拷贝到$HIVE_HOME/lib/下
5)启动hive:
先启动hadoop的dfs/yarn
$HIVE_HOME/bin/hive
在后台hive sql提交执行后会生成mr作业,并在yarn上运行
create table emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
create table dept(
deptno int,
dname string,
location string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
load data local inpath '/Users/sumeng/data/emp.txt' into table emp;
###########################################################
安装scala2.11.8:
安装maven3.3.9:
https://www.jianshu.com/p/d28276f5a991
###########################################################
Spark
MapReduce的局限性
执行效率低下
map 输出结果在磁盘上,reduce再读取
mapreduce每个作业都是以进程的形式,启动销毁成本很高,jvm复用:多个作业跑在同一个进程
1)下载
官网上有pre-build for Hadoop2.6预编译版本,但是2.6.0,2.6.1等都是有区别的,所以选择源码下载
右击选择复制链接,用wget方式下载
sumeng@lenove:~/sofrware$ wget https://archive.apache.org/dist/spark/spark-2.1.0/spark-2.1.0.tgz
解压 tar -zxvf spark-2.1.0.tgz -C ~/app/
2)编译
1)maven版本3.3.9及其以上;java7+
2)不需要--执行export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
3)pom.xml添加:
查找/repositories,添加
<repository>
<id>cloudera</id>
<url>http://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
4)如果编译的scala版本是2.10
执行命令./dev/change-scala-version.sh 2.10
5)mvn编译命令
./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.7.0 -Phive -Phive-thriftserver -U -X
6)在spark目录下会出tgz文件
7)解压到~/app/,配置环境变量
3)启动
local模式,2个线程:
spark-shell --master local[2]
standalone模式:
1个master+n个worker\
注意:以下操作都是在编译之后的spark-2.1.0-bin-2.6.0-cdh5.7.0目录下
1)
在conf/目录下
cp spark-env.sh.template spark-env.sh
vim spark-env.sh:
SPARK_MASTER_HOST=lenove
SPARK_WORKER_CORES=2 #每个worker多少个core
SPARK_WORKER_MEMORY=2g #每个worker的内存
SPARK_WORKER_INSTANCES=1 #worker的实例数
这时可以在sbin/目录下执行 ./start-all.sh ./stop-all.sh 启动服务端,可以在logs/目录下查看日志,启动的core/内存信息
在bin/目录下提交任务:spark-shell --master spark://localhost:7077
(bin目录已经配置到环境变量中,可以直接输入命令)
每一个spark-shell就是一个作业
2)补充:--Mac跳过 --ubuntu14.04中报错没有设置JVAA_HOME
在sbin的目录下的spark-config.sh 文件下未添加JAVA_HOME的索引
在该配置文件下添加 :
export JAVA_HOME=/usr/java/jdk1.8.0_111 即可
###########################################################
Hive :
hive on mapreduce:sql-->翻译为mapreduce作业,效率低速度慢
改进hive on spark-->shark,缺点hql解析依赖hive,仅仅把物理执行计划从mr替换为spark作业
Shark终结后产生两个分支:
1)hive on spark
是hive的一部分,hive社区,源码是在Hive中
其目的是把Spark作为Hive的一个计算引擎,将Hive的查询作为Spark的任务提交到Spark集群上进行计算。
2)Spark SQL
Spark社区,源码是在Spark中
Spark SQL概述
支持SQL / Hive QL
应用不仅局限于sql
访问hive json等文件的数据
提供了SQL的api,DataFrame和Dataset的api
3)两者区别
结构上Hive On Spark和SparkSQL都是一个翻译层,把一个SQL翻译成分布式可执行的Spark程序
需要理解的是,Hive和SparkSQL都不负责计算,它们只是告诉Spark,你需要这样算那样算,但是本身并不直接参与计算。
两者sql引擎不一样,计算引擎都是spark
第一步:配置idea的scala环境
下载Scala插件+maven
第二步:编写程序
第三步: cd /Users/sumeng/IdeaProjects/ImoocSparkSQLProject 进入项目所在目录
mvn clean package -DskipTests对项目进行编译
输出以下结果:
[INFO] Building jar: /Users/sumeng/IdeaProjects/ImoocSparkSQLProject/target/sql-1.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
第四步:执行.sh文件
参考官方文档:http://spark.apache.org/docs/2.1.0/sql-programming-guide.html#getting-started
###########################################################
注意:每个 Spark Application 都会开启一个自己的 Web UI,默认端口号为4040。 访问地址: http://:4040 。如果同一 node 上运行了多个 Spark Application 则这些应用的端口将会往上累加,eg : 4040,4041,4042 。
在控制台查看spark job:默认端口是localhost:4040
spark shell & spark sql---spark操作hive表
总结为:
hive-site.xml配置文件
--jars传递mysql驱动包
实际操作:
spark-shell操作hive
1、启动hadoop的dfs、yarn、hive ,可以通过jps验证是否开启
2、spark shell 如果想访问hive的元数据,需要作如下拷贝
meng$ cp hive-site.xml ~/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/conf/
3、spark-shell --help
启动:
./spark-shell --master local[2] --jars ~/software/mysql-connector-java-5.1.46-bin.jar
执行相关命令:
scala> spark.sql("select * from emp e join dept d on e.deptno=d.deptno").show
期间出现报错,但不影响使用
ERROR ObjectStore: Version information found in metastore differs 1.1.0 from expected schema version 1.2.0. Schema verififcation is disabled hive.metastore.schema.verification so setting version.
解决error:在~/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/conf/hive-site.xml中添加下面内容
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
spark-sql 操纵hive表
0、部分配置需要参考spark-shell
1、以local模式启动spark作业
./spark-sql --master local[2] --jars ~/software/mysql-connector-java-5.1.46-bin.jar
spark-sql控制台:默认端口是localhost:4040
###########################################################
1、启动hadoop
2、启动thriftserver服务--默认端口是10000
./sbin/start-thriftserver.sh --master local[2] --jars ~/software/mysql-connector-java-5.1.46-bin.jar
3、启动beeline客户端
./beeline -u jdbc:hive2://localhost:10000 -n sumengdeMacBook-Pro
4、在beeline客户端输入查询命令
show tables;
select * from emp e join dept d on e.deptno = d.deptno;
5、可以在启动一个beeline
6、每个 Spark Application 都会开启一个自己的 Web UI,默认端口号为4040。 访问地址: http://:4040 。如果同一 node 上运行了多个 Spark Application 则这些应用的端口将会往上累加,eg : 4040,4041,4042 。
在控制台查看spark job:默认端口是localhost:4040
7、停止thriftserver服务
./stop-thriftserver.sh
rhriftserver 和普通的spark-shell spark-sql有什么区别
1)没启动一个spark-shell或spark-sql,都会启动一个spark Application
2)启动一个thriftserver,不管你启动多少个客户端(beeline/code),永远都是只有一个spark allication
开发中,经常是编写的多个spark应用程序,通过jdbc连接thriftserver,解决了一个数据共享的问题,多个客户端可以共享数据
###########################################################
jdbc编程方式访问thriftserver服务,进而spark sql数据
maven添加依赖
注意:在使用jdbc开发时,要先启动thriftserver
###########################################################
第六章:DataFrame&DataSet
简介:
dataset是分布式数据集
dataframe是一种dataset,以列(列名、列的类型、列值)的形式构成的分布式数据集,出现在R/Pandas
rdd 分布式可以并行处理的数据集
dataframe更像数据库的表
RDD:
java/scala ==> Jvm
python ==> python runtime
DataFrame:
java/scala/python ==> Logic plan 逻辑执行计划
DataFrame 基本API操作:
idea编写DataFrameAPP,将json文件加载成一个dataframe,并进行sql操作
参考DataFrameRDDAPP.scala文件
DataFrame与RDD互操作interoperating with RDD
操作之一:反射方式
操作之二:缺少视频6-7
DataFrame API操作案例实战:
操作外部数据源
7-2,有一张架构图,很好
7-3,视频缺失
7-6,操作Hive表数据--sparl-shell下
0)前期工作
拷贝hive-site.xml配置文件到conf目录
--jars传递mysql驱动包(hive的元数据在mysql存放)
1)启动一个spark-shell
2)未启动hadoop,照样执行成功,因为只需要访问mysql上的元数据即可,不需要访问hdfs
scala> spark.sql("show tables").show
3)执行这句话就需要提前启动hadoop。以下两句等价。
scala> spark.table("emp").show
scala> spark.sql("select * from emp").show
4)sql与dataframel API结合使用。sql的返回值是DataFrame类型。
spark.sql("select deptno,count(1) from emp group by deptno").filter("deptno != 20").show
5)插入数据
spark.sql("insert into emp values (70,null,null,null,null,null,null,null)")
6)创建新的表
spark.sql("select deptno,count(1) as mount from emp group by deptno").write.saveAsTable("hive_table")
7)注意:
SparkSQL在集群中运行,将一个查询任务分解成大量的Task分配给集群中的各个节点来运行。查询数据时,shuffle的时候使用了缺省的,即200个partition,也就是200个Task
在生产环境一定要注意设置spark.sql.shuffle.partitions,默认是200
spark.sqlContext.setConf("spark.sql.shuffle.partitions","10")
7-7,操作MySQL表数据--sparl-shell下
可参考官方文档
返回是Dataframe类型,对应TBLS表
val jdbcDF = spark.read.format("jdbc").option("url", "jdbc:mysql://127.0.0.1:3306/sparkSQL").option("dbtable", "sparkSQL.TBLS").option("user", "root").option("password", "root").option("driver", "com.mysql.jdbc.Driver").load()
7-8综合使用
关联mysql和hive表数据关联操作
1)向mysql插入DEPT表
create database spark;
use spark;
create table DEPT(
DEPTNO int(2) primary key,
DNAME VARCHAR(14),
LOC VARCHAR(13)
);
insert into DEPT values(10,"ACCOUNTING","NEW YORK");
insert into DEPT values(20,"RESEARCH","DALLAS");
INSERT into DEPT values(30,"SALES","CHICAGO");
insert into DEPT values(40,"OPERATIONS","BOSTON");
2)hive中已经存在的emp表
3) 联合操作
参考idea中的代码