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

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

  1. 在 master 上,将 master 的公钥复制到 authorized_keys 文件里:
cat ./id_rsa.pub >> ./authorized_keys # cat 命令用于提取内容,>>输出重定向
  1. 将 slave1、slave2 的公钥文件发送给 master,此时的传送要输入密码:
scp ~/.ssh/id_rsa.pub [email protected]:/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 [email protected]:/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 # 每个节点都查看一次

尝试在 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 安装与配置

  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数据仓库建立成功

动态数据仓库可以使用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

//////////////////////////////////////////
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 的数量,这些设置请依据自己的电脑实际可负载情况设置。

  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。
  2. 配置 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.168.142.128:8080/

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

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

spark运行历史

运行spark实例

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

vi SparkPiRes.txt

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

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

原文地址:https://www.cnblogs.com/zhongfuze/p/9209061.html

时间: 2024-10-09 16:40:11

Mapreduce+Hive+Spark+Scala平台搭建的相关文章

Mac 下 Scala 平台搭建

1.先要安装 JDK,下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装成功后在终端输入 java –version 可以看到版本信息即为安装成功: ? ~ java -version java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java Hot

Apache Spark源码走读之12 -- Hive on Spark运行环境搭建

欢迎转载,转载请注明出处,徽沪一郎. 楔子 Hive是基于Hadoop的开源数据仓库工具,提供了类似于SQL的HiveQL语言,使得上层的数据分析人员不用知道太多MapReduce的知识就能对存储于Hdfs中的海量数据进行分析.由于这一特性而收到广泛的欢迎. Hive的整体框架中有一个重要的模块是执行模块,这一部分是用Hadoop中MapReduce计算框架来实现,因而在处理速度上不是非常令人满意.由于Spark出色的处理速度,有人已经成功将HiveQL的执行利用Spark来运行,这就是已经非常

spark集群搭建整理之解决亿级人群标签问题

最近在做一个人群标签的项目,也就是根据客户的一些交易行为自动给客户打标签,而这些标签更有利于我们做商品推荐,目前打上标签的数据已达5亿+, 用户量大概1亿+,项目需求就是根据各种组合条件寻找标签和人群信息. 举个例子: 集合A: ( 购买过“牙膏“的人交易金额在10-500元并且交易次数在5次的客户并且平均订单价在20 -200元)  . 集合B: (购买过“牙刷”的人交易金额在5-50 并且交易次数在3次的客户并且平均订单价在10-30元). 求:<1>  获取集合A  交 集合B 客户数

分布式平台搭建

分布式平台搭建 acmore 2018.6.17 1. 搭建Hadoop 以下操作皆基于Ubuntu 16.04 32位环境 & Hadoop 2.7.3版本 1.1 单节点环境 首先安装相关的准备环境 $ sudo apt update $ sudo apt install -y default-jdk $ sudo apt install -y vim $ sudo apt install -y openssh-server 配置JAVA_HOME 一般来说Ubuntu平台上通过defaul

mapreduce和spark的原理及区别

Mapreduce和spark是数据处理层两大核心,了解和学习大数据必须要重点掌握的环节,根据自己的经验和大家做一下知识的分享. 首先了解一下Mapreduce,它最本质的两个过程就是Map和Reduce,Map的应用在于我们需要数据一对一的元素的映射转换,比如说进行截取,进行过滤,或者任何的转换操作,这些一对一的元素转换就称作是Map:Reduce主要就是元素的聚合,就是多个元素对一个元素的聚合,比如求Sum等,这就是Reduce. Mapreduce是Hadoop1.0的核心,Spark出现

看懂大数据的技术生态圈 Hadoop,hive,spark(转载)

先给出原文链接: 原文链接 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它比作一个厨房所以需要的各种工具.锅碗瓢盆,各有各的用处,互相之间又有重合.你可以用汤锅直接当碗吃饭喝汤,你可以用小刀或者刨子去皮.但是每个工具有自己的特性,虽然奇怪的组合也能工作,但是未必是最佳选择. 大数据,首先你要能存的下大数据. 传统的文件系统是单机的,不能横跨不同的机器.HDFS(Hadoop Distributed File System

了解大数据的技术生态系统 Hadoop,hive,spark(转载)

首先给出原文链接: 原文链接 大数据本身是一个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你能够把它比作一个厨房所以须要的各种工具. 锅碗瓢盆,各有各的用处.互相之间又有重合.你能够用汤锅直接当碗吃饭喝汤,你能够用小刀或者刨子去皮. 可是每一个工具有自己的特性,尽管奇怪的组合也能工作,可是未必是最佳选择. 大数据,首先你要能存的下大数据. 传统的文件系统是单机的,不能横跨不同的机器. HDFS(Hadoop Distributed File

Storm on Yarn :原理分析+平台搭建

Storm on YARN: Storm on YARN被视为大规模Web应用与传统企业应用之间的桥梁.它将Storm事件处理平台与YARN(Yet Another Resource Negotiator)应用管理框架进行了组合,为此前进行批处理的Hadoop应用提供了低延迟的处理能力. 诞生背景(yahoo): 雅虎公司平台副总裁Bruno Fernandez-Ruiz表示,他们发现Hadoop在处理海量数据时的速度还不够快.Hadoop和MapReduce的速度无法满足用户事件,比如电子邮件

基于Spark MLlib平台的协同过滤算法---电影推荐系统

基于Spark MLlib平台的协同过滤算法---电影推荐系统 又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用. 说到推荐系统,大家可能立马会想到协同过滤算法.本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用.其中,主要包括三部分内容: 协同过滤算法概述 基于模型的协同过滤应用---电影推荐 实时推荐架构分析     一.协同过滤算法概述 本人对算法的研究,目前还不是很深入,这里简单的介绍下其工作原理. 通常,