厦门大学研究生课程 大数据处理技术 Spark http://dblab.xmu.edu.cn/post/7659/ 温馨提示 : 编辑幻灯片母版, 可以修改每页 PPT 的厦大校徽和底部文字 第 4 章 Spark 安装和使用方法 (PPT 版本号 :2017 年春季学期 ) 林子雨厦门大学计算机科学系 扫一扫访问班级主页 E-mail: ziyulin@xmu.edu.cn 主页 :http://www.cs.xmu.edu.cn/linziyu 大数据处理技术厦门大学计算机科学系 Spark 厦门大学计算机科学系林子雨 2017 ziyulin@xmu.edu.cn 年版
提纲 4.1 安装 Spark 4.2 在 Spark Shell 中运行代码 4.3 编写 Spark 独立应用程序 4.4 第一个 Spark 应用程序 :WordCount 4.5 使用开发工具编写 Spark 应用程序 4.6 Spark 集群环境搭建 4.7 在集群上运行 Spark 应用程序 免费在线教程 :http://dblab.xmu.edu.cn/blog/spark/
4.1 安装 Spark Spark 的安装详细过程, 请参考厦门大学数据库实验室建设的中国高校大数据课程公共服务平台上的技术博客 : Spark2.1.0 入门 :Spark 的安装和使用 博客地址 :http://dblab.xmu.edu.cn/blog/1307-2/
4.1 安装 Spark 安装 Spark 之前需要安装 Linux 系统 Java 环境和 Hadoop 环境 如果没有安装 Hadoop, 请访问厦门大学数据库实验室建设的中国高校大数据课程公共服务平台, 找到 Hadoop 安装教程 _ 单机 / 伪分布式配置 _Hadoop2.6.0/Ubuntu14.04, 依照教程学习安装即可 注意, 在这个 Hadoop 安装教程中, 就包含了 Java 的安装, 所以, 按照这个教程, 就可以完成 JDK 和 Hadoop 这二者的安装 Hadoop 安装教程地址 :http://dblab.xmu.edu.cn/blog/install-hadoop/
4.1 安装 Spark Spark 安装包下载地址 : http://spark.apache.org 进入下载页面后, 点击主页右侧的 Download Spark 按钮进入下载页面, 下载页面中提供了几个下载选项, 主要是 Spark release 及 Package type 的选择, 如下图所示 第 1 项 Spark release 一般默认选择最新的发行版本, 如截至 2017 年 3 月份的最新版本为 2.1.0 第 2 项 package type 则选择 Pre-build with user-provided Hadoop [can use with most Hadoop distributions], 可适用于多数 Hadoop 版本 选择好之后, 再点击第 4 项给出的链接就可以下载 Spark 了
4.1 安装 Spark 解压安装包 spark-2.1.0-bin-without-hadoop.tgz 至路径 /usr/local: $ sudo tar -zxf ~/ 下载 /spark-2.1.0-bin-without-hadoop.tgz -C /usr/local/ $ cd /usr/local $ sudo mv./spark-2.1.0-bin-without-hadoop/./spark # 更改文件夹名 $ sudo chown -R hadoop./spark # 此处的 hadoop 为系统用户名 配置 Spark 的 classpath $ cd /usr/local/spark $ cp./conf/spark-env.sh.template./conf/spark-env.sh # 拷贝配置文件 编辑该配置文件, 在文件最后面加上如下一行内容 : export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath) 保存配置文件后, 就可以启动 运行 Spark 了 若需要使用 HDFS 中的文件, 则在使用 Spark 前需要启动 Hadoop
4.1 安装 Spark Spark 部署模式包括 : Local 模式 : 单机模式 Standalone 模式 : 使用 Spark 自带的简单集群管理器 YARN 模式 : 使用 YARN 作为集群管理器 Mesos 模式 : 使用 Mesos 作为集群管理器
4.2 在 Spark Shell 中运行代码 Spark Shell 提供了简单的方式来学习 Spark API Spark Shell 可以以实时 交互的方式来分析数据 Spark Shell 支持 Scala 和 Python 一个 Driver 就包括 main 方法和分布式数据集 Spark Shell 本身就是一个 Driver, 里面已经包含了 main 方法
4.2 在 Spark Shell 中运行代码 spark-shell 命令及其常用的参数如下 :./bin/spark-shell --master <master-url> Spark 的运行模式取决于传递给 SparkContext 的 Master URL 的值 Master URL 可以是以下任一种形式 : * local 使用一个 Worker 线程本地化运行 SPARK( 完全不并行 ) * local[*] 使用逻辑 CPU 个数数量的线程来本地化运行 Spark * local[k] 使用 K 个 Worker 线程本地化运行 Spark( 理想情况下,K 应该根据运行机器的 CPU 核数设定 ) * spark://host:port 连接到指定的 Spark standalone master 默认端口是 7077 * yarn-client 以客户端模式连接 YARN 集群 集群的位置可以在 HADOOP_CONF_DIR 环境变量中找到 * yarn-cluster 以集群模式连接 YARN 集群 集群的位置可以在 HADOOP_CONF_DIR 环境变量中找到 * mesos://host:port 连接到指定的 Mesos 集群 默认接口是 5050
4.2 在 Spark Shell 中运行代码 在 Spark 中采用本地模式启动 Spark Shell 的命令主要包含以下参数 : --master: 这个参数表示当前的 Spark Shell 要连接到哪个 master, 如果是 local[*], 就是使用本地模式启动 spark-shell, 其中, 中括号内的星号表示需要使用几个 CPU 核心 (core), 也就是启动几个线程模拟 Spark 集群 --jars: 这个参数用于把相关的 JAR 包添加到 CLASSPATH 中 ; 如果有多个 jar 包, 可以使用逗号分隔符连接它们
4.2 在 Spark Shell 中运行代码 比如, 要采用本地模式, 在 4 个 CPU 核心上运行 spark-shell: $ cd /usr/local/spark $./bin/spark-shell --master local[4] 或者, 可以在 CLASSPATH 中添加 code.jar, 命令如下 : $ cd /usr/local/spark $./bin/spark-shell --master local[4] --jars code.jar 可以执行 spark-shell --help 命令, 获取完整的选项列表, 具体如下 : $ cd /usr/local/spark $./bin/spark-shell --help
4.2 在 Spark Shell 中运行代码 执行如下命令启动 Spark Shell( 默认是 local 模式 ): 启动 Spark Shell 成功后在输出信息的末尾可以看到 Scala > 的命令提示符
4.2 在 Spark Shell 中运行代码 可以在里面输入 scala 代码进行调试 : 可以使用命令 :quit 退出 Spark Shell: 或者, 也可以直接使用 Ctrl+D 组合键, 退出 Spark Shell
4.3 编写 Spark 独立应用程序 使用 Scala 编写的程序需要使用 sbt 进行编译打包, 相应的,Java 程序使用 Maven 编译打包, 而 Python 程序通过 spark-submit 直接提交 4.3.1 安装 sbt 4.3.2 编写 Scala 应用程序 4.3.3 使用 sbt 打包 Scala 程序 4.3.4 通过 spark-submit 运行程序
4.3.1 安装 sbt sbt 是一款 Spark 用来对 scala 编写程序进行打包的工具,Spark 中没有自带 sbt, 需要下载安装 下载 sbt 安装包以后, 执行如下命令拷贝至 /usr/local/sbt 中 : 接着在 /usr/local/sbt 中创建 sbt 脚本 (vim./sbt), 添加如下内容 : #!/bin/bash SBT_OPTS="-Xms512M -Xmx1536M -Xss1M - XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M" java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
4.3.1 安装 sbt 保存后, 为./sbt 脚本增加可执行权限 : 最后运行如下命令, 检验 sbt 是否可用 ( 需要几分钟时间 ): 只要能得到如下图的版本信息就没问题 :
4.3.2 编写 Scala 应用程序 在终端中执行如下命令创建一个文件夹 sparkapp 作为应用程序根目录 : 在./sparkapp/src/main/scala 下建立一个名为 SimpleApp.scala 的文件, 添加代码如下
4.3.3 使用 sbt 打包 Scala 程序 请在./sparkapp 中新建文件 simple.sbt(vim./sparkapp/simple.sbt), 添加内容如下, 声明该独立应用程序的信息以及与 Spark 的依赖关系 : name := "Simple Project" version := "1.0" scalaversion := "2.11.8" librarydependencies += "org.apache.spark" %% "spark-core" % "2.1.0"
4.3.3 使用 sbt 打包 Scala 程序 为保证 sbt 能正常运行, 先执行如下命令检查整个应用程序的文件结构 : 文件结构应如下图所示 :
4.3.3 使用 sbt 打包 Scala 程序 接着, 我们就可以通过如下代码将整个应用程序打包成 JAR( 首次运行同样需要下载依赖包 ): 打包成功的话, 会输出类似如下信息 : hadoop@dblab:~/sparkapp$ /usr/local/sbt/sbt package OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0 [info] Set current project to Simple Project (in build file:/home/hadoop/sparkapp/) [success] Total time: 2 s, completed 2017-2-19 15:45:29 生成的 jar 包的位置为 ~/sparkapp/target/scala-2.11/simple-project_2.11-1.0.jar
4.3.4 通过 spark-submit 运行程序 可以通过 spark-submit 提交应用程序, 该命令的格式如下 :./bin/spark-submit --class <main-class> // 需要运行的程序的主类, 应用程序的入口点 --master <master-url> //Master URL, 下面会有具体解释 --deploy-mode <deploy-mode> // 部署模式... # other options // 其他参数 <application-jar> // 应用程序 JAR 包 [application-arguments] // 传递给主类的主方法的参数
4.3.4 通过 spark-submit 运行程序 Spark 的运行模式取决于传递给 SparkContext 的 Master URL 的值 Master URL 可以是以下任一种形式 : * local 使用一个 Worker 线程本地化运行 SPARK( 完全不并行 ) * local[*] 使用逻辑 CPU 个数数量的线程来本地化运行 Spark * local[k] 使用 K 个 Worker 线程本地化运行 Spark( 理想情况下,K 应该根据运行机器的 CPU 核数设定 ) * spark://host:port 连接到指定的 Spark standalone master 默认端口是 7077. * yarn-client 以客户端模式连接 YARN 集群 集群的位置可以在 HADOOP_CONF_DIR 环境变量中找到 * yarn-cluster 以集群模式连接 YARN 集群 集群的位置可以在 HADOOP_CONF_DIR 环境变量中找到 * mesos://host:port 连接到指定的 Mesos 集群 默认接口是 5050
4.3.4 通过 spark-submit 运行程序 最后, 我们就可以将生成的 jar 包通过 spark-submit 提交到 Spark 中运行了, 命令如下 : $ /usr/local/spark/bin/spark-submit --class "SimpleApp" ~/sparkapp/target/scala-2.11/simple-project_2.11-1.0.jar # 上面命令执行后会输出太多信息, 可以不使用上面命令, 而使用下面命令查看想要的结果 $ /usr/local/spark/bin/spark-submit --class "SimpleApp" ~/sparkapp/target/scala-2.11/simple-project_2.11-1.0.jar 2>&1 grep "Lines with a:" 最终得到的结果如下 : Lines with a: 62, Lines with b: 30
4.4 第一个 Spark 应用程序 :WordCount (1) 在 spark-shell 中执行词频统计 scala> val textfile = sc.textfile("file:///usr/local/spark/mycode/wordcount/word.txt") scala> val wordcount = textfile.flatmap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b) scala> wordcount.collect() scala> wordcount.foreach(println)
4.4 第一个 Spark 应用程序 :WordCount (2) 编写独立应用程序执行词频统计 import org.apache.spark.sparkcontext import org.apache.spark.sparkcontext._ import org.apache.spark.sparkconf object WordCount { def main(args: Array[String]) { val inputfile = "file:///usr/local/spark/mycode/wordcount/word.txt" val conf = new SparkConf().setAppName("WordCount"). setmaster("local[2]") val sc = new SparkContext(conf) val textfile = sc.textfile(inputfile) val wordcount = textfile.flatmap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b) wordcount.foreach(println) } } (3) 编译打包运行, 得到词频统计结果
4.5 使用开发工具编写 Spark 应用程序 4.5.1 使用 IntelliJ IDEA 编写 Spark 应用程序 4.5.2 使用 Eclipse 编写 Spark 应用程序
4.5 使用 IntelliJ IDEA 编写 Spark 应用程序 安装 IntelliJ IDEA 在 IDEA 里安装 Scala 插件, 并配置 JDK Scala SDK 配置 JDK 配置全局 Scala SDK 创建 Maven 工程文件 前置的一些配置 编写代码 运行 WordCount 程序 打包 WordCount 程序 请参考厦门大学数据库实验室建设的 中国高校大数据课程公共服务平台 里面的技术博客 : 利用开发工具 IntelliJ IDEA 编写 Spark 应用程序 文章地址 :http://dblab.xmu.edu.cn/blog/1327/
4.5.2 使用 Eclipse 编写 Spark 应用程序 请参考厦门大学数据库实验室建设的 中国高校大数据课程公共服务平台 里面的技术博客 : 利用开发工具 Eclipse 编写 Spark 应用程序 文章地址 : http://dblab.xmu.edu.cn/blog/1406/
4.5.2 使用 Eclipse 编写 Spark 应用程序 安装必备软件说明 第 1 种方式 : 安装 Scala IDE for Eclipse 第 2 种方式 : 在现有的 Eclipse 基础之上, 安装 maven 插件和 scala 插件
4.6 Spark 集群环境搭建 4.6.1 集群概况 4.6.2 准备工作 : 搭建 Hadoop 集群环境 4.6.3 安装 Spark 4.6.4 配置环境变量 4.6.5 Spark 配置 4.6.6 启动 Spark 集群 4.6.7 关闭 Spark 集群
4.6.1 集群概况 采用 3 台机器 ( 节点 ) 作为实例来演示如何搭建 Spark 集群 其中 1 台机器 ( 节点 ) 作为 Master 节点 另外两台机器 ( 节点 ) 作为 Slave 节点 ( 即作为 Worker 节点 ), 主机名分别为 Slave01 和 Slave02 Master Slave01 Slave02
4.6.2 准备工作 : 搭建 Hadoop 集群环境 Spark+HDFS 运行架构 请参考厦门大学数据库实验室建设的 中国高校大数据课程公共服务平台 里面的技术博客 : Hadoop 2.7 分布式集群环境搭建 文章地址 :http://dblab.xmu.edu.cn/blog/1177-2/
4.6.3 安装 Spark 访问 Spark 官网下载 Spark 安装包 sudo tar -zxf ~/ 下载 /spark-2.1.0-bin-without-hadoop.tgz -C /usr/local/ cd /usr/local sudo mv./spark-2.1.0-bin-without-hadoop/./spark sudo chown -R hadoop./spark
4.6.4 配置环境变量 在 Master 节点主机的终端中执行如下命令 : $ vim ~/.bashrc 在.bashrc 添加如下配置 : export SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin 运行 source 命令使得配置立即生效 : $ source ~/.bashrc
4.6.5 Spark 配置 (1) 配置 slaves 文件 将 slaves.template 拷贝到 slaves $ cd /usr/local/spark/ $ cp./conf/slaves.template./conf/slaves slaves 文件设置 Worker 节点 编辑 slaves 内容, 把默认内容 localhost 替换成如下内容 : Slave01 slave02
4.6.5 Spark 配置 (2) 配置 spark-env.sh 文件 将 spark-env.sh.template 拷贝到 spark-env.sh $ cp./conf/spark-env.sh.template./conf/spark-env.sh 编辑 spark-env.sh, 添加如下内容 : export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath) export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop export SPARK_MASTER_IP=192.168.1.104
4.6.5 Spark 配置 配置好后, 将 Master 主机上的 /usr/local/spark 文件夹复制到各个节点上在 Master 主机上执行如下命令 : cd /usr/local/ tar -zcf ~/spark.master.tar.gz./spark cd ~ scp./spark.master.tar.gz slave01:/home/hadoop scp./spark.master.tar.gz slave02:/home/hadoop 在 slave01,slave02 节点上分别执行下面同样的操作 : sudo rm -rf /usr/local/spark/ sudo tar -zxf ~/spark.master.tar.gz -C /usr/local sudo chown -R hadoop /usr/local/spark
4.6.6 启动 Spark 集群 (1) 首先启动 Hadoop 集群 在 Master 节点主机上运行如下命令 : $ cd /usr/local/hadoop/ $ sbin/start-all.sh (2) 启动 Master 节点 在 Master 节点主机上运行如下命令 : $ cd /usr/local/spark/ $ sbin/start-master.sh (3) 启动所有 Slave 节点 在 Master 节点主机上运行如下命令 : $ sbin/start-slaves.sh
4.6.6 启动 Spark 集群 (4) 在浏览器上查看 Spark 独立集群管理器的集群信息 在 Master 主机上打开浏览器, 访问 http://master:8080, 如下图 :
4.6.7 关闭 Spark 集群 在 Master 节点上执行下面命令 (1) 关闭 Master 节点 $ sbin/stop-master.sh (2) 关闭 Worker 节点 $ sbin/stop-slaves.sh (3) 关闭 Hadoop 集群 $ cd /usr/local/hadoop/ $ sbin/stop-all.sh
4.7 在集群上运行 Spark 应用程序 4.7.1 启动 Spark 集群 4.7.2 采用独立集群管理器 4.7.3 采用 Hadoop YARN 管理器
4.7.1 启动 Spark 集群 请登录 Linux 系统, 打开一个终端启动 Hadoop 集群 $ cd /usr/local/hadoop/ $ sbin/start-all.sh 启动 Spark 的 Master 节点和所有 slaves 节点 $ cd /usr/local/spark/ $ sbin/start-master.sh $ sbin/start-slaves.sh
4.7.2 采用独立集群管理器 (1) 在集群中运行应用程序 JAR 包 向独立集群管理器提交应用, 需要把 spark://master:7077 作为主节点参数递给 spark-submit 可以运行 Spark 安装好以后自带的样例程序 SparkPi, 它的功能是计算得到 pi 的值 (3.1415926) $ bin/spark-submit --class org.apache.spark.examples.sparkpi --master spark://master:7077 examples/jars/spark-examples_2.11-2.0.2.jar 100 2>&1 grep "Pi is roughly"
4.7.2 采用独立集群管理器 (2) 在集群中运行 spark-shell 也可以用 spark-shell 连接到独立集群管理器上 $ bin/spark-shell --master spark://master:7077 scala> val textfile = sc.textfile("hdfs://master:9000/readme.md") textfile: org.apache.spark.rdd.rdd[string] = hdfs://master:9000/readme.md MapPartitionsRDD[1] at textfile at <console>:24 scala> textfile.count() res0: Long = 99 scala> textfile.first() res1: String = # Apache Spark
4.7.2 采用独立集群管理器 用户在独立集群管理 Web 界面查看应用的运行情况 http://master:8080/
4.7.3 采用 Hadoop YARN 管理器 (1) 在集群中运行应用程序 JAR 包 向 Hadoop YARN 集群管理器提交应用, 需要把 yarn-cluster 作为主节点参数递给 spark-submit $ bin/spark-submit --class org.apache.spark.examples.sparkpi --master yarn-cluster examples/jars/spark-examples_2.11-2.0.2.jar 运行后, 根据在 Shell 中得到输出的结果地址查看, 如下图 :
4.7.3 采用 Hadoop YARN 管理器 复制结果地址到浏览器, 点击查看 Logs, 再点击 stdout, 即可查看结果, 如下图 :
4.7.3 采用 Hadoop YARN 管理器 (2) 在集群中运行 spark-shell 也可以用 spark-shell 连接到独立集群管理器上 $ bin/spark-shell --master yarn scala> val textfile = sc.textfile("hdfs://master:9000/readme.md") textfile: org.apache.spark.rdd.rdd[string] = hdfs://master:9000/readme.md MapPartitionsRDD[3] at textfile at <console>:24 scala> textfile.count() res2: Long = 99 scala> textfile.first() res3: String = # Apache Spark
4.7.3 采用 Hadoop YARN 管理器 用户在 Hadoop Yarn 集群管理 Web 界面查看所有应用的运行情况 http://master:8088/cluster
附录 : 主讲教师林子雨简介 主讲教师 : 林子雨 单位 : 厦门大学计算机科学系 E-mail: ziyulin@xmu.edu.cn 个人网页 :http://www.cs.xmu.edu.cn/linziyu 数据库实验室网站 :http://dblab.xmu.edu.cn 扫一扫访问个人主页 林子雨, 男,1978 年出生, 博士 ( 毕业于北京大学 ), 现为厦门大学计算机科学系助理教授 ( 讲师 ), 曾任厦门大学信息科学与技术学院院长助理 晋江市发展和改革局副局长 中国计算机学会数据库专业委员会委员, 中国计算机学会信息系统专业委员会委员, 荣获 2016 中国大数据创新百人 称号 中国高校首个 数字教师 提出者和建设者, 厦门大学数据库实验室负责人, 厦门大学云计算与大数据研究中心主要建设者和骨干成员,2013 年度厦门大学奖教金获得者 主要研究方向为数据库 数据仓库 数据挖掘 大数据 云计算和物联网, 并以第一作者身份在 软件学报 计算机学报 和 计算机研究与发展 等国家重点期刊以及国际学术会议上发表多篇学术论文 作为项目负责人主持的科研项目包括 1 项国家自然科学青年基金项目 (No.61303004) 1 项福建省自然科学青年基金项目 (No.2013J05099) 和 1 项中央高校基本科研业务费项目 (No.2011121049), 同时, 作为课题负责人完成了国家发改委城市信息化重大课题 国家物联网重大应用示范工程区域试点泉州市工作方案 2015 泉州市互联网经济调研等课题 中国高校首个 数字教师 提出者和建设者,2009 年至今, 数字教师 大平台累计向网络免费发布超过 100 万字高价值的研究和教学资料, 累计网络访问量超过 100 万次 打造了中国高校大数据教学知名品牌, 编著出版了中国高校第一本系统介绍大数据知识的专业教材 大数据技术原理与应用, 并成为京东 当当网等网店畅销书籍 ; 建设了国内高校首个大数据课程公共服务平台, 为教师教学和学生学习大数据课程提供全方位 一站式服务, 年访问量超过 50 万次 具有丰富的政府和企业信息化培训经验, 厦门大学管理学院 EDP 中心 浙江大学管理学院 EDP 中心 厦门大学继续教育学院 泉州市科技培训中心特邀培训讲师, 曾给中国移动通信集团公司 福州马尾区政府 福建龙岩卷烟厂 福建省物联网科学研究院 石狮市物流协会 厦门市物流协会 浙江省中小企业家 四川泸州企业家 江苏沛县企业家等开展信息化培训, 累计培训人数达 3000 人以上
附录 : 林子雨编著 Spark 入门教程 厦门大学林子雨编著 Spark 入门教程 教程内容包括 Scala 语言 Spark 简介 安装 运行架构 RDD 的设计与运行原理 部署模式 RDD 编程 键值对 RDD 数据读写 Spark SQL Spark Streaming MLlib 等 免费在线教程 :http://dblab.xmu.edu.cn/blog/spark/
附录 : 大数据技术原理与应用 教材 大数据技术原理与应用 概念 存储 处理 分析与应用 ( 第 2 版 ), 由厦门大学计算机科学系林子雨老师编著, 是中国高校第一本系统介绍大数据知识的专业教材 扫一扫访问教材官网 全书共有 15 章, 系统地论述了大数据的基本概念 大数据处理架构 Hadoop 分布式文件系统 HDFS 分布式数据库 HBase NoSQL 数据库 云数据库 分布式并行编程模型 MapReduce Spark 流计算 图计算 数据可视化以及大数据在互联网 生物医学和物流等各个领域的应用 在 Hadoop HDFS HBase MapReduce 和 Spark 等重要章节, 安排了入门级的实践操作, 让读者更好地学习和掌握大数据关键技术 本书可以作为高等院校计算机专业 信息管理等相关专业的大数据课程教材, 也可供相关技术人员参考 学习 培训之用 欢迎访问 大数据技术原理与应用 概念 存储 处理 分析与应用 ( 第 2 版 ) 教材官方网站 : http://dblab.xmu.edu.cn/post/bigdata
附录 : 中国高校大数据课程公共服务平台 http://dblab.xmu.edu.cn/post/bigdata-teaching-platform/ 扫一扫访问平台主页 扫一扫观看 3 分钟 FLASH 动画宣传片
Department of Computer Science, Xiamen University, 2017