Hadoop+Hive+Spark平台搭建

Mapreduce+Hive+Spark平台搭建


说明

平台搭建成功后,使用Scala语言进行算法设计和应用的开发。文末有使用scala设计的Item-Based Collaboration Filtering和SlopeOne 两个协同过滤算法(另起文章)

一、搭建准备

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连接三个虚拟机终端

Xshell.png

下载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 # 一直按回车就可以

为了让每个节点都拥有其它节点的公钥,要先把所有公钥放进一个文件里

  1. 在 master 上,将 master 的公钥复制到 authorized_keys 文件里:
cat ./id_rsa.pub >> ./authorized_keys # cat 命令用于提取内容,>>输出重定向

  1. 将 slave1、slave2 的公钥文件发送给 master,此时的传送要输入密码:
scp ~/.ssh/id_rsa.pub hadoop@master:/home/hadoop/

  1. Master 将接收到的 slave1 的公钥文件里的内容提取追加到 authorized_keys 文
    件里:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

  1. 将 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

  1. 安装 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

  1. 安装 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 # 每个节点都查看一次
jps.png

尝试在 hdfs 上创建输入文件夹input,并把 测试的txt文本文件放进去:

/usr/loca/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

sumary-hadoop.png
hadoopdatanode.png
hadoop-input.png

尝试用 写一个简单的 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-output.png

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架构.png

Hive的工作原理如下:
接收到一个sql,后面做的事情包括:
1.词法分析/语法分析
使用antlr将SQL语句解析成抽象语法树-AST

2.语义分析
从Megastore获取模式信息,验证SQL语句中队表名,列名,以及数据类型的检查和隐式转换,以及Hive提供的函数和用户自定义的函数(UDF/UAF)

3.逻辑计划生产
生成逻辑计划-算子树

4.逻辑计划优化
对算子树进行优化,包括列剪枝,分区剪枝,谓词下推等

5.物理计划生成
将逻辑计划生产包含由MapReduce任务组成的DAG的物理计划

6.物理计划执行
将DAG发送到Hadoop集群进行执行

7.将查询结果返回

流程如下图:


hive流程.png

hive和mapreduce共同运作

hive原理.png

用户接口
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 安装与配置

  1. 安装 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

  1. 配置环境变量

修改之前的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

  1. 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>

  1. 运行 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

  1. 测试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-result.png

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 相关错误)。

  1. 将 spark-1.6.0-bin-hadoop2.6.tgz 放到/home/hadoop/目录下
  2. 解压文件到/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/

  1. 利用 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

  1. 修改 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

这一步是为了配置spark的运行参数,hadoop_conf_dir的设置是为了让spark运行在yarn上。
几个 memory 命令分别用于设置 driver 和 executor 进程的内存,executor_cores 设置的是每个
executor 进程的 CPU cores 的数量,这些设置请依据自己的电脑实际可负载情况设置。

  1. 修改 slaves 文件,在文件末尾添加其他节点 IP
vi /usr/local/spark/conf/slaves

修改成

master
slave1
slave2
  1. 修改 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 上的文件夹里面,方便运维。

  1. 将配置好的 spark 文件夹传到 slave1、slave2。
  1. 配置 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

  1. 开启hadoop集群
/usr/local/hadoop/sbin/start-all.sh
  1. 在 spark 中创建 historyserverforSpark 文件夹

这个文件夹可以在网页上看见(hdfs)

/usr/local/hadoop/bin/hdfs dfs -mkdir historyserverforSpark

  1. 运行 spark
/usr/local/spark/sbin/start-all.sh

可以进入 spark 的 webui 查看是否成功启动:192.1468.142.128:8080/
可以进入 spark 的 webui 查看节点是否成功启动:192.1468.142.128:8080/cluster

sparkstartall.png
  1. 运行 history-server,这样应用运行完的结果可以通过 webui 看到:192.1468.142.128:18080
usr/local/spark/sbin/start-history-server.sh

spark运行历史

spark

运行spark实例

  1. 本地模式
/usr/local/spark/bin/run-example SparkPi > SparkPiRes.txt

vi SparkPiRes.txt
Piresult.png
  1. 在yarn集群上运行

运行可以有client模式和cluster模式
区别如下

When run SparkSubmit --class [mainClass], SparkSubmit will call a childMainClass which is

  1. client mode, childMainClass = mainClass
  1. standalone cluster mde, childMainClass = org.apache.spark.deploy.Client
  1. 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 模式结构


clientmode.jpg

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模式结构


clustermode.jpg

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.3-hadoop2.6.0.jar hdfs://master:9000/input

出现下图表示程序无错误,运行成功

spark成功.png

本次测试使用的也是单词的统计
输入如下

a.txt
Hello world
bye hadoop

b.txt
bye world
hello hadoop hadoop

键入命令查看输出测试的输出结果
/usr/local/hadoop/bin/yarn logs -applicationId XXX

sparkwordcount.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容