Mapreduce+Hive+Spark+Scala平台搭建
Mapreduce+Hive+Spark+Scala平台搭建
说明
平台搭建成功后,使用Java语言进行算法设计和应用的开发。文末有使用java设计的逻辑回归(Logistics Regression)做小数据集的二分类问题。
一、搭建准备
VMWare Workstation
Ubuntu 14.04 Server.iso
Xshell——远程连接主机终端
Server 版安装配置
新建三台虚拟机,安装时选择OpenSHH Server预安装环境
一台作为master
另两台作为slave,命名为slave1和slave2
master的配置比slave要稍微高一些
IP 设置
VMnet8是VM配置的虚拟网卡
设置VMnet8,选择「NAT 模式」
设置子网IP (192.168.142.0)和子网掩码(255.255.255.0)
Ubuntu 系统的登录和 IP 的固化
输入 ifconfig
回车查询当前的 ip 地址,准备将其长期绑定到当前虚拟机,为了方便后续实验。
master的ip:192.168.142.128
slave1的ip:192.168.142.130
slave2的ip:192.168.142.132
此时的 IP 地址是由 DHCP 服务器动态分配的,为了让这个 IP 地址能一直与这台
虚拟机绑定,我们需要改变系统启动时获取 IP 的方式,从 DHCP 切换到静态 IP
地址,为此需要编辑 Linux 的网卡配置文件(/etc/network/interfaces),输入命令
sudo vi /etc/network/interfaces
回车,可以看到 eth0 的 IP 获取方式是 dhcp:
此时需要修改 ip 的获取方式从 DHCP 到 static,设置静态的 ip 地址、子网掩码和
默认网关。
把这个文件更改为:
#This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.142.128
gateway 192.168.142.2
netmask 255.255.255.0
为了进一步固化 DNS 服务器 IP,输入
sudo vi /etc/resolvconf/resolv.conf.d/bas
将里面的内容替换成nameserver 192.168.142.2
,vi 保存
系统的登录和 IP 的固化重启后完成
使用Xshell连接三个虚拟机终端
下载lrzsz工具
用于虚拟机与宿主机之间文件的上传和下载
sudo apt-get update
sudo apt-get install lrzsz
rz命令,从宿主机传文件至虚拟机
sz命令,从虚拟机获取文件至宿主机
二、Hadoop 及相关环境的安装
开源分布式平台 Hadoop 可以聚合多个计算机形成集群,在各个节点上安装配置完Hadoop后可以直接提交分布式代码到集群计算。本次实验可以在个人电脑上用VMware完成,或使用天河二号上的 OpenStack平台创建内存为2G的虚拟机资源完成。
安装包准备
Hadoop环境——hadoop-2.6.0.tar.gz
Java环境——jdk-8u60-linux-x64.tar.gz
虚拟机ip配置测试
sudo vi /etc/hosts #编辑 /etc/hosts 文件,插入角色与 IP 映射
ping master -c 4 #尝试用角色名 ping 其它主机,一次 4 个包
hosts文件修改为:
127.0.0.1 localhost
192.168.142.128 master
192.168.142.130 slave1
192.168.142.132 slave2
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
三个虚拟机能够使用主机名(不是ip)ping通即配置正确
配置 SSH 无密码登录
保障了 Hadoop 可以通过角色名在局域网里找到各个节点,为了让 Hadoop 可以进
一步读取、操作各个节点,需要赋予其登录的权限,意即让 Hadoop 拥有各个节点的普通用户账
号,从而在需要操作各个节点时直接用对应的账号登录获取操作权限。SSH 协议可以为节点上的
账户创建唯一的公私钥,然后利用这些公私钥实现无密码登录,从而让 Hadoop 直接绕开传统的
账号密码登录过程,直接用公私钥访问节点。
生成各个节点的 SSH 公私钥:
cd ~/.ssh # 如果没有该目录,先执行一次 ssh localhost
rm ./id_rsa* # 删除之前生成的公匙(如果有)
ssh-keygen -t rsa # 一直按回车就可以
为了让每个节点都拥有其它节点的公钥,要先把所有公钥放进一个文件里
- 在 master 上,将 master 的公钥复制到 authorized_keys 文件里:
cat ./id_rsa.pub >> ./authorized_keys # cat 命令用于提取内容,>>输出重定向
- 将 slave1、slave2 的公钥文件发送给 master,此时的传送要输入密码:
scp ~/.ssh/id_rsa.pub hadoop@master:/home/hadoop/
- Master 将接收到的 slave1 的公钥文件里的内容提取追加到 authorized_keys 文
件里:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
- 将 slave2 的公钥内容也放进 authorized_keys 文件,然后将
authorized_keys 文件分别发送到两个 slave 的~/.ssh/下:
scp ~/.ssh/authorized_keys hadoop@slave1:/home/hadoop/.ssh/
搭建成功表现:每个节点尝试使用 ssh <角色名>的命令直接登录其它节点,直到每个节点都可以
成功免密码登录其它节点,则免密码登录配置成功! 如在 master 上输入:ssh slave1
即可直接登陆slave1的虚拟机,不需要再输入密码登陆,便于后续实验操作。
配置 Java环境和Hadoop环境
安装包准备:
jdk-8u60-linux-x64.tar
hadoop-2.6.0.tar.gz
- 安装 JDK
将上传的 JDK 压缩包(jdk-8u60-linux-x64.tar)放到根目录/home/hadoop/
,解
压并放到指定的文件夹:
sudo mkdir -p /usr/local/jvm
tar -zxvf jdk-8u60-linux-x64.tar.gz -C /usr/local/jvm
- 安装 Hadoop
在各个节点上将 hadoop 解压到/usr/local/
目录下,改变其所属用户和所属组(让
hadoop 软件用 hadoop 账号登录时对 hadoop 文件夹拥有最高权限):
tar -zxvf hadoop-2.6.0.tar.gz -C /usr/local/
sudo mv /usr/loca/hadoop-2.6.0 /usr/local/hadoop #mv 实现重命名
sudo chown -R hadoop:hadoop /usr/local/hadoop
将当前的 PATH 环境变量提取保存到 P.sh
//环境变量如下:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/hadoop/bin:/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/hive/bin
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export JAVA_HOME=/usr/local/jvm/jdk1.8.0_60
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
export PATH=$PATH:${JAVA_HOME}/bin:$HADOOP_HOME/bin:$HADOOP/sbin:$PATH:${HIVE_HOME}/bin
之后每次重启系统都需要重定向环境变量
echo $PATH >> ~/setenv.sh
vi ~/P.sh
使环境变量生效:
source ~/setenv.sh
查看java版本信息,如果出现版本信息则环境配置成功
java -version
javac -version
重点:hadoop节点配置
修改 slaves 文件,让 hadoop 知道自己可以聚合的节点名(保证与 hosts 里的角色
名一致)
vi /usr/local/hadoop/etc/hadoop/slaves
master
slave1
slave2
修改 core-site.xml 文件如下:
配置端口和路径
vi /usr/local/hadoop/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
修改 hdfs-site.xml 文件如下(启用所有节点作为 DataNode,包括master故 replication_value=3):
当节点增多时,需要更改配置文件,如主机名、IP地址、节点信息等配置都要重新修改
vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/hdfs/data</value>
</property>
</configuration>
修改 mapred-site.xml 文件如下:
vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
yarn为集群的表示
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改 yarn-site.xml 文件如下(启用 yarn 资源管理器),为大数据计算分配计算、存储资源等
vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
修改 hadoop-env.sh 文件,将 25 行 JAVA_HOME 的值换成 jdk 所在的路径:
vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh
当前jdk路径为:JAVA_HOME=/usr/local/jvm/jdk1.8.0_60
重点:hadoop启动及验证
对 hadoop 进行 NameNode 的格式化:
/usr/local/hadoop/bin/hdfs namenode -format
启动 hdfs 和 yarn,并在各个节点上输入 jps 查看启动的服务:
只需在master上启动
/usr/local/hadoop/sbin/start-dfs.sh
/usr/local/hadoop/sbin/start-yarn.sh
或者
/usr/local/hadoop/sbin/start-all.sh
jps # 每个节点都查看一次
尝试在 hdfs 上创建输入文件夹input,并把 测试的txt文本文件放进去:
/usr/local/hadoop/bin/hdfs dfs -mkdir /input
/usr/local/hadoop/bin/hdfs dfs -put /usr/local/hadoop/a.txt /input
/usr/local/hadoop/bin/hdfs dfs -put /usr/local/hadoop/b.txt /input
a.txt
Hello world
bye hadoop
b.txt
bye world
hello hadoop hadoop
可以在外部浏览器输入 master 的 IP 地址和 50070 端口查看 hdfs 上的文件
输入:http://192.168.142.128:50070
尝试用 写一个简单的 WordCount.java代码,统计上面文本文件中每个单词
出现的频数:
hadoop的工作是把大任务切分成小jobs,再通过资源管理器分配存储和计算等资源给相应hadoop集群内的节点
/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-
examples-2.6.0.jar wordcount /input /output
/usr/local/hadoop/bin/hdfs dfs -cat /output/* #查看输出结果
hadoop 搭建完成
三、Hive 数据仓库安装部署及测试
安装包准备
apache-hive-1.2.0-bin.tar.gz
mysql-connector-java-5.1.44-bin.jar
testdata.zip
Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工
具,可以用来 进行数据提取转化加载(ETL) ),这是一种可以存储、查询和分析
存储在 Hadoop 中的大规模数据的机制。另外,它定义了简单的类 SQL 查询
语言,称为 HQL,允许熟悉 SQL 的用户查询数据。
如果是实施的交通数据,那么搭建动态的数据仓库是很有必要的。
原理图
Hive的工作原理简单来说就是一个查询引擎
Hive的架构图:
Hive的工作原理如下:
接收到一个sql,后面做的事情包括:
1.词法分析/语法分析
使用antlr将SQL语句解析成抽象语法树-AST
2.语义分析
从Megastore获取模式信息,验证SQL语句中队表名,列名,以及数据类型的检查和隐式转换,以及Hive提供的函数和用户自定义的函数(UDF/UAF)
3.逻辑计划生产
生成逻辑计划-算子树
4.逻辑计划优化
对算子树进行优化,包括列剪枝,分区剪枝,谓词下推等
5.物理计划生成
将逻辑计划生产包含由MapReduce任务组成的DAG的物理计划
6.物理计划执行
将DAG发送到Hadoop集群进行执行
7.将查询结果返回
流程如下图:
hive和mapreduce共同运作
用户接口
CLI:就是 Shell 命令行.
JDBC:这个是 Hive 的 java 接口,与通常的数据库类似.
WebGUI:网页界面。
驱动组件(Driver)
Hive 的编译、解析、优化转化为 MapReduce 任务提交给 Hadoop 进行分派
和执行相应的任务。
元数据组件(Metatore)
存储着 hive 的元数据信息,包括表名、列、分区和属性等。默认数据库为
Derby,为了更健壮,一般使用 Mysql 来代替。另外,MetaStore 分为服务
端和客户端,服务端提供给客户端对 RDBMS 的访问服务。
安装 Mysql
sudo apt-get install mysql-server
安装完成后设置数据库root用户的密码,123456
配置 Mysql
mysql –uroot –p 的 使用初始化时设置的 root 密码登录
新增 hive 用户,并给于权限:
create user 'hive' identified by 'hive';
grant all privileges on *.* to 'hive' with grant option;
flush privileges;
Hive 安装与配置
- 安装 hive
将 apache-hive-1.2.0-bin.tar.gz 解压在/usr/local 目录下
sudo tar –zxvf apache-hive-1.2.0-bin.tar.gz –C /usr/local
重命名文件夹为 hive 文件夹,并将其权限修改成 hadoop
mv /usr/local/ apache-hive-1.2.0-bin /usr/local/hive
sudo chown -R hadoop:hadoop /usr/local/hive
把 mysql 的 jdbc 的驱动 mysql-connector-java-5.1.44-bin.jar 拷贝到
\usr\local\hive\lib 目录下
cp mysql-connector-java-5.1.44-bin.jar /usr/local/hive/lib
- 配置环境变量
修改之前的P.sh
//环境变量如下:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/hadoop/bin:/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/hive/bin
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export JAVA_HOME=/usr/local/jvm/jdk1.8.0_60
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
export PATH=$PATH:${JAVA_HOME}/bin:$HADOOP_HOME/bin:$HADOOP/sbin:$PATH:${HIVE_HOME}/bin
修改完成后source P.sh
- Hive 的配置
hive 有关于 metastore 具有三种配置,分别为内嵌模式、本地元存储以及远程
在 元存储.
目前在 namenode 上配置服务端,datanode 上配置为客户端,在 datanode
行 进行 hql 时通过远程模式访问在 namenode 的元数据。(实际场景 metastore 的数据库可以在任何节点,以减轻 namenode 的压力)
在 /usr/local/hive/conf 目录下创建 hive-site.xml 文件:
sudo vi /usr/local/hive/conf/hive-site.xml
在 server 端配置 hive-stie.xml,修改后保存
ConnectionURL 属性用于设置 mysql 服务所在地址与端口,这里 mysql-server 在 在
本地, hive.metastore.warehouse.dir 是在 HDFS 上的文件路径,hive.metastore.local 的 的
为 值为 true 表示对 metastore 的访问为本地模式。
<?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://localhost:3306/db_hive?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>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
/////////////////////////////////////////////////////////////////
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.142.128</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.schedulaer.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
</configuration>
在 client 端配置 hive-stie.xml,修改后保存
hive.metastore.uris 项指向提供数据库访问的 metastore 服务端,值须为 IP 地 地
了 址。由于设置了 uris 的内容,因而对于 metastore 的访问默认为远程模式。
<?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>/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.142.128:9083</value>
</property>
</configuration>
- 运行 Hive
检查 jline 版本,hive 与 hadoop 的 jline 版本不对应可能导致运行错误,
先删除之前的旧版本,然后将 hive 上 jline 的 jar 包拷贝至 hadoop 的对应目录下:
cp /usr/local/hive/lib/jline-2.12.jar /usr/local/hadoop/share/hadoop/yarn/lib
更新 yarn-site.xml 配置
**重要:为了使得 mapreduce 程序可以在各个节点提交,对各个节点的 hive-site.xml 配置文件 追加下 以下 property **
其中 yarn.resourcemanager.hostname 配置的是运行 ResourceManager 进程所在
的主机(master 节点)IP 地址。
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.142.128</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.schedulaer.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
只需在master上进行:
启动hadoop:/usr/local/hadoop/sbin/start-all.sh
初始化 Schema
/usr/local/hive/bin/./schematool –dbType mysql –initSchema
服务端启动 metastore 服务
hive --service metastore
接着在slave1和slave2启动hive的客户端
hive
- 测试hive数据仓库:
导入数据可以是使用Tab间隔的原数据形式,从本地导入。
也可以从 HDFS 中导入。与本地的类似,只要把本地载入的命令中’local’去掉,输入路径即为HDFS 上的路径。
list1.txt
10001 1003 c2sld54sfkid paul
10002 1014 d5dsd32sdkif rose
10005 1008 e0dlp92mklpi harry
10203 1099 p3skd29llsie bob
list2.txt
20004 2991 e2ifp12adlpi alice
20132 1014 l8doo32haodp jerry
50232 3022 d3sod41dsooo smith
40001 1023 s3dfdlksdfj3 rose
登入 hive 客户端,创建 user_info 表
>hive
>create table user_info(uid int, did int, pwd string, uname string)
>row format delimited
>fields terminated by ‘\t’
>lines terminated by ‘\n’;
把数据加载到表:
load data local inpath ‘list*.txt’ into table user_info;
将查询结果插入到表
说明:将所有名为 rose 的记录插入到 account_rose 表中
先创建 account_rose 表
create table user_info(uid int,did int,pwd string,uname string)
row format delimited
fields terminated by '\t'
lines terminated by '\n'
select * from user_info;
Hive数据仓库建立成功
动态数据仓库可以使用jsp进行动态的添加,结合Android、html或者其他可视化工具进行操作
四、spark的配置和测试
Spark 是专为大规模数据处理而设计的快速通
用的计算引擎,有与 hadoop 相似的开源集群计算环境,但是能在某些工作负载方面表现得
更加优越,换句话说,spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可
以优化迭代工作负载。
spark 有三种模式,分别是 standalone、spark on yarn,spark on mesos,这里我们选择 spark on
yarn 的模式,即在我们之前部署的 hadoop 集群上部署 spark。
我的电脑是 1G 运行内存,所以设置的是 1000M,executor cores 是 2(经过测试 driver memory 和 worker。memory 如果小于 512M,executor cores 大于 2 的话用 spark 提交任务会很容易就崩死,提示的是 SparkContext 相关错误)。
- 将 spark-1.6.0-bin-hadoop2.6.tgz 放到/home/hadoop/目录下
- 解压文件到/usr/local 下,重命名文件夹并修改属主
sudo tar -xzvf spark-1.6.0-bin-hadoop2.6.tgz -C /usr/local/
sudo mv /usr/local/spark-1.6.0-bin-hadoop2.6 /usr/local/spark
sudo chown -R hadoop:hadoop /usr/local/spark/
- 利用 spark 的 template 文件生成配置文件
cp /usr/local/spark/conf/spark-env.sh.template /usr/local/spark/conf/spark-env.sh
cp /usr/local/spark/conf/slaves.template /usr/local/spark/conf/slaves
cp /usr/local/spark/conf/spark-defaults.conf.template /usr/local/spark/conf/spark-defaults.conf
- 修改 spark-env.sh,在文件末尾添加如下内容
export HADOOP_HOME=/usr/local/hadoop
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export SPARK_MASTER_IP=master
export SPARK_LOCAL_DIRS=/usr/local/spark
export SPARK_WORKER_MEMORY=1000M
export SPARK_EXECUTOR_MEMORY=1000M
export SPARK_DRIVER_MEMORY=1000M
export SPARK_EXECUTOR_CORES=3
//////////////////////////////////////////
export HADOOP_HOME=/usr/local/hadoop
export JAVA_HOME=/usr/local/jvm/jdk1.8.0_60
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export SPARK_MASTER_IP=master
export SPARK_LOCAL_DIRS=/usr/local/spark
export SPARK_WORKER_MEMORY=1000M
export SPARK_EXECUTOR_MEMORY=1000M
export SPARK_DRIVER_MEMORY=1000M
export SPARK_EXECUTOR_CORES=2
这一步是为了配置spark的运行参数,hadoop_conf_dir的设置是为了让spark运行在yarn上。
几个 memory 命令分别用于设置 driver 和 executor 进程的内存,executor_cores 设置的是每个
executor 进程的 CPU cores 的数量,这些设置请依据自己的电脑实际可负载情况设置。
- 修改 slaves 文件,在文件末尾添加其他节点 IP
vi /usr/local/spark/conf/slaves
修改成
master
slave1
slave2
- 修改 spark-defaults.conf,在文件末尾添加如下内容:
vi /usr/local/spark/conf/spark-defaults.conf
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
spark.eventLog.enabled true
spark.eventLog.dir hdfs://master:9000/historyserverforSpark
spark.yarn.historyServer.address master:18080
spark.history.fs.logDirectory hdfs://master:9000/historyserverforSpark
spark.speculation true
这一步是为保存 spark 的运行日志,并且是保存到 hdfs 上的文件夹里面,方便运维。
-
将配置好的 spark 文件夹传到 slave1、slave2。
-
配置 hadoop:修改 yarn-site.xml 文件,添加新的属性。
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
这一步是为了开启日志整合功能,spark 在遇到问题时,利用命令
/usr/local/hadoop/bin/yarn logs -applicationId XXX
即可查看 applicationId 为 XXX 的实例的运行日志
运行spark
- 开启hadoop集群
/usr/local/hadoop/sbin/start-all.sh
- 在 spark 中创建 historyserverforSpark 文件夹
这个文件夹可以在网页上看见(hdfs)
/usr/local/hadoop/bin/hdfs dfs -mkdir historyserverforSpark
- 运行 spark
/usr/local/spark/sbin/start-all.sh
可以进入 spark 的 webui 查看是否成功启动:192.168.142.128:8080/
可以进入 spark 的 webui 查看节点是否成功启动:192.168.142.128:8080/cluster
- 运行 history-server,这样应用运行完的结果可以通过 webui 看到:
192.168.142.128:18080
/usr/local/spark/sbin/start-history-server.sh
spark运行历史
运行spark实例
- 本地模式
/usr/local/spark/bin/run-example SparkPi > SparkPiRes.txt
vi SparkPiRes.txt
- 在yarn集群上运行
运行可以有client模式和cluster模式
区别如下
When run SparkSubmit --class [mainClass], SparkSubmit will call a childMainClass which is
- client mode, childMainClass = mainClass
- standalone cluster mde, childMainClass = org.apache.spark.deploy.Client
- yarn cluster mode, childMainClass = org.apache.spark.deploy.yarn.Client
The childMainClass is a wrapper of mainClass. The childMainClass will be called in SparkSubmit, and if cluster mode, the childMainClass will talk to the the cluster and launch a process on one woker to run the mainClass.
ps. use "spark-submit -v" to print debug infos.
Yarn client: spark-submit -v --class "org.apache.spark.examples.JavaWordCount" --master yarn JavaWordCount.jar
childMainclass: org.apache.spark.examples.JavaWordCount
Yarn cluster: spark-submit -v --class "org.apache.spark.examples.JavaWordCount" --master yarn-cluster JavaWordCount.jar
childMainclass: org.apache.spark.deploy.yarn.Client
Standalone client: spark-submit -v --class "org.apache.spark.examples.JavaWordCount" --master spark://aa01:7077 JavaWordCount.jar
childMainclass: org.apache.spark.examples.JavaWordCount
Stanalone cluster: spark-submit -v --class "org.apache.spark.examples.JavaWordCount" --master spark://aa01:7077 --deploy-mode cluster JavaWordCount.jar
childMainclass: org.apache.spark.deploy.rest.RestSubmissionClient (if rest, else org.apache.spark.deploy.Client)
Taking standalone spark as example, here is the client mode workflow. The mainclass run in the driver application which could be reside out of the cluster.
client 模式结构
On cluster mode showed as below, SparkSubmit will register driver in the cluster, and a driver process launched in one work running the main class.
cluster模式结构
yarn-client模式可以在运行中看见输出日志。如果是使用 yarn-cluster 模式,在运行过程中不会看到统计结果。需要到日志文件中查看。由于cluster模式,分配资源的driver不在本节点,无法把结果输出到命令行,但是通常cluster模式速度更快一些。因为driver是任务提交后自行分配的,资源和job分配更加合理。
键入命令运行wordcount
/usr/local/spark/bin/spark-submit --deploy-mode cluster --master yarn --driver-memory 1G --class org.apache.spark.examples.JavaWordCount --executor-memory 1G --total-executor-cores 2 /usr/local/spark/lib/spark-examples-1.6.0-hadoop2.6.0.jar hdfs://master:9000/input
出现下图表示程序无错误,运行成功
本次测试使用的也是单词的统计
输入如下
a.txt
Hello world
bye hadoop
b.txt
bye world
hello hadoop hadoop
键入命令查看输出测试的输出结果
/usr/local/hadoop/bin/yarn logs -applicationId XXX
/usr/local/hadoop/bin/yarn logs -applicationId application_1514970361237_0001
/usr/local/hadoop/bin/hdfs dfs -mkdir /input
/usr/local/hadoop/bin/hdfs dfs -put /usr/local/hadoop/a.txt /input
/usr/local/hadoop/bin/hdfs dfs -put /usr/local/hadoop/b.txt /input
https://spark.apache.org/docs/1.6.1/api/scala/index.html#package
https://spark.apache.org/docs/1.6.1/api/scala/index.html#org.apache.spark.rdd.HadoopRDD
lsof -i:18080 查看pid