先电大数据安装手册

版权声明:@抛物线 https://blog.csdn.net/qq_28513801/article/details/83512194

先电大数据安装手册

版本:先电 Cloud-BigData-v2.2
发布日期:2017年12月

南京第五十五所技术开发有限公司

版本修订说明

修订版本 修订时间 修订说明
XD-BigData-v1.3 2015年10月28日 先电大数据平台用户册
XD-BigData-v1.3.1 2016年1月19日 增加GRE、VLAN网络的部署方法
XD-BigData-v1.4 2016年4月12日 为防止与Java Web中MapReduce开发混淆。删除hadoop案例开发
XD-BigData-v2.0 2016年11月1日 更新基于Ambari版本 2.2.2.0二次开发的hadoop平台
XD-BigData-v2.0.1 2016年12月30日 更新镜像中与perl版本不兼容问题的解决办法;
XD-BigData-v2.0.2 2017年01月10日 升级系统版本为centos7,升级HDP版本至2.4。
XD-BigData-v2.0.3 2017年02月13日 更新软件包logo
XD-BigData-v2.0.5 2017年02月21日 更新软件包logo,修改文档“8.2.2基于项目的协同过滤”
表格参数
XD-BigData-v2.1 2017年04月21日 更新用户手册
XD-BigData-v2.2 2017年12月7日 更新Ambari为2.6.0.0,HDP为2.6.1.0

目 录
1 概述 5
1.1 大数据简介 5
1.2 先电大数据平台简介 5
2 基本环境配置 6
2.1 配置主机名 7
2.2 修改hosts文件 7
2.3 修改yum源 7
2.4 配置ntp 8
2.5 配置SSH 9
2.6 禁用Transparent Huge Pages 9
2.7 安装配置JDK 10
3 配置ambari-server 11
3.1 安装MariaDB数据库 11
3.2 安装配置ambari-server 12
4 配置ambari-agent 14
5 部署管理Hadoop集群 14
5.1 部署Hadoop集群 14
5.2 HDFS运维管理 21
5.3 MapReduce 31
6 部署Hive数据仓库 33
6.1 部署Hive 33
6.1 Hive用户指南 35
7 部署Hbase分布式列数据库 45
7.1 部署HBase 45
7.2 测试验证 47
7.3 HBase用户指南 47
8 部署Mahout数据挖据工具 53
8.1 部署Mahout 53
8.2 测试验证 54
9 部署Pig数据分析平台 55
9.1 部署Pig 55
9.2 Pig简介 55
9.3 运行案例 56

1 概述
1.1 大数据简介
“大数据”是一个体量特别大,数据类别特别庞杂的数据集合,并且这样的数据集无法用传统数据库工具或常规软件工具抓取、管理和处理其内容。大数据技术是指从各种各样类型的庞杂数据中,快速的获取有价值的信息的能力。适用于大数据的技术包括大规模并行处理数据库,数据挖掘电网,分布式文件系统,分布式数据库,云计算平台和可扩展的存储系统。
Apache的Hadoop项目是可靠的、可扩展的、开源的、分布式计算软件。Apache的Hadoop软件库是允许通过相对简单的程序模型构建计算集群为庞大的数据集进行分布式计算的框架。
Hadoop的设计思想可以将计算模式从单节点服务器扩展为数以千计的计算集群,每一个单独的服务器都提供自主的本地计算及存储能力。
对于高可用指标而言,Hadoop软件库自身可以通过检测和故障调试从应用层来实现高可用而不需要关心硬件底层的高可用性。所以提供一个计算集群上层的高可用服务对于集群故障修复而言就显得至关重要。
1.2 先电大数据平台简介
先电大数据平台是基于Ambari进行二次开发的Hadoop分布式集群配置管理工具,该平台通过安装向导来进行集群的搭建,简化了集群供应。同时,他还有一个监控组件,叫做Ambari-Metrics,可以提前配置好关键的运维指标(metrics),然后收集集群的中服务、主机等运行状态等信息,通过WEB的方式显示出来。我们可以直接查看Hadoop Core(HDFS和MapReduce)及相关项目(如HBase、Hive和HCatalog)是否健康。它的用户界面非常直观,用户可以轻松有效地查看信息并控制集群。
先电大数据平台支持作业与任务执行的可视化与分析,能够更好地查看依赖和性能。通过一个完整的RESTful API把监控信息暴露出来,集成了现有的运维工具。平台使用Ganglia收集度量指标,用Nagios支持系统报警。

图1.1 Ambari结构图
其中Ambari是一个分布式架构的软件,主要由两部分组成:Ambari Server 和 Ambari Agent,如图1-1所示。Ambari Server 会读取 Stack 和 Service 的配置文件。当用 Ambari 创建集群的时候,Ambari Server 传送 Stack 和 Service 的配置文件以及 Service 生命周期的控制脚本到 Ambari Agent。Agent 拿到配置文件后,会下载安装公共源里软件包(Redhat,就是使用 yum 服务)。安装完成后,Ambari Server 会通知 Agent 去启动 Service。之后 Ambari Server 会定期发送命令到 Agent 检查 Service 的状态,Agent 上报给 Server,并呈现在 Ambari 的 GUI 上,方便用户了解到集群的各种状态,并进行相应的维护。

图 1-1 Ambari架构图
2 基本环境配置
以两台节点为例来组件Hadoop分布式集群,这里采用的系统版本为Centos7,如下表所示:
主机名 内存 硬盘 IP地址 角色
master 8192MB 100G 192.168.200.131 Ambari-Server
Ambari-Agent
slave1 4096MB 100G 192.168.200.133 Ambari-Agent
2.1 配置主机名

master

hostnamectl set-hostname master

hostname

master

slave1

hostnamectl set-hostname slave1

hostname

slave1
2.2 修改hosts文件

master

vi /etc/hosts

192.168.200.131 master.hadoop master
192.168.200.133 slave1.hadoop

slave1

vi /etc/hosts

192.168.200.131 master.hadoop
192.168.200.133 slave1.hadoop slave1
注意:主机名映射采用FQDN格式。
2.3 修改yum源

master

将XianDian-BigData-v2.2.iso挂在到/mnt目录下,将其中的ambari解压到/opt目录下,并在master节点配置ftp服务。
注意:
因为安装大数据相关软件包时,可能会用到相关依赖软件包,所以需要配置Centos7 Yum源,这里可以采用IAAS中的Centos7 Yum源。

master & slave1

cd /etc/yum.repos.d/

rm -vf *

配置Yum源

vi ambari.repo

[centos7]
baseurl=ftp://192.168.2.10/centos7/
( 注:具体的yum源根据真实环境配置,本次为实验室测试环境 )
gpgcheck=0
enabled=1
name=centos
[ambari]
name=ambari
baseurl=ftp://10.0.3.61/ambari
( 注:具体的yum源根据真实环境配置,本次为实验室测试环境 )
enabled=1
gpgcheck=0

master

yum -y install httpd

将/mnt/文件夹中HDP-2.6.1.0和HDP-UTILS-1.1.0.21两个文件夹拷贝到/var/www/html/目录下。启动httpd服务。

systemctl enable httpd.service

systemctl status httpd.service

2.4 配置ntp

master

yum -y install ntp

vi /etc/ntp.conf

注释或者删除以下四行
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
添加以下两行
server 127.127.1.0
fudge 127.127.1.0 stratum 10
#systemctl enable ntpd
#systemctl start ntpd

slave1

yum -y install ntpdate

ntpdate master

systemctl enable ntpdate

2.5 配置SSH

master & slave1

检查2个节点是否可以通过无密钥相互访问,如果未配置,则进行SSH无密码公钥认证配置。如下:

yum install openssh-clients

ssh-keygen

ssh-copy-id master.hadoop

ssh-copy-id slave1.hadoop

ssh登录远程主机查看是否成功

ssh master.hadoop

exit

ssh slave1.hadoop

exit

2.6 禁用Transparent Huge Pages
操作系统后台有一个叫做khugepaged的进程,它会一直扫描所有进程占用的内存,在可能的情况下会把4kpage交换为Huge Pages,在这个过程中,对于操作的内存的各种分配活动都需要各种内存锁,直接影响程序的内存访问性能,并且,这个过程对于应用是透明的,在应用层面不可控制,对于专门为4k page优化的程序来说,可能会造成随机的性能下降现象。

master & slave1

cat /sys/kernel/mm/transparent_hugepage/enabled

[always] madvise never

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo never > /sys/kernel/mm/transparent_hugepage/defrag

cat /sys/kernel/mm/transparent_hugepage/enabled

always madvise [never]
重启后失效,需要再次执行
2.7 安装配置JDK

master

mkdir /usr/jdk64/

mount -o loop XianDian-BigData-v2.2.iso /mnt/

cd /mnt/

tar -zxvf jdk-8u77-linux-x64.tar.gz -C /usr/jdk64/

vi /etc/profile

export JAVA_HOME=/usr/jdk64/jdk1.8.0_77
export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: PATH

source /etc/profile

#java –version
java version “1.8.0_77”
Java™ SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot™ 64-Bit Server VM (build 25.77-b03, mixed mode)

slave1

#mkdir /usr/jdk64/
#scp 172.24.14.106://mnt/jdk-8u77-linux-x64.tar.gz .

tar -zxvf jdk-8u77-linux-x64.tar.gz -C /usr/jdk64/

vi /etc/profile

export JAVA_HOME=/usr/jdk64/jdk1.8.0_77
export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: PATH

source /etc/profile

#java –version
java version “1.8.0_77”
Java™ SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot™ 64-Bit Server VM (build 25.77-b03, mixed mode)
3 配置ambari-server

master

yum -y install ambari-server

3.1 安装MariaDB数据库

master

yum install mariadb mariadb-server mysql-connector-java

启动服务

systemctl enable mariadb

systemctl start mariadb

配置MySQL
#mysql_secure_installation
按enter确认后设置数据库root密码,我们这里设置为“bigdata”
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] n
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
创建ambari数据库

mysql -uroot -pbigdata

MariaDB [(none)]> create database ambari;
MariaDB [(none)]> grant all privileges on ambari.* to ‘ambari’@‘localhost’ identified by ‘bigdata’;
MariaDB [(none)]> grant all privileges on ambari.* to ‘ambari’@’%’ identified by ‘bigdata’;
MariaDB [(none)]> use ambari;
MariaDB [ambari]> source /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql
MariaDB [ambari]> quit

3.2 安装配置ambari-server

master

vi /etc/profile
export buildNumber=2.6.0.0

ambari-server setup

WARNING: SELinux is set to ‘permissive’ mode and temporarily disabled.
OK to continue [y/n] (y)?
Customize user account for ambari-server daemon [y/n] (n)? n
Checking JDK…
[1] Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8
[2] Oracle JDK 1.7 + Java Cryptography Extension (JCE) Policy Files 7
[3] Custom JDK

Enter choice (1): 3
Path to JAVA_HOME: /usr/jdk64/jdk1.8.0_77
Validating JDK on Ambari Server…done.
Completing setup…
Configuring database…
Enter advanced database configuration [y/n] (n)? y
Configuring database…

Choose one of the following options:
[1] - PostgreSQL (Embedded)
[2] - Oracle
[3] - MySQL
[4] - PostgreSQL
[5] - Microsoft SQL Server (Tech Preview)
[6] - SQL Anywhere

Enter choice (1): 3
Hostname (localhost):
Port (3306):
Database name (ambari):
Username (ambari):
Enter Database Password (bigdata):
Proceed with configuring remote database connection properties [y/n] (y)?
Ambari Server ‘setup’ completed successfully.

ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java.jar

启动ambari-server服务

ambari-server start

登陆界面http://192.168.200.131:8080/
登录用户名密码为admin:admin

4 配置ambari-agent

master & slave1

yum -y install ambari-agent

vi /etc/ambari-agent/conf/ambari-agent.ini

[server]
hostname= master.hadoop < your.ambari.server.hostname>

ambari-agent restart

tail -f /var/log/ambari-agent/ambari-agent.log

INFO 2017-01-12 09:44:20,919 Controller.py:265 - Heartbeat response received (id = 1340)
INFO 2017-01-12 09:44:30,820 Heartbeat.py:78 - Building Heartbeat: {responseId = 1340, timestamp = 1484214270820, commandsInProgress = False, componentsMapped = True}

5 部署管理Hadoop集群
5.1 部署Hadoop集群
登陆界面http://{IP Address}:8080/,用户名密码为admin:admin。接下来就可以启动安装向导,创建集群,安装服务。

这里要设置Grafana Admin的密码。

部署成功后,便可成功进入界面。在主界面中,可以查看集群状态监控信息。

在HadoopMaster的终端执行jps命令,在打印结果中会看到master上运行的进程,这些进程表示主节点进程启动成功。

在HadoopSlave 的终端执行jps命令,也会看到相应的进程:
Slave1:

5.2 HDFS运维管理
5.2.1 HDFS命令手册

  1. 概述
    切换到hdfs用户,可以通过“hadoop fs -”命令来查看HDFS文件系统的帮助命令,通过提示的命令来对文件系统进行管理。
    命令如下:
    $ hadoop fs -
    执行结果如下:

所有的hadoop命令均由bin/hadoop脚本引发。不指定参数运行hadoop脚本会打印所有命令的描述。
用法:hadoop [–config confdir] [COMMAND] [GENERIC_OPTIONS] [COMMAND_OPTIONS]
Hadoop有一个选项解析框架用于解析一般的选项和运行类。
命令选项 描述
–config confdir 覆盖缺省配置目录。缺省是${HADOOP_HOME}/conf
GENERIC_OPTIONS 多个命令都支持的通用选项
COMMAND 命令选项S 各种各样的命令和它们的选项会在下面提到。这些命令被分为 用户命令 管理命令两组。
2. 权限管理
在Hadoop集群中,只有hdfs用户才有对HDFS文件系统的管理权限,当其它用户对文件系统进行操作,需要给其赋予相应的权限,这里为了方便操作,将所有用户的读写执行权限全部放开,命令如下:

su hdfs

$ hadoop fs -chmod -R 777 /

  1. 常规选项
    下面的选项被 dfsadmin, fs, fsck和 job支持。 应用程序要实现 Tool来支持常规选项。
    GENERIC_OPTION 描述
    -conf 指定应用程序的配置文件。
    -D <property=value> 为指定property指定值value。
    -fs <local|namenode:port> 指定namenode。
    -jt <local|jobtracker:port> 指定job tracker。只适用于job。
    -files <逗号分隔的文件列表> 指定要拷贝到map reduce集群的文件的逗号分隔的列表。 只适用于job。
    -libjars <逗号分隔的jar列表> 指定要包含到classpath中的jar文件的逗号分隔的列表。 只适用于job。
    -archives <逗号分隔的archive列表> 指定要被解压到计算节点上的档案文件的逗号分割的列表。 只适用于job。

  2. 用户命令
    hadoop集群用户的常用命令。
    archive
    创建一个hadoop档案文件。参考 Hadoop Archives.
    用法:hadoop archive -archiveName NAME -p *
    命令选项 描述
    -archiveName NAME 要创建的档案的名字。
    -p 父路径,格式与正则表达式一致。
    src 父路径下面需要创建档案的文件名(可多个)
    dest 保存档案文件的目标目录。
    distcp
    递归地拷贝文件或目录。参考DistCp指南以获取等多信息。
    用法:hadoop distcp
    命令选项 描述
    srcurl 源Url
    desturl 目的Url
    fs
    用法:hadoop fs [GENERIC_OPTIONS] [COMMAND_OPTIONS]
    运行一个常规的文件系统客户端。
    fsck
    运行HDFS文件系统检查工具。参考Fsck了解更多。
    用法:hadoop fsck [GENERIC_OPTIONS] [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]
    命令选项 描述
    检查的起始目录。
    -move 移动受损文件到/lost+found
    -delete 删除受损文件。
    -openforwrite 打印出写打开的文件。
    -files 打印出正被检查的文件。
    -blocks 打印出块信息报告。
    -locations 打印出每个块的位置信息。
    -racks 打印出data-node的网络拓扑结构。
    jar
    运行jar文件。用户可以把他们的Map Reduce代码捆绑到jar文件中,使用这个命令执行。
    用法:hadoop jar [mainClass] args…
    job
    用于和Map Reduce作业交互和命令。
    用法:hadoop job [GENERIC_OPTIONS] [-submit ] | [-status ] | [-counter ] | [-kill ] | [-events <from-event-#> <#-of-events>] | [-history [all] ] | [-list [all]] | [-kill-task ] | [-fail-task ]
    命令选项 描述
    -submit 提交作业
    -status 打印map和reduce完成百分比和所有计数器。
    -counter 打印计数器的值。
    -kill 杀死指定作业。
    -events <from-event-#> <#-of-events> 打印给定范围内jobtracker接收到的事件细节。
    -history [all] -history 打印作业的细节、失败及被杀死原因的细节。更多的关于一个作业的细节比如成功的任务,做过的任务尝试等信息可以通过指定[all]选项查看。
    -list [all] -list all显示所有作业。-list只显示将要完成的作业。
    -kill-task 杀死任务。被杀死的任务不会不利于失败尝试。
    -fail-task 使任务失败。被失败的任务会对失败尝试不利。
    pipes
    运行pipes作业。
    用法:hadoop pipes [-conf ] [-jobconf <key=value>, <key=value>, …] [-input ] [-output ] [-jar ] [-inputformat ] [-map ] [-partitioner ] [-reduce ] [-writer ] [-program ] [-reduces ]
    命令选项 描述
    -conf 作业的配置
    -jobconf <key=value>, <key=value>, … 增加/覆盖作业的配置项
    -input 输入目录
    -output 输出目录
    -jar Jar文件名
    -inputformat InputFormat类
    -map Java Map类
    -partitioner Java Partitioner
    -reduce Java Reduce类
    -writer Java RecordWriter
    -program 可执行程序的URI
    -reduces reduce个数
    version
    打印版本信息。
    用法:hadoop version
    CLASSNAME
    hadoop脚本可用于调调用任何类。
    用法:hadoop CLASSNAME
    运行名字为CLASSNAME的类。

  3. 管理命令
    hadoop集群管理员常用的命令。
    balancer
    运行集群平衡工具。管理员可以简单的按Ctrl-C来停止平衡过程。参考Rebalancer了解更多。
    用法:hadoop balancer [-threshold ]
    命令选项 描述
    -threshold 磁盘容量的百分比。这会覆盖缺省的阀值。
    daemonlog
    获取或设置每个守护进程的日志级别。
    用法:hadoop daemonlog -getlevel host:port
    用法:hadoop daemonlog -setlevel host:port
    命令选项 描述
    -getlevel host:port 打印运行在host:port的守护进程的日志级别。这个命令内部会连接http://host:port/logLevel?log=
    -setlevel host:port 设置运行在host:port的守护进程的日志级别。这个命令内部会连接http://host:port/logLevel?log=
    datanode
    运行一个HDFS的datanode。
    用法:hadoop datanode [-rollback]
    命令选项 描述
    -report 报告文件系统的基本信息和统计信息。
    -safemode enter | leave | get | wait 安全模式维护命令。安全模式是Namenode的一个状态,这种状态下,Namenode

  4. 不接受对名字空间的更改(只读)

  5. 不复制或删除块
    Namenode会在启动时自动进入安全模式,当配置的块最小百分比数满足最小的副本数条件时,会自动离开安全模式。安全模式可以手动进入,但是这样的话也必须手动关闭安全模式。
    -refreshNodes 重新读取hosts和exclude文件,更新允许连到Namenode的或那些需要退出或入编的Datanode的集合。
    -finalizeUpgrade 终结HDFS的升级操作。Datanode删除前一个版本的工作目录,之后Namenode也这样做。这个操作完结整个升级过程。
    -upgradeProgress status | details | force 请求当前系统的升级状态,状态的细节,或者强制升级操作进行。
    -metasave filename 保存Namenode的主要数据结构到hadoop.log.dir属性指定的目录下的文件。对于下面的每一项,中都会一行内容与之对应

  6. Namenode收到的Datanode的心跳信号

  7. 等待被复制的块

  8. 正在被复制的块

  9. 等待被删除的块
    -setQuota … 为每个目录 设定配额。目录配额是一个长整型整数,强制限定了目录树下的名字个数。
    命令会在这个目录上工作良好,以下情况会报错:

  10. N不是一个正整数,或者

  11. 用户不是管理员,或者

  12. 这个目录不存在或是文件,或者

  13. 目录会马上超出新设定的配额。
    -clrQuota … 为每一个目录清除配额设定。
    命令会在这个目录上工作良好,以下情况会报错:

  14. 这个目录不存在或是文件,或者

  15. 用户不是管理员。
    如果目录原来没有配额不会报错。
    -help [cmd] 显示给定命令的帮助信息,如果没有给定命令,则显示所有命令的帮助信息。
    secondarynamenode
    运行HDFS的secondary namenode。
    用法:hadoop secondarynamenode [-checkpoint [force]] | [-geteditsize]
    命令选项 描述
    -checkpoint [force] 如果EditLog的大小 >= fs.checkpoint.size,启动Secondary namenode的检查点过程。 如果使用了-force,将不考虑EditLog的大小。
    -geteditsize 打印EditLog大小。
    5.2.2 进程管理

  16. 查看当前系统中启动的进程
    命令如下:

jps

执行结果如下:

  1. 重启NameNode和DateNode进程
    hadoop-daemon.sh脚本是启动和停止hadoop后台程序,“—config”参数指定启动程序时用到的配置文件目录。
    命令如下:

/usr/hdp/current/hadoop-client/sbin/hadoop-daemon.sh --config /usr/hdp/current/hadoop-client/conf stop {namenode/datenode}

/usr/hdp/current/hadoop-client/sbin/hadoop-daemon.sh --config /usr/hdp/current/hadoop-client/conf start {namenode/datenode}

5.2.3 可靠性管理
Hadoop集群中的主机在某些情况下会出现宕机或者系统损坏的问题,一旦遇到这些问题,HDFS文件系统中的数据文件难免会产生损坏或者丢失,为了保证HDFS文件系统的可靠性,可以采取以下策略:

  1. 冗余副本策略
    更改集群冗余副本的复制因子为5,从而避免某台节点主机损坏导致数据丢失的情况,这里我们有两种方式来设置复制因子。
    第一种是通过WEB界面,进入到HDFS配置中修改Block replication的参数值。

第二种方式是在Shell命令行模式下,修改hdfs-site.xml配置文件,将“dfs.replication”的值设置为5,然后重启NameNode和DataNode进程。

vi /etc/hadoop/2.3.6.0-3796/0/hdfs-site.xml

<property>
  <name>dfs.replication</name>
  <value>5</value>
</property>
  1. 安全模式
    当在进行系统维护或者集群维护时,不希望用户进行再去操作HDFS文件系统中文件,这时候需要手动将NameNode设置成安全模式的状态。该操作需要HDFS管理用户来进行实现,即hdfs用户。
    命令如下:
    $ hadoop dfsadmin -safemode enter
    $ hadoop dfsadmin -safemode get
    执行结果如下:
    Safe mode is ON

  2. 回收站
    设置HDFS文件系统回收站中的文件彻底删除的时间间隔为7天。进入到HDFS配置中修改“fs.trash.interval”的值为10080(分钟)。注:当该值为0时,表示禁用回收站的功能。

  3. 快照管理
    为HDFS文件系统中“/1daoyun”目录创建快照,首先需要设置该目录可进行快照功能,然后再进行创建快照。

创建完成后,创建一个恢复文件夹,通过cp命令可以恢复快照,如下:

5.3 MapReduce
5.3.1 运行案例
进入/usr/hdp/2.6.1.0-129/hadoop-mapreduce/目录中,存在一个hadoop-mapreduce-examples-2.7.3.2.6.1.0-129.jar 的案例JAR包,其所自带的案例如下:

这里,我们以运行一个圆周率的计算为例:

cd /usr/hdp/2.6.1.0-129/hadoop-mapreduce/

hadoop jar hadoop-mapreduce-examples-2.7.3.2.6.1.0-129.jar pi 5 5

6 部署Hive数据仓库
6.1 部署Hive
进入先电大数据平台主界面,点击左侧的动作按钮,添加Hive服务。

mysql -uroot -pbigdata

MariaDB [(none)]> create database hive;
MariaDB [(none)]> grant all privileges on hive.* to ‘hive’@‘localhost’ identified by ‘bigdata’;
MariaDB [(none)]> grant all privileges on hive.* to ‘hive’@’%’ identified by ‘bigdata’;
注意:如果使用master节点的MariaDB作为Hive的元数据存储数据库,需要将Hive MetaStore安装在master节点。

6.1 Hive用户指南
6.1.1 测试验证
启动hive客户端

su hive

$ hive

$ logout
退出hive用户
6.1.2 hive 命令参数
usage: hive
-d,–define <key=value> Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
–database Specify the database to use
-e SQL from command line
-f SQL from files
-H,–help Print help information
–hiveconf <property=value> Use value for given property
–hivevar <key=value> Variable subsitution to apply to hive
commands. e.g. --hivevar A=B
-i Initialization SQL file
-S,–silent Silent mode in interactive shell
-v,–verbose Verbose mode (echo executed SQL to the
console)

  1. hive交互模式
    hive> show tables; #查看所有表名
    hive> show tables ‘ad*’ #查看以’ad’开头的表名
    hive> set 命令 #设置变量与查看变量;
    hive> set -v #查看所有的变量
    hive> set hive.stats.atomic #查看hive.stats.atomic变量
    hive> set hive.stats.atomic=false #设置hive.stats.atomic变量
    hive> dfs -ls #查看hadoop所有文件路径
    hive> dfs -ls /user/hive/warehouse/ #查看hive所有文件
    hive> dfs -ls /user/hive/warehouse/ptest #查看ptest文件
    hive> source file #在client里执行一个hive脚本文件
    hive> quit #退出交互式shell
    hive> exit #退出交互式shell
    hive> reset #重置配置为默认值
    hive> !ls #从Hive shell执行一个shell命令
  2. 操作及函数
    查看函数:
    hive> show functions;
    正则查看函数名:
    show functions ‘xpath.*’;
    查看具体函数内容:
    describe function xpath; | desc function xpath;
  3. 字段类型
    Hive支持基本数据类型和复杂类型,基本数据类型主要有数值类型(INT、FLOAT、DOUBLE)、布尔型和字符串,复杂类型有三种:ARRAY、MAP 和 STRUCT。
  4. 基本数据类型
    TINYINT: 1个字节
    SMALLINT: 2个字节
    INT: 4个字节
    BIGINT: 8个字节
    BOOLEAN: TRUE/FALSE
    FLOAT: 4个字节,单精度浮点型
    DOUBLE: 8个字节,双精度浮点型STRING 字符串
  5. 复杂数据类型
    ARRAY: 有序字段
    MAP: 无序字段
    STRUCT: 一组命名的字段

6.1.3 表类型
hive表大致分为普通表、外部表、分区表三种。

  1. 普通表
    创建表
    hive> create table tb_person(id int, name string);
    创建表并创建分区字段ds
    hive> create table tb_stu(id int, name string) partitioned by(ds string);
    查看分区
    hive> show partitions tb_stu;
    显示所有表
    hive> show tables;
    按正则表达式显示表,
    hive> show tables ‘tb_*’;
    表添加一列
    hive> alter table tb_person add columns (new_col int);

添加一列并增加列字段注释
hive> alter table tb_stu add columns (new_col2 int comment ‘a comment’);
更改表名
hive> alter table tb_stu rename to tb_stu;
删除表(hive只能删分区,不能删记录或列 )
hive> drop table tb_stu;
对于托管表,drop 操作会把元数据和数据文件删除掉,对于外部表,只是删除元数据。如果只要删除表中的数据,保留表名可以在 HDFS 上删除数据文件:
hive> dfs -rmr /user/hive/warehouse/mutill1/*
将本地/home/hadoop/ziliao/stu.txt文件中的数据加载到表中, stu.txt文件数据如下:
1 zhangsan
2 lisi
3 wangwu
将文件中的数据加载到表中
hive> load data local inpath ‘/home/hadoop/ziliao/stu.txt’ overwrite into table tb_person;
加载本地数据,同时给定分区信息
hive> load data local inpath ‘/home/hadoop/ziliao/stu.txt’ overwrite into table tb_stu partition (ds=‘2008-08-15’);
备注:如果导入的数据在 HDFS 上,则不需要 local 关键字。托管表导入的数据文件可在数据仓库目录“user/hive/warehouse/”中看到。
查看数据
hive> dfs -ls /user/hive/warehouse/tb_stu
hive> dfs -ls /user/hive/warehouse/tb_person
2. 外部表
external关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(location),hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
eg. 创建外部表:
hive> create external table tb_record(col1 string, col2 string) row format delimited fields terminated by ‘\t’ location ‘/user/hadoop/input’;
这样表tb_record的数据就是hdfs://user/hadoop/input/* 的数据了。
3. 分区表
分区是表的部分列的集合, 可以为频繁使用的数据建立分区, 这样查找分区中的数据时就不需要扫描全表, 这对于提高查找效率很有帮助。
创建分区:create table log(ts bigint,line string) partitioned by(name string);
插入分区:insert overwrite table log partition(name=‘xiapi’) select id from userinfo where name=‘xiapi’;
查看分区:show partitions log;
删除分区: alter table ptest drop partition (name=‘xiapi’)
备注:通常情况下需要先预先创建好分区,然后才能使用该分区。还有分区列的值要转化为文件夹的存储路径,所以如果分区列的值中包含特殊值,如 ‘%’, ‘:’, ‘/’, ‘#’,它将会被使用%加上 2 字节的 ASCII 码进行转义。
6.1.4 sql操作及桶

  1. 创建表
    首先建立三张测试表:
    userinfo表中有两列,以tab键分割,分别存储用户的id和名字name;
    classinfo表中有两列,以tab键分割,分别存储课程老师teacher和课程名classname;
    choice表中有两列,以tab键分割,分别存储用户的userid和选课名称classname(类似中间表)。
    创建测试表:
    hive> create table userinfo(id int,name string) row format delimited fields terminated by ‘\t’;
    hive> create table classinfo(teacher string,classname string) row format delimited fields terminated by ‘\t’;
    hive> create table choice(userid int,classname string) row format delimited fields terminated by ‘\t’;
    注意:’\t’相当于一个tab键盘。
    显示刚才创建的数据表:
    hive> show tables;
  2. 导入数据
    建表后,可以从本地文件系统或 HDFS 中导入数据文件,导入数据样例如下:
    userinfo.txt内容如下(数据之间用tab键隔开):
    1 xiapi
    2 xiaoxue
    3 qingqing
    classinfo.txt内容如下(数据之间用tab键隔开):
    jack math
    sam china
    lucy english
    choice.txt内容如下(数据之间用tab键隔开):
    1 math
    1 china
    1 english
    2 china
    2 english
    3 english
    首先在本地“/home/hadoop/ziliao”下按照上面建立三个文件, 并添加如上的内容信息。
  3. 按照下面导入数据。
    hive> load data local inpath ‘/home/hadoop/ziliao/userinfo.txt’ overwrite into table userinfo;
    hive> load data local inpath ‘/home/hadoop/ziliao/classinfo.txt’ overwrite into table classinfo;
    hive> load data local inpath ‘/home/hadoop/ziliao/choice.txt’ overwrite into table choice;
    查询表数据
    hive> select * from userinfo;
    hive> select * from classinfo;
    hive> select * from choice;
  4. 分区
    创建分区
    hive> create table ptest(userid int) partitioned by (name string) row format delimited fields terminated by ‘\t’;
    准备导入数据
    xiapi.txt内容如下(数据之间用tab键隔开):
    1
    导入数据
    hive> load data local inpath ‘/home/hadoop/ziliao/xiapi.txt’ overwrite into table ptest partition (name=‘xiapi’);
    查看分区
    hive> dfs -ls /user/hive/warehouse/ptest/name=xiapi;
    查询分区
    hive> select * from ptest where name=‘xiapi’;
    显示分区
    hive> show partitions ptest;
    对分区插入数据(每次都会覆盖掉原来的数据):
    hive> insert overwrite table ptest partition(name=‘xiapi’) select id from userinfo where name=‘xiapi’;
    删除分区
    hive> alter table ptest drop partition (name=‘xiapi’)

  5. 可以把表或分区组织成桶, 桶是按行分开组织特定字段, 每个桶对应一个 reduce 操作。在建立桶之前, 需要设置“hive.enforce.bucketing”属性为 true, 使 Hive 能够识别桶。在表中分桶的操作如下:
    hive> set hive.enforce.bucketing=true;
    hive> set hive.enforce.bucketing;
    hive.enforce.bucketing=true;
    hive> create table btest2(id int, name string) clustered by(id) into 3 buckets row format delimited fields terminated by ‘\t’;
    向桶中插入数据, 这里按照用户 id 分了三个桶, 在插入数据时对应三个 reduce 操作,输出三个文件。
    hive> insert overwrite table btest2 select * from userinfo;
    查看数据仓库下的桶目录,三个桶对应三个目录。
    hive> dfs -ls /user/hive/warehouse/btest2;
    Hive 使用对分桶所用的值进行 hash,并用 hash 结果除以桶的个数做取余运算的方式来分桶,保证了每个桶中都有数据,但每个桶中的数据条数不一定相等,如下所示。
    hive>dfs -cat /user/hive/warehouse/btest2/*0_0;
    hive>dfs -cat /user/hive/warehouse/btest2/*1_0;
    hive>dfs -cat /user/hive/warehouse/btest2/*2_0;
    分桶可以获得比分区更高的查询效率,同时分桶也便于对全部数据进行采样处理。下面是对桶取样的操作。
    hive>select * from btest2 tablesample(bucket 1 out of 3 on id);
  6. 多表插入
    多表插入指的是在同一条语句中, 把读取的同一份元数据插入到不同的表中。只需要扫描一遍元数据即可完成所有表的插入操作, 效率很高。多表操作示例如下。
    hive> create table mutill as select id,name from userinfo; #有数据
    hive> create table mutil2 like mutill; #无数据,只有表结构
    hive> from userinfo insert overwrite table mutill
    select id,name insert overwrite table mutil2 select count(distinct id),name group by name;
  7. 连接
    连接是将两个表中在共同数据项上相互匹配的那些行合并起来, HiveQL 的连接分为内连接、左向外连接、右向外连接、全外连接和半连接 5 种。
    a. 内连接(等值连接)
    内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。
    例如, 检索userinfo和choice表中标识号相同的所有行。
    hive> select userinfo., choice. from userinfo join choice on(userinfo.id=choice.userid);
    b. 左连接
    左连接的结果集包括“LEFT OUTER”子句中指定的左表的所有行, 而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行, 则在相关联的结果集中右表的所有选择列均为空值。
    hive> select userinfo., choice. from userinfo left outer join choice on(userinfo.id=choice.userid);
    c. 右连接
    右连接是左向外连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
    hive> select userinfo., choice. from userinfo right outer join choice on(userinfo.id=choice.userid);
    d. 全连接
    全连接返回左表和右表中的所有行。当某行在另一表中没有匹配行时,则另一个表的选择列表包含空值。如果表之间有匹配行,则整个结果集包含基表的数据值。
    hive> select userinfo., choice. from userinfo full outer join choice on(userinfo.id=choice.userid);
    e. 半连接
    半连接是 Hive 所特有的, Hive 不支持 IN 操作,但是拥有替代的方案; left semi join, 称为半连接, 需要注意的是连接的表不能在查询的列中,只能出现在 on 子句中。
    hive> select userinfo.* from userinfo left semi join choice on (userinfo.id=choice.userid);
  8. 子查询
    标准 SQL 的子查询支持嵌套的 select 子句,HiveQL 对子查询的支持很有限,只能在from 引导的子句中出现子查询。如下语句在 from 子句中嵌套了一个子查询(实现了对教课最多的老师的查询)。
    hive>select teacher,MAX(class_num) from (select teacher,count(classname) as class_num from classinfo group by teacher) subq group by teacher;
  9. 视图操作
    目前,只有 Hive0.6 之后的版本才支持视图。
    Hive 只支持逻辑视图, 并不支持物理视图, 建立视图可以在 MySQL 元数据库中看到创建的视图表, 但是在 Hive 的数据仓库目录下没有相应的视图表目录。
    当一个查询引用一个视图时, 可以评估视图的定义并为下一步查询提供记录集合。这是一种概念的描述, 实际上, 作为查询优化的一部分, Hive 可以将视图的定义与查询的定义结合起来,例如从查询到视图所使用的过滤器。
    在视图创建的同时确定视图的架构,如果随后再改变基本表(如添加一列)将不会在视图的架构中体现。如果基本表被删除或以不兼容的方式被修改,则该视图的查询将被无效。
    视图是只读的,不能用于 LOAD/INSERT/ALTER。
    视图可能包含 ORDER BY 和 LIMIT 子句,如果一个引用了视图的查询也包含这些子句,那么在执行这些子句时首先要查看视图语句,然后返回结果按照视图中的语句执行。
    以下是创建视图的例子:
    hive> create view teacher_classsum as select teacher, count(classname) from classinfo group by teacher;
    删除视图:
    hive>drop view teacher_classnum;
  10. 函数
    创建函数
    hive> create temporary function function_name as class_name
    该语句创建一个由类名实现的函数。在 Hive 中用户可以使用 Hive 类路径中的任何类,用户通过执行 add files 语句将函数类添加到类路径,并且可持续使用该函数进行操作。
    删除函数
    注销用户定义函数的格式如下:
    hive> drop temporary function function_na
    7 部署Hbase分布式列数据库
    7.1 部署HBase
    进入先电大数据平台主界面,点击左侧的动作按钮,添加HBase服务。

7.2 HBase用户指南
7.2.1 测试验证
#su – hbase
$ hbase shell

7.2.2 HBase Shell常用命令
HBase Shell常用的几个命令如下:
名称 命令表达式
创建表 create ‘表名称’, ‘列名称1’,‘列名称2’,‘列名称N’
添加记录 put ‘表名称’, ‘行名称’, ‘列名称:’, ‘值’
查看记录 get ‘表名称’, ‘行名称’
查看表中的记录总数 count ‘表名称’
删除记录 delete ‘表名’ ,‘行名称’ , ‘列名称’
删除一张表 先要屏蔽该表,才能对该表进行删除,第一步 disable ‘表名称’ 第二步 drop ‘表名称’
查看所有记录 scan “表名称”
查看某个表某个列中所有数据 scan “表名称” , [‘列名称:’]
更新记录 就是重写一遍进行覆盖

  1. 一般操作
  1. 查询服务器状态
    hbase(main):001:0> status
    2 servers, 0 dead, 1.5000 average load
  2. 查询hive版本
    hbase(main):002:0> version
    1.0.1.1, re1dbf4df30d214fca14908df71d038081577ea46, Sun May 17 12:34:26 PDT 2015
  1. DDL操作
  1. 创建一个表
    hbase(main):003:0>create ‘member’,‘member_id’,‘address’,‘info’
    0 row(s) in 1.2210seconds
  2. 获得表的描述
    hbase(main):005:0> list
    TABLE
    member
    1 row(s) in 0.0470 seconds
    => [“member”]
  3. 删除一个列族,alter,disable,enable
    我们之前建了3个列族,但是发现member_id这个列族是多余的,因为他就是主键,所以我们要将其删除。
    hbase(main):006:0> alter ‘member’,{NAME=>‘member_id’,METHOD=>‘delete’}
    hbase(main):014:0> describe ‘member’
    Table member is ENABLED
    member
    COLUMN FAMILIES DESCRIPTION
    {NAME => ‘address’, DATA_BLOCK_ENCODING => ‘NONE’, BLOOMFILTER => ‘ROW’, REPLICATION_SCOPE => ‘0’, VERSIONS => ‘1’, COMPRESSION => ‘NONE’, MIN_VERSIONS => ‘0’, TTL => ‘FOR
    EVER’, KEEP_DELETED_CELLS => ‘FALSE’, BLOCKSIZE => ‘65536’, IN_MEMORY => ‘false’, BLOCKCACHE => ‘true’}
    {NAME => ‘info’, DATA_BLOCK_ENCODING => ‘NONE’, BLOOMFILTER => ‘ROW’, REPLICATION_SCOPE => ‘0’, VERSIONS => ‘1’, COMPRESSION => ‘NONE’, MIN_VERSIONS => ‘0’, TTL => ‘FOREVE
    R’, KEEP_DELETED_CELLS => ‘FALSE’, BLOCKSIZE => ‘65536’, IN_MEMORY => ‘false’, BLOCKCACHE => ‘true’}
    2 row(s) in 0.0350 seconds
  4. drop一个表
    hbase(main):029:0>disable ‘temp_table’
    0 row(s) in 2.0590seconds
    hbase(main):030:0>drop ‘temp_table’
    0 row(s) in 1.1070seconds
  5. 判断表是否enable

hbase(main):016:0> is_enabled ‘member’
true
0 row(s) in 0.0190 seconds
6) 判断表是否disable
hbase(main):032:0>is_disabled ‘member’
false
0 row(s) in 0.0110seconds
3. DML操作

  1. 插入几条记录
    put’member’,‘scutshuxue’,‘info:age’,‘24’
    put’member’,‘scutshuxue’,‘info:birthday’,‘1987-06-17’
    put’member’,‘scutshuxue’,‘info:company’,‘alibaba’
    put’member’,‘scutshuxue’,‘address:contry’,‘china’
    put’member’,‘scutshuxue’,‘address:province’,‘zhejiang’
    put’member’,‘scutshuxue’,‘address:city’,‘hangzhou’
    put’member’,‘xiaofeng’,‘info:birthday’,‘1987-4-17’
    put’member’,‘xiaofeng’,‘info:favorite’,‘movie’
    put’member’,‘xiaofeng’,‘info:company’,‘alibaba’
    put’member’,‘xiaofeng’,‘address:contry’,‘china’
    put’member’,‘xiaofeng’,‘address:province’,‘guangdong’
    put’member’,‘xiaofeng’,‘address:city’,‘jieyang’
    put’member’,‘xiaofeng’,‘address:town’,‘xianqiao’
  2. 获取一条数据
    获取一个id的所有数据
    hbase(main):003:0> get ‘member’,‘scutshuxue’
    COLUMN CELL
    address:city timestamp=1441600601563, value=hangzhou
    address:contry timestamp=1441600601500, value=china
    address:province timestamp=1441600601534, value=zhejiang
    info:age timestamp=1441600579088, value=24
    info:birthday timestamp=1441600601412, value=1987-06-17
    info:company timestamp=1441600601451, value=alibaba
    6 row(s) in 0.4320 seconds
    获取一个id的所有数据获取一个id,一个列族中一个列的所有数据
    hbase(main):026:0> get ‘member’,‘scutshuxue’,‘info’
    COLUMN CELL
    info:age timestamp=1441600579088, value=24
    info:birthday timestamp=1441600601412, value=1987-06-17
    info:company timestamp=1441600601451, value=alibaba
    3 row(s) in 0.0200 seconds
  3. .更新一条记录
    hbase(main):027:0> put ‘member’,‘scutshuxue’,‘info:age’ ,‘99’
    0 row(s) in 0.1460 seconds
  4. 通过timestamp来获取两个版本的数据
    hbase(main):028:0> get ‘member’,‘scutshuxue’,{COLUMN=>‘info:age’,TIMESTAMP=>1321586238965}
    COLUMN CELL
    0 row(s) in 0.0160 seconds
  5. 全表扫描
    hbase(main):029:0> scan ‘member’
    ROW COLUMN+CELL
    scutshuxue column=address:city, timestamp=1441600601563, value=hangzhou
    scutshuxue column=address:contry, timestamp=1441600601500, value=china
    scutshuxue column=address:province, timestamp=1441600601534, value=zhejiang
    scutshuxue column=info:age, timestamp=1441601138357, value=99
    scutshuxue column=info:birthday, timestamp=1441600601412, value=1987-06-17
    scutshuxue column=info:company, timestamp=1441600601451, value=alibaba
    xiaofeng column=address:city, timestamp=1441600601782, value=jieyang
    xiaofeng column=address:contry, timestamp=1441600601725, value=china
    xiaofeng column=address:province, timestamp=1441600601757, value=guangdong
    xiaofeng column=address:town, timestamp=1441600601809, value=xianqiao
    xiaofeng column=info:birthday, timestamp=1441600601608, value=1987-4-17
    xiaofeng column=info:company, timestamp=1441600601694, value=alibaba
    xiaofeng column=info:favorite, timestamp=1441600601640, value=movie
    2 row(s) in 0.1060 seconds
  6. 删除id为temp的值的‘info:age’字段
    hbase(main):030:0> delete ‘member’,‘temp’,‘info:age’
    0 row(s) in 0.0450 seconds
  7. 删除整行
    hbase(main):031:0> deleteall ‘member’,‘xiaofeng’
    0 row(s) in 0.0120 seconds
  8. 查询表中有多少行
    hbase(main):032:0> count ‘member’
    1 row(s) in 0.0380 seconds
    => 1
  9. 给‘xiaofeng’这个id增加’info:age’字段,并使用counter实现递增获
    hbase(main):033:0> incr ‘member’,‘xiaofeng’,‘info:age’
    COUNTER VALUE = 1
    0 row(s) in 0.0230 seconds
    取当前count的值hbase(main):034:0> get_counter ‘member’,‘xiaofeng’,‘info:age’
    COUNTER VALUE = 1
  10. 将整张表清空
    hbase(main):035:0> truncate ‘member’
    Truncating ‘member’ table (it may take a while):
  • Disabling table…
  • Truncating table…
    0 row(s) in 1.6560 seconds
    8 部署Mahout数据挖据工具
    8.1 部署Mahout
    进入先电大数据平台主界面,点击左侧的动作按钮,添加Mahout服务。

9 部署Pig数据分析平台
9.1 部署Pig
进入先电大数据平台主界面,点击左侧的动作按钮,添加Pig服务。

9.2 Pig简介
9.2.1 Pig的运行模式
Pig 有两种运行模式: Local 模式和 MapReduce 模式。当 Pig 在 Local 模式运行的时候, Pig 将只访问本地一台主机;当 Pig 在 MapReduce 模式运行的时候, Pig 将访问一个 Hadoop 集群和 HDFS 的安装位置。这时, Pig 将自动地对这个集群进行分配和回收。因为 Pig 系统可以自动地对 MapReduce 程序进行优化,所以当用户使用 Pig Latin 语言进行编程的时候,不必关心程序运行的效率, Pig 系统将会自动地对程序进行优化。这样能够大量节省用户编程的时间。
测试示例如下:
本地模式:pig -x local
MapReduce模式:pig(或者pig -x mapreduce,pig为其简写形式)
9.2.2 运行Pig程序
Pig 的 Local 模式和 MapReduce 模式都有三种运行方式,分别为: Grunt Shell 方式、脚本文件方式和嵌入式程序方式。
Pig程序执行方式有三种:
1) 脚本方式
直接运行包含Pig脚本的文件,比如以下命令将运行本地scripts.pig文件(该文件提供)中的所有命令:
pig scripts.pig
2) Grunt方式
Grunt提供了交互式运行环境,可以在命令行编辑执行命令。
Grund同时支持命令的历史记录,通过上下方向键访问。
Grund支持命令的自动补全功能。比如当你输入a = foreach b g时,按下Tab键,则命令行自动变成a = foreach b generate。你甚至可以自定义命令自动补全功能的详细方式。具体请参阅相关文档。
3) 嵌入式方式
可以在java中运行Pig程序,类似于使用JDBC运行SQL程序。

9.2.3 Pig常用命令
我们看一下命令列表,下面是我们常用的pig latin语言

“cat” …
“fs” …
“sh” …
“cd” …
“cp” …
“copyFromLocal” …
“copyToLocal” …
“dump” …
“describe” …
“aliases” …
“explain” …
“help” …
“kill” …
“ls” …
“mv” …
“mkdir” …
“pwd” …
“quit” …
“register” …
“rm” …
“rmf” …
“set” …
“illustrate” …
“run” …
“exec” …
“scriptDone” …
“” …

“;” …
10 Flume
10.1 部署Flume

11 Spark并行计算框架
12 部署Spark2

12.1 Spark简介
Spark是发源于美国加州大学伯克利分校AMPLab的集群计算平台,它立足于内存计算,性能超过Hadoop百倍,从多迭代批量处理出发,兼收并蓄数 据仓库、流处理和图计算等多种计算范式。
Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,它具有Hadoop MapReduce所具有的优点,不仅实现了MapReduce的算子map函数和reduce函数以及计算模型,它还提供了更为丰富的算子,如filter、join、groupByKey等。但是,它不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Spark的特点:
 轻:Spark 0.6核心代码有2万行,Hadoop 1.0为9万行,2.0为22万行。
 快:Spark对小数据集能达到亚秒级的延迟,这对于Hadoop MapReduce(以下简称MapReduce)是无法想象的(由于“心跳”间隔机制,仅任务启动就有数秒的延迟)。
 灵:Spark提供了不同层面的灵活性。在实现层,它完美演绎了Scala trait动态混入(mixin)策略(如可更换的集群调度器、序列化库);在原语(Primitive)层,它允许扩展新的数据算子 (operator)、新的数据源(如HDFS之外支持DynamoDB)、新的language bindings(Java和Python);在范式(Paradigm)层,Spark支持内存计算、多迭代批量处理、即席查询、流处理和图计算等多种 范式。
 巧:巧在借势和借力。Spark借Hadoop之势,与Hadoop无缝结合
12.2 弹性分布式数据集
大多数现有的集群计算系统都是基于非循环的数据流模型。从稳定的物理存储(如分布式文件系统)中加载记录,记录被传入由一组确定性操作构成的DAG,然后写回稳定存储。DAG数据流图能够在运行时自动实现任务调度和故障恢复。
尽管非循环数据流是一种很强大的抽象方法,但仍然有些应用无法使用这种方式描述。我们就是针对这些不太适合非循环模型的应用,它们的特点是在多个并行操作之间重用工作数据集。这类应用包括:(1)机器学习和图应用中常用的迭代算法(每一步对数据执行相似的函数);(2)交互式数据挖掘工具(用户反复查询一个数据子集)。基于数据流的框架并不明确支持工作集,所以需要将数据输出到磁盘,然后在每次查询时重新加载,这带来较大的开销。
由此Spark采用了一种分布式的内存抽象,称作弹性分布式数据集(resilient distributed datasets, RDDs)的数据框架。
弹性分布式数据集(RDD)是种编程抽象,代表可以跨机器进行分割的只读分布式对象集合,每个RDD都被分为多个分区,这些分区运行在集群的不同节点上。RDD可以从一个继承结构(lineage)重建,因此可以容错,通过并行操作访问,可以读写HDFS或S3这样的分布式存储,更重要的是,可以缓存到worker节点的内存中进行立即重用。由于RDD可以被缓存在内存中,Spark对迭代应用特别有效,因为这些应用中,数据是在整个算法运算过程中都可以被重用。大多数机器学习和最优化算法都是迭代的,使得Spark对数据科学来说是个非常有效的工具。
创建RDD的方法有两种:一种是读取一个外部数据集;一种是在集群程序里分发驱动器程序中的对象集合。创建出的RDD支持两种类型的操作:转化操作和行动操作。转化操作会由一个RDD生成一个新的RDD。行动操作会对RDD计算出一个结果,并把结果返回到驱动器程序中,或把结果存储到外部存储系统(比如HDFS)中。比如first()操作就是一个行动操作,会返回RDD的第一个元素。
转化操作与行动操作的区别在于Spark计算RDD的方式不同。虽然你可以在任何时候定义一个新的RDD,但Spark只会惰性计算这些RDD。它们只有第一个在行动操作中用到时,才会真正的计算。之所以这样设计,是因为比如调用sc.textFile(…)时就把文件中的所有行都读取并存储起来,就会消耗很多存储空间,而我们马上又要筛选掉其中的很多数据。
还需要注意的一点是,spark会在你每次对它们进行行动操作时重新计算。如果想在多个行动操作中重用同一个RDD,那么可以使用RDD.persist()或RDD.collect()让Spark把这个RDD缓存下来。(可以是内存,也可以是磁盘)。
Spark会使用谱系图来记录这些不同RDD之间的依赖关系,Spark需要用这些信息来按需计算每个RDD,也可以依靠谱系图在持久化的RDD丢失部分数据时用来恢复所丢失的数据。如下图,过滤errorsRDD与warningsRDD,最终调用union()函数。

12.3 常用语法
parallelize演示
scala> val num=sc.parallelize(1 to 10) //分片为1
scala> val doublenum = num.map(*2)
scala> val threenum = doublenum.filter(
% 3 == 0)
scala> threenum.collect //Array(6, 12, 18)
scala> threenum.toDebugString
scala> val num1=sc.parallelize(1 to 10,6) //并行化时,进行分片,缺省的情况下,会根据executor进行分片,这边是将分片设置为6
scala> val doublenum1 = num1.map(*2)
scala> val threenum1 = doublenum1.filter(
% 3 == 0)
scala> threenum1.collect
scala> threenum1.toDebugString

scala> threenum.cache() //将一个RDD进行缓存(memory_only),这样在之后使用的过程中就不需要重新计算了,可以大大节省运行时间
scala> val fournum = threenum.map(x=>x*x)
scala> fournum.collect
scala> fournum.toDebugString
scala> threenum.unpersist() //删除cache
scala> num.reduce (_ + ) //对每个数字进行累加
scala> num.take(5) //选择前五位
scala> num.first //第一个
scala> num.count //计数
scala> num.take(5).foreach(println) //把前五个循环一下,并打印出来
//K-V演示
scala> val kv1=sc.parallelize(List((“A”,1),(“B”,2),(“C”,3),(“A”,4),(“B”,5)))
scala> kv1.sortByKey().collect
//排序,注意sortByKey的小括号不能省 Array((A,1), (A,4), (B,2), (B,5), (C,3))
scala> kv1.groupByKey().collect
//将key进行归组,不做combine Array((B,CompactBuffer(2, 5)), (A,CompactBuffer(1, 4)), (C,CompactBuffer(3)))
scala> kv1.reduceByKey(
+).collect //合并combine Array((B,7), (A,5), (C,3))
scala> val kv2=sc.parallelize(List((“A”,4),(“A”,4),(“C”,3),(“A”,4),(“B”,5)))
scala> kv2.distinct.collect //对RDD取唯一值,对于相同的就合并为同一个
scala> kv1.union(kv2).collect //对两个RDD进行合并,Array((A,1), (B,2), (C,3), (A,4), (B,5), (A,4), (A,4), (C,3), (A,4), (B,5))
scala> val kv3=sc.parallelize(List((“A”,10),(“B”,20),(“D”,30)))
scala> kv1.join(kv3).collect //对kv1和kv3进行join操作,Array((B,(2,20)), (B,(5,20)), (A,(1,10)), (A,(4,10)))
scala> kv1.cogroup(kv3).collect
//cogroup:对两个RDD中的KV元素,每个RDD中相同key中的元素分别聚合成一个集合。与reduceByKey不同的是针对两个RDD中相同的key的元素进行合并。
scala> val kv4=sc.parallelize(List(List(1,2),List(3,4)))
scala> kv4.flatMap(x=>x.map(
+1)).collect //把数据集进行压扁,压成一个数据集
//文件读取演示
scala> val rdd1 = sc.textFile(“hdfs://hadoop1:8000/dataguru/week2/directory/”)
scala> rdd1.toDebugString
scala> val words=rdd1.flatMap(.split(" ")) //把所有数据以空格为分隔符压扁,比如letter.txt 压缩成a b c d e a b c d a b c a b a
scala> val wordscount=words.map(x=>(x,1)).reduceByKey(
+_) //计数
scala> wordscount.collect
scala> wordscount.toDebugString

猜你喜欢

转载自blog.csdn.net/qq_28513801/article/details/83512194