1. 概要说明

本工程为大数据培训的指导教程,包含了培训实践各个环节的说明及相关代码。

1.1. 课程概要

名称 内容

第一天上午

元宝铺架构分享

大数据总揽

介绍当前大数据的基本情况

环境准备

为后续实践准备基础环境

第一天下午

Spark入门

介绍Spark框架的基本概念

Scala入门

介绍Scala语言的基础使用

Hadoop安装使用

动手实践Hadoop的安装、配置及基础使用

Spark安装使用

动手实践Spark的standalone安装、配置及基础使用

案例分析:ybMAP

介绍元宝铺数据处理遇到的问题及如何解决

第二天上午

Zookeeper安装使用

动手实践Zookeeper的安装、配置及基础使用

HBase安装使用

动手实践HBase的安装、配置及基础使用

Hive安装使用

动手实践Hive的安装、配置及基础使用

Kafka安装使用

动手实践Kafka的安装、配置及基础使用

Sqoop安装使用

动手实践Sqoop的安装、配置及基础使用

Zeppelin安装使用

动手实践Zeppelin的安装、配置及基础使用

生产环境说明

介绍用Ambari+HDP搭建生产环境,使用Hue、Kylin做分析

案例分析:垂直行业数据运营平台

以4S店行业为入口分析垂直行业数据运营平台的架构及流程

第二天下午

综合实例:访客分析

以访客分析为例子综合使用Kafka、Spark Streaming、Redis、Mongo等技术框架

综合实例:支付宝数据处理

以支付宝数据处理为例子综合使用HDFS、Spark SQL、Hive、Zeppelin/Hue等技术框架

1.2. 资源说明

实验需要的资源列表,因我朝网络管制,故预先下载备用。

网盘下载地址: http://pan.baidu.com/s/1dEJ7agT
生产环境下所有未经官方源下载的文件都要做签名校验
名称 说明

tools\DockerToolbox-1.11.0.exe

Windows的Docker安装程序

tools\DockerToolbox-1.11.0.pkg

Mac的Docker安装程序

tools\AsciidocFX_Windows_No_JRE.exe

此文档的撰写工具

images\scala_2.10_image.tar

Docker镜像,本实验的基础环境

images\mysql_image.tar

Docker MySQL镜像

images\mongo_image.tar

Docker Mongo镜像

images\bd-lab_image.tar

Docker镜像,本实验最终成果

frameworks\hadoop-2.7.2.tar.gz

Hadoop压缩包

frameworks\spark-1.6.1-bin-hadoop2.6.tgz

Spark Hadoop2.6预编译包

frameworks\apache-hive-1.2.1-bin.tar.gz

Hive预编译包

frameworks\hbase-1.2.1-bin.tar.gz

HBase预编译包

frameworks\kafka_2.10-0.8.2.2.tgz

Kafka预编译包

frameworks\zookeeper-3.4.8.tar.gz

Zookeeper预编译包

frameworks\sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz

Sqoop预编译包

frameworks\zeppelin-0.5.6-incubating-bin-all.tgz

Zeppelin预编译包

frameworks\mysql-connector-java-5.1.36.jar

Mysql JDBC驱动

data\r4ZBzEh4Fu8imdju5_0.35396679607219994.out

模拟支付宝数据

data\banks.csv

模拟银行数据

2. 环境准备

硬件要求:内存:>=4G,硬盘:>=20G,网络畅通
系统要求:Centos6.x,开启SSH,推荐使用Docker,也可使用实体机或虚拟机(Vmware、Virtualbox或Hyper-V)
基本环境:安装完成 JDK8、Scala2.10.x,MySQL、Mongo

2.1. 使用Docker创建环境(推荐/可选)

如您使用的是实体机或虚拟机请忽略此操作。

  • 下载Docker

Linux直接使用包管理工具安装(Centos6及以下版本安装比较麻烦), Windows或Mac使用Docker toolbox安装(已在资源列表中) 详细参见: https://docs.docker.com/

  • 添加镜像

从官方仓库安装:

# 下载scala基础镜像
docker pull gudaoxuri/scala_2.10
# 下载mysql镜像
docker pull mysql
# 下载Mongo镜像
docker pull mongo

如网络过慢可使用资源列表中已下载的镜像安装:

# 从本地添加scala基础镜像
docker load -i <your path>/images/scala_2.10_image.tar
# 从本地添加mysql镜像
docker load -i <your path>/images/mysql_image.tar
# 从本地添加mongo镜像
docker load -i <your path>/images/mongo_image.tar
  • 创建容器

# 创建mysql容器,开放3306端口,用户名root,密码123456
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql
# 创建mongo容器,开放27017端口,无需认证
docker run --name mongo -p 27017:27017 -d mongo
# 创建scala基础容器,开放大数据服务需要的几个重要端口
docker run --name bd-lab -h bd -d \
     -p 2181:2181 \
     -p 6066:6066 \
     -p 7077:7077 \
     -p 8088:8088 \
     -p 8041:8041 \
     -p 19888:19888 \
     -p 60010:60010 \
     -p 60030:60030 \
     -p 4040:4040 \
     -p 8080:8080 \
     -p 8081:8081 \
     -p 9000:9000 \
     -p 7203:7203 \
     -p 9092:9092 \
     -p 50010:50010 \
     -p 50070:50070 \
     -p 50075:50075 \
     -p 10000:10000 \
     -p 28081:28081 \
     -p 222:22 \
     -v /c/Users/i/docker_data/bd-lab:/opt/res \
     gudaoxuri/scala_2.10
容器说明

gudaoxuri/scala_2.10镜像开放了SSH服务,用户名root,密码123456,端口号222
-v表示添加数据映射,此处用于获取宿主机是已下载的框架包。对于Windows和Mac宿主机的路径有一定要求,详见 https://docs.docker.com/engine/userguide/containers/dockervolumes/#mount-a-host-directory-as-a-data-volume

后续环境使用docker容器,如无特殊说明所使用容器均基于gudaoxuri/scala_2.10镜像。
Docker使用简明教程
http://gudaoxuri.github.io/Docker_ABC/

2.2. 使用Virtual box创建环境(可选)

  • 下载CentOS6.x

    http://mirrors.163.com/centos/6.7/isos/x86_64/CentOS-6.7-x86_64-minimal.iso
  • 安装CentOS到Virtual box

注意事项
  • 网络使用网桥模式

  • 选择中文(避免乱码)

  • 主机名使用bd

  • IP及DNS安装完成后再配置

  • 安装完成,配置网络

vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=<ip>
NETMASK=<mask>
GATEWAY=<getway>
ifup eth0
vi /etc/resolv.conf
nameserver 180.76.76.76
nameserver 8.8.8.8
测试
ifconfig
ping www.baidu.com
  • 安装必须的工具

# 测试环境,可以关闭防火墙
chkconfig iptables off
service iptables stop

yum install -y wget

# 安装java
wget -P /opt/env/ --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie"  http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.tar.gz
tar -xzf /opt/env/jdk-8u60-linux-x64.tar.gz -C /opt/env/
rm -rf /opt/env/jdk-8u60-linux-x64.tar.gz
mv /opt/env/jdk1.8.0_60 /opt/env/java
echo "export JAVA_HOME=/opt/env/java" >> /etc/profile

# 安装Scala
wget -P /opt/env/ http://downloads.typesafe.com/scala/2.10.6/scala-2.10.6.tgz
tar -xzf /opt/env/scala-2.10.6.tgz -C /opt/env/
rm -rf /opt/env/scala-2.10.6.tgz
mv /opt/env/scala-2.10.6 /opt/env/scala
echo "export SCALA_HOME=/opt/env/scala" >> /etc/profile

echo 'export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin' >> /etc/profile
source /etc/profile

# 安装MySQL
yum install -y mysql-server mysql mysql-devel
service mysqld start
# mysqladmin -u root password 123456
mysql -u root -p
grant all on *.* to'root'@'%' identified by '123456';
flush privileges;

# 安装Mongo
vi /etc/yum.repos.d/mongodb-org-3.2.repo
  [mongodb-org-3.2]
  name=MongoDB Repository
  baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
  gpgcheck=1
  enabled=1
  gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

yum install -y mongodb-org

vi /etc/mongod.conf
  bind_ip = 0.0.0.0

service mongod start
  • 文件夹共享

vi /etc/selinux/config
   SELLINUX=disabled

yum install -y samba
vi /etc/samba/smb.conf
    # 开启匿名访问
    security = share
    # 修改访问目录
    [public]
    comment = Public Stuff
    path = /share
    availabe = yes
    browseable = yes
    public = yes
    writable = yes
    printable = no
    write list = +staff

mkdir /share
chmod 777 /share
/etc/init.d/smb start

2.3. 基本环境创建

SSH到实验环境

# 创建用户user,密码123456
adduser user
passwd user
mkdir -p /opt/workspaces/
chown user: /opt/workspaces/

# 进入user账号
su - user

# 切换到工作空间
cd /opt/workspaces
# 创建各框架lib目录
mkdir frameworks
# 创建各框架数据目录
mkdir data
# 创建各框架日志目录
mkdir logs
# 创建应用包目录
mkdir apps

# 创建SSH免密钥登录
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
如无特殊说明后续操作都使用user账号

3. 大数据总揽

大数据总揽.pptx

4. Spark入门

Spark入门.pptx

5. Scala入门

— learnxinyminutes.com

6. Hadoop

此主题介绍Hadoop的安装、配置及基础使用。

Hadoop基本信息
官网:http://hadoop.apache.org/
官方教程:http://hadoop.apache.org/docs/current/
不错的文章:http://www.cnblogs.com/edisonchou/p/4470682.html

6.1. 环境准备

# 切换到工作空间
cd /opt/workspaces
mkdir data/hadoop
# 创建Hadoop NameNode目录
mkdir -p data/hadoop/hdfs/nn
# 创建Hadoop DataNode目录
mkdir -p data/hadoop/hdfs/dn
# 创建Hadoop临时目录
mkdir data/hadoop/tmp
# 创建Hadoop日志目录
mkdir logs/hadoop

6.2. 安装

wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz
tar -zxf hadoop-2.7.2.tar.gz
rm -rf hadoop-2.7.2.tar.gz
mv hadoop-2.7.2 ./frameworks/hadoop

6.3. 配置(伪分布式)

vi ./frameworks/hadoop/etc/hadoop/hadoop-env.sh
# 添加JDK目录
export JAVA_HOME=/opt/env/java
# 指定Hadoop日志写入到先前定义的目录
export HADOOP_LOG_DIR=/opt/workspaces/logs/hadoop
vi ./frameworks/hadoop/etc/hadoop/core-site.xml
<!--指定HDFS的地址,bd为对应的hostname,请自行修改-->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://bd:9000</value>
</property>
<!--指定Hadoop的临时目录到先前定义的目录-->
<property>
    <name>hadoop.tmp.dir</name>
    <value>file:/opt/workspaces/data/hadoop/tmp</value>
</property>
hadoop.tmp.dir 是hadoop文件系统依赖的基础配置,如hdfs-site.xml中不指定namenode和datanode的存放位置默认就放在这个路径中。hadoop.tmp.dir 默认存放在/tmp下,启动的时会被清空。
vi ./frameworks/hadoop/etc/hadoop/hdfs-site.xml
<!--副本数,默认是3,由于只有一个节点,所以不需要备份-->
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>
<!--指定NameNode目录到先前定义的目录-->
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/opt/workspaces/data/hadoop/hdfs/nn</value>
</property>
<!--指定DataNode目录到先前定义的目录-->
<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/opt/workspaces/data/hadoop/hdfs/dn</value>
</property>
<!--实验环境,禁用权限认证-->
<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>
生产环境不允许dfs.permissions.enabled=false这可能导致HDFS数据被非法修改!

6.4. 初始化

格式化NameNode
./frameworks/hadoop/bin/hdfs namenode -format

6.5. 启动与停止

# 启动NameNode
./frameworks/hadoop/sbin/hadoop-daemon.sh start namenode
# 启动DataNode
./frameworks/hadoop/sbin/hadoop-daemon.sh start datanode
# 停止NameNode
./frameworks/hadoop/sbin/hadoop-daemon.sh stop namenode
# 停止DataNode
./frameworks/hadoop/sbin/hadoop-daemon.sh stop datanode
不同的启动(停止)命令

start-all.sh 启动所有服务,不推荐使用 start-dfs.sh 启动HDFS start-mapred.sh 启动MapR

6.6. 测试

# 查看HDFS文件
./frameworks/hadoop/bin/hadoop fs -ls /

6.7. HDFS常用操作

# 上传文件到HDFS
hadoop fs -put localfile /user/hadoop/hadoopfile hdfs://<host>:<port>/<path>
hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
hadoop fs -put localfile hdfs://nn.example.com/hadoop/hadoopfile

# 创建HDFS目录
hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2
hadoop fs -mkdir hdfs://nn1.example.com/user/hadoop/dir hdfs://nn2.example.com/user/hadoop/dir

# 查看HDFS目录
hadoop fs -ls /user/hadoop/file1

# 查看HDFS文件内容
hadoop fs -cat hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2
hadoop fs -cat file:///file3 /user/hadoop/file4

# 修改HDFS文件所有者
hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]

# 修改HDFS文件权限
hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...]

# 获取HDFS到本地
hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>

6.8. 常见问题

Name node is in safe mode

Hadoop启动的时候首先进入安全模式,安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,根据策略必要的复制或者删除部分数据块,如果datanode丢失的block达到一定的比例会一直处于安全模式状态即只读状态。可以通过命令hadoop dfsadmin -safemode leave命令强制离开。

7. Spark

此主题介绍Spark的安装、配置及基础使用。

Spark基本信息
官网:http://spark.apache.org/
官方教程:http://spark.apache.org/docs/latest/programming-guide.html

7.1. 环境准备

# 切换到工作空间
cd /opt/workspaces
# 创建Spark数据目录
mkdir data/spark
# 创建Spark日志目录
mkdir logs/spark

7.2. 安装

wget http://mirrors.hust.edu.cn/apache/spark/spark-1.6.1/spark-1.6.1-bin-hadoop2.6.tgz
tar -zxf spark-1.6.1-bin-hadoop2.6.tgz
rm -rf spark-1.6.1-bin-hadoop2.6.tgz
mv spark-1.6.1-bin-hadoop2.6 ./frameworks/spark

7.3. 配置(伪分布式)

vi ./frameworks/spark/conf/spark-env.sh
export SPARK_MASTER_IP=bd
export SPARK_MASTER_PORT=7077
export MASTER=spark://${SPARK_MASTER_IP}:${SPARK_MASTER_PORT}
# 指定Spark数据目录
export SPARK_LOCAL_DIRS=/opt/workspaces/data/spark/
# 指定Spark日志目录
export SPARK_LOG_DIR=/opt/workspaces/logs/spark/
# 指定JDK目录
export JAVA_HOME=/opt/env/java
# 指定Scala目录
export SCALA_HOME=/opt/env/scala

7.4. 启动与停止

./frameworks/spark/sbin/start-all.sh

7.5. 测试

# 执行圆周率计算示例
./frameworks/spark/bin/run-example  org.apache.spark.examples.SparkPi

./frameworks/spark/bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master spark://bd:6066\
  --deploy-mode cluster \
  --driver-memory 512M \
  --executor-memory 256M \  #如果运行出错请改大些
  ./frameworks/spark/lib/spark-examples-1.6.1-hadoop2.6.0.jar \
  1000

7.6. Word Count

Word Count
./frameworks/spark/bin/spark-shell

// 基础版
val textFile = sc.textFile("./frameworks/spark/README.md")
val words = textFile.flatMap(line => line.split(" "))
val exchangeVal = words.map(word => (word,1))
val count = exchangeVal.reduceByKey((a,b) => a + b)
count.collect

// 优化版
sc.textFile("./frameworks/spark/README.md").flatMap(_.split(" ")).map((_,1)).reduceByKey(_ + _).collect

// 带排序
sc.textFile("./frameworks/spark/README.md").flatMap(_.split(" ")).map((_,1)).reduceByKey(_ + _).map(_.swap).sortByKey(false).map(_.swap).collect

// 最终版
val wordR="""\w+""".r
sc.textFile("./frameworks/spark/README.md").flatMap(_.split(" ")).filter(wordR.pattern.matcher(_).matches).map((_,1)).reduceByKey(_ + _).map(_.swap).sortByKey(false).map(_.swap).saveAsTextFile("hdfs://bd:9000/wordcount")
可以访问 http://<host>:8080 查看作业

7.7. 参数说明

  • 在哪配置:

Spark properties (Spark属性)在应用程序中通过SparkConf 对象设置,或通过Java系统属性设置。
Environment variables (环境变量)指定各节点的设置,如IP地址、端口,配置文件在conf/spark-env.sh中。
Logging (日志)可以通过log4j.properties配置日志。

  • Spark properties

在代码中指定配置
val conf = new SparkConf()
             // 指定使用2个本地线程来运行,本地模式下,我们可以使用n个线程(n >= 1),但在像Spark Streaming这样的场景下,我们可能需要多个线程
             .setMaster("local[2]")
             .setAppName("CountingSheep")
val sc = new SparkContext(conf)
在脚本中指定配置
./bin/spark-submit --name "My app" --master local[4] --conf spark.eventLog.enabled=false
  --conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" myApp.jar
Table 1. 常用配置
属性名称 默认值 说明

spark.app.name

Spark应用的名字

spark.driver.cores

1

在cluster模式下运行driver进程的核数

spark.driver.memory

1g

driver进程可以用的内存总量(如:1g,2g),client模式下无效果,必须要在命令行里用 –driver-memory 或者在默认属性配置文件里设置

spark.executor.memory

1g

单个executor使用的内存总量(如,2g,8g)

spark.master

集群管理器URL

  • Environment variables

环境变量在${SPARK_HOME}/conf/spark-env.sh脚本中设置

Table 2. 常用配置
模式 属性名称 默认值 说明

JAVA_HOME

Java安装目录

SCALA_HOME

Scala安装目录

SPARK_LOCAL_IP

本地绑定的IP

SPARK_LOG_DIR

${SPARK_HOME}/logs

日志目录

standalone

SPARK_MASTER_IP

(当前IP)

Master IP

standalone

SPARK_MASTER_PORT

7077(6066)

Master 端口

standalone

MASTER

默认Master URL

standalone

SPARK_WORKER_CORES

所有

每个节点使用的CPU core上限

standalone

SPARK_WORKER_MEMORY

本节点所有内存减去1GB

每个节点使用的内存上限

standalone

SPARK_WORKER_INSTANCES

1

每个节点启动的worker实例个数

standalone

SPARK_WORKER_PORT

随机

Worker绑定的端口

如果你的slave节点性能非常强劲,可以把SPARK_WORKER_INSTANCES设为大于1;相应的,需要设置SPARK_WORKER_CORES参数限制每个worker实例使用的CPU个数,否则每个worker实例都会使用所有的CPU。
  • Logging

日志在${SPARK_HOME}/conf/log4j.properties中设置

  • Hadoop集群配置

使用HDFS时需要从Hadoop中复制hdfs-site.xml、 core-site.xml到Spark的classpath中

7.8. 资源调度

standalone目前只支持简单的先进先出(FIFO)调度器。这个调度器可以支持多用户,你可以控制每个应用所使用的最大资源。默认情况下,Spark应用会申请集群中所有的CPU。

在代码中限制资源
val conf = new SparkConf()
             .setMaster(...)
             .setAppName(...)
             .set("spark.cores.max", "10")
val sc = new SparkContext(conf)
在配置文件spark-env.sh中限制资源
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"

7.10. 硬件配置

每个节点:
* 4-8块磁盘
* 8G以上内存
* 千兆网卡
* 8-16核CPU

至少3个节点

7.11. 整合Hive

  • spark-env.sh中添加配置项

    # Hive目录
    export HIVE_HOME=$HIVE_HOME
SPARK_CLASSPATH

有些教程中说要添加
export SPARK_CLASSPATH=$HIVE_HOME/lib/mysql-connector-java-x.jar:$SPARK_CLASSPATH
但目前版本不需要此配置,并且添加上去会导致zeppelin运行出错:
org.apache.spark.SparkException: Found both spark.driver.extraClassPath and SPARK_CLASSPATH. Use only the former.

  • 复制Hive的几个配置文件

    cp ./frameworks/hive/conf/hive-site.xml ./frameworks/spark/conf
    cp ./frameworks/hive/conf/hive-log4j.properties ./frameworks/spark/conf
  • 启动thriftserver,用于对外提供JDBC服务

    ./frameworks/spark/sbin/start-thriftserver.sh
  • 测试连接

    ./frameworks/spark/bin/beeline
    !connect jdbc:hive2://bd:10000
    show tables;
.Spark 架构设计
http://spark-internals.books.yourtion.com/index.html +
此文写得挺详细,由于撰写时间较早,与新版本有出入(比如Shuffle Manager现在默认是Sort-based),但不影响对Spark的整体理解。

8. Zookeeper

此主题介Zookeeper的安装、配置及基础使用。

Spark基本信息
官网:https://zookeeper.apache.org/
官方教程:https://zookeeper.apache.org/doc/r3.4.8/

8.1. 环境准备

# 切换到工作空间
cd /opt/workspaces
# 创建Zookeeper数据目录
mkdir data/zookeeper
# 创建Zookeeper日志目录
mkdir logs/zookeeper

8.2. 安装

wget http://mirrors.hust.edu.cn/apache/zookeeper/current/zookeeper-3.4.8.tar.gz
tar -zxf zookeeper-3.4.8.tar.gz
rm -rf zookeeper-3.4.8.tar.gz
mv zookeeper-3.4.8 ./frameworks/zookeeper

8.3. 配置

cat>./frameworks/zookeeper/conf/zoo.cfg<<EOF
# 服务器之间或客户端与服务器之间维持心跳的时间间隔
tickTime=2000
# 数据目录
dataDir=/opt/workspaces/data/zookeeper
# 日志目录
dataLogDir=/opt/workspaces/logs/zookeeper
# 客户端连接端口
clientPort=2181
EOF

8.4. 启动与停止

./frameworks/zookeeper/bin/zkServer.sh start

8.5. 测试

./frameworks/zookeeper/bin/zkCli.sh -server localhost:2181
   ls /
   [zookeeper]

8.6. Zookeepr常用命令

# 创建文件并初始内容
create /zk "test"

# 获取文件内容
get /zk

# 修改文件内容
set /zk "new"

# 显示目录
ls /

# 删除文件
delete /zk

# 退出客户端
quit
Zookeeper znode节点属性
  • cZxid:创建节点的事务的zxid

  • mZxid:对znode最近修改的zxid

  • ctime:以距离时间原点(epoch)的毫秒数表示的znode创建时间

  • mtime:以距离时间原点(epoch)的毫秒数表示的znode最近修改时间

  • pZxid : 子节点最后一次变更的zxid

  • version:znode数据的修改次数

  • cversion:znode子节点修改次数

  • aversion:znode的ACL修改次数

  • ephemeralOwner:如果znode是临时节点,则指示节点所有者的会话ID;如果不是临时节点,则为零。

  • dataLength:znode数据长度。

  • numChildren:znode子节点个数

9. HBase

此主题介绍HBase的安装、配置及基础使用。

HBase基本信息
官网:http://hbase.apache.org/
官方文档:http://hbase.apache.org/book.html

9.1. 环境准备

# 切换到工作空间
cd /opt/workspaces
# 创建HBase日志目录
mkdir logs/hbase

9.2. 安装

wget http://mirrors.cnnic.cn/apache/hbase/1.2.1/hbase-1.2.1-bin.tar.gz
tar -zxf hbase-1.2.1-bin.tar.gz
rm -rf hbase-1.2.1-bin.tar.gz
mv hbase-1.2.1 ./frameworks/hbase

9.3. 配置(完全分布式)

vi ./frameworks/hbase/conf/hbase-env.sh
export JAVA_HOME=/opt/env/java
export HBASE_LOG_DIR=/opt/workspaces/logs/hbase
export HBASE_MANAGES_ZK=false
vi ./frameworks/hbase/conf/hbase-site.xml
<property>
  <name>hbase.rootdir</name>
  <value>hdfs://bd:9000/hbase</value>
</property>
<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>
<property>
  <name>hbase.zookeeper.property.clientPort</name>
  <value>2181</value>
</property>
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>bd</value>
</property>
<property>
  <name>hbase.zookeeper.property.dataDir</name>
  <value>/opt/workspaces/data/zookeeper</value>
</property>
<property>
  <name>dfs.support.append</name>
  <value>true</value>
</property>

9.4. 启动

./frameworks/hbase/bin/start-hbase.sh

9.5. 测试

./frameworks/hbase/bin/hbase shell
create 'test', 'cf'
list 'test'
put 'test', 'row1', 'cf:a', 'value1'
put 'test', 'row2', 'cf:b', 'value2'
put 'test', 'row3', 'cf:c', 'value3'
scan 'test'
get 'test', 'row1'
disable 'test'
enable 'test'
drop 'test'

10. Hive

此主题介绍Hive的安装、配置及基础使用。

Hive基本信息
官网:http://hive.apache.org/

10.1. 环境准备

# 切换到工作空间
cd /opt/workspaces
# 创建Hive数据目录
mkdir data/hive
# 创建Hive日志目录
mkdir logs/hive

10.2. 安装

wget http://mirrors.cnnic.cn/apache/hive/hive-1.2.1/apache-hive-1.2.1-bin.tar.gz
tar -zxf apache-hive-1.2.1-bin.tar.gz
rm -rf apache-hive-1.2.1-bin.tar.gz
mv apache-hive-1.2.1-bin ./frameworks/hive

10.3. 配置(单机)

vi ~/.profile
export HIVE_HOME=/opt/workspaces/frameworks/hive
export PATH=$PATH:$HIVE_HOME/bin
source ~/.profile
配置Mysql
mysql -u root -p
create database hive;
grant all on *.* to'hive'@'%' identified by 'hive';  #账号hive,密码hive,所有IP都可以访问(%)
flush privileges;
exit;
创建HDFS目录
./frameworks/hadoop/bin/hadoop fs -mkdir /tmp
./frameworks/hadoop/bin/hadoop fs -mkdir -p /user/hive/warehouse
./frameworks/hadoop/bin/hadoop fs -chmod 777 /tmp
./frameworks/hadoop/bin/hadoop fs -chmod 777 /user/hive/warehouse
修改Hive配置
cat>./frameworks/hive/conf/hive-env.sh<<EOF
export HADOOP_HEAPSIZE=1024
HADOOP_HOME=/opt/workspaces/frameworks/hadoop
export HIVE_CONF_DIR=/opt/workspaces/frameworks/hive/conf
export HIVE_AUX_JARS_PATH=/opt/workspaces/frameworks/hive/lib
EOF
cat>./frameworks/hive/conf/hive-site.xml<<EOF
<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://`<Docker Host IP>`:3306/hive</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.uris</name>
        <value>thrift://bd:9083</value>
    </property>
    <property>
        <name>hive.exec.local.scratchdir</name>
        <value>/opt/workspaces/data/hive</value>
    </property>
    <property>
        <name>hive.downloaded.resources.dir</name>
        <value>/opt/workspaces/data/hive</value>
    </property>
    <property>
        <name>hive.querylog.location</name>
        <value>/opt/workspaces/data/hive</value>
    </property>
    <property>
        <name>hive.server2.logging.operation.log.location</name>
        <value>/opt/workspaces/data/hive</value>
    </property>
    <property>
     <name>hive.querylog.location</name>
     <value>/opt/workspaces/frameworks/logs/hive</value>
    </property>
    <property>
      <name>hive.metastore.schema.verification</name>
      <value>false</value>
    </property>
</configuration>
EOF
cp ./frameworks/hive/conf/hive-log4j.properties.template ./frameworks/hive/conf/hive-log4j.properties
vi ./frameworks/hive/conf/hive-log4j.properties
hive.log.dir=/opt/workspaces/frameworks/logs/hive
下载mysql驱动
wget -P ./frameworks/hive/lib http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.36/mysql-connector-java-5.1.36.jar
测试发现5.1.38需要使用SSL连接,可设置jdbc://…​&userSSL=false禁用

10.4. 启动

nohup ./frameworks/hive/bin/hive --service metastore >/dev/null 2>&1 &

10.5. 测试

cat>test_person.txt<<EOF
tom 20
jack    24
nestor  29
EOF
./frameworks/hadoop/bin/hdfs dfs -mkdir /tmp/hivetest/
./frameworks/hadoop/bin/hdfs dfs -put ./test_person.txt /tmp/hivetest/
./frameworks/hive/bin/hive
CREATE EXTERNAL TABLE test_person(name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/tmp/hivetest';
select * from test_person;

11. Kafka

此主题介绍Kafka的安装、配置及基础使用。

Kafka基本信息
官网:http://kafka.apache.org/

11.1. 环境准备

# 切换到工作空间
cd /opt/workspaces
# 创建Kafka数据目录
mkdir data/kafka
# 创建Kafka日志目录
mkdir logs/kafka

11.2. 安装

wget http://mirrors.cnnic.cn/apache/kafka/0.8.2.2/kafka_2.10-0.8.2.2.tgz
tar -zxf kafka_2.10-0.8.2.2.tgz
rm -rf kafka_2.10-0.8.2.2.tgz
mv kafka_2.10-0.8.2.2 ./frameworks/kafka

11.3. 配置(伪分布式)

vi ./frameworks/kafka/config/server.properties
# 设置如下参数:
broker.id=0
port=9092
# 对外主机名
advertised.host.name=<Docker对外IP>
# 数据目录
log.dirs=/opt/workspaces/data/kafka
# 连接ZK
zookeeper.connect=localhost:2181
当您有多块网卡或使用特殊的网络设置导致Kafka启动时使用的IP与对外暴露的IP不同时需要指定advertised.host.name为您期望使用的外网IP
log.dirs的解释为A comma seperated list of directories under which to store log files,这里所谓的日志文件指的是Kafka的消息持久化文件,并不是一般意义的运行日志
vi ./frameworks/kafka/config/log4j.properties
# 设置日志目录
kafka.logs.dir=/opt/workspaces/logs/kafka

11.4. 启动与停止

nohup ./frameworks/kafka/bin/kafka-server-start.sh ./frameworks/kafka/config/server.properties >/dev/null 2>&1 &

11.5. 测试

./frameworks/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
./frameworks/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
> This is a message
> This is another message
# 在另个窗口输入
./frameworks/kafka/bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
> This is a message
> This is another message

12. Sqoop

此主题介绍Sqoop的安装、配置及基础使用。

Sqoop基本信息
官网:http://sqoop.apache.org/
官方文档:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html
Sqoop有两大版本,Sqoop稳定,Sqoop2目前问题比较多,以下使用Sqoop

12.1. 安装

wget http://mirror.bit.edu.cn/apache/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
tar -zxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
rm -rf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha ./frameworks/sqoop

12.2. 配置

vi ~/.profile
export SQOOP_HOME=/opt/workspaces/frameworks/sqoop
source ~/.profile
vi ./frameworks/sqoop/conf/sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/workspaces/frameworks/hadoop
export HADOOP_MAPRED_HOME=/opt/workspaces/frameworks/hadoop
export HIVE_HOME=/opt/workspaces/frameworks/hive
下载mysql驱动
wget -P ./frameworks/sqoop/lib http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.36/mysql-connector-java-5.1.36.jar

12.3. 测试

./frameworks/sqoop/bin/sqoop version

12.4. 使用

从MySQL数据库导入数据
./frameworks/sqoop/bin/sqoop import --connect jdbc:mysql://<host>:<port>/hive \
 --username hive --password hive \
 --table ROLES \
 --where 1=1 \
 --hive-import --hive-table hive_role

# 如何要启用增量导入需要加上如下参数
--incremental lastmodified --check-column <source field> --last-value ''
增量的字段必须是timestampdate/datetime

13. Zeppelin

此主题介绍Zeppelin的安装、配置及基础使用。

Zeppelin基本信息
官网:https://zeppelin.incubator.apache.org/

13.1. 安装

wget http://mirrors.cnnic.cn/apache/incubator/zeppelin/0.5.6-incubating/zeppelin-0.5.6-incubating-bin-all.tgz
tar -zxf zeppelin-0.5.6-incubating-bin-all.tgz
rm -rf zeppelin-0.5.6-incubating-bin-all.tgz
mv zeppelin-0.5.6-incubating-bin-all ./frameworks/zeppelin

13.2. 配置

vi ./frameworks/zeppelin/conf/zeppelin-env.sh
export ZEPPELIN_PORT=28081

export SPARK_HOME=/opt/workspaces/frameworks/spark
export HADOOP_CONF_DIR=/opt/workspaces/frameworks/hadoop
export SPARK_SUBMIT_OPTIONS="--packages com.databricks:spark-csv_2.10:1.2.0"

13.3. 启动

./frameworks/zeppelin/bin/zeppelin.sh start

13.4. 测试

14. others

14.1. Redis

Redis基本信息
官网:http://redis.io/
数据类型:http://blog.csdn.net/gaogaoshan/article/details/41039581

14.1.1. 安装

docker pull redis
docker run --name some-redis -d redis

15. 综合实例:访客分析

15.1. 业务流程

visit analysis flow.png
  1. 客户端代理程序获取访客行为并将行为保存到MQ中

  2. 分析程序从MQ中获取数据进行分析并将结果保存到数据库

  3. 展示程序实时显示行为分析结果

15.2. 涉及技术/框架

Meteor、NodeJS 、Kafka、Spark Streaming、Redis、Mongo、ECharts

15.3. 环境

  1. JDK >=1.8

  2. Scala >=2.10.x

  3. NodeJS >=4.x

  4. Spark >=1.6.x

  5. Kafka 0.8.2.2

  6. Redis >=3.x

  7. Mongo >=3.x

15.4. 如何运行

15.4.1. 参数列表

Visit Analysis 1.0
Usage: Visit_Analysis [options]

  -s <value> | --spark_master <value>
        spark master address , e.g. local[2]
  -t <value> | --batch_duration <value>
        spark streaming batch duration (s) , default 10
  --checkpoint_address <value>
         checkpoint address , e.g. hdfs://127.0.0.1:9000/tmp/checkpoint defalut /tmp/checkpoint
  -z <value> | --zk_hosts <value>
        zookeeper hosts , e.g. 127.0.0.1:2181
  --kafka_group <value>
        kafka group name ,default default
  --kafka_topic <value>
        kafka topic name , e.g. topic1
  --mongo_address <value>
        mongo address , e.g. localhost:27017
  --mongo_db <value>
        mongo db , myDb
  --redis_address <value>
        redis address , e.g. 127.0.0.1:6379
  --redis_db <value>
        redis db , default 0
  --ip_path <value>
        ip path , e.g. /opt/ip.bat

示例:

-s local[2]
-z 192.168.99.100:2181
--kafka_topic test
--mongo_address 192.168.99.100:27017
--mongo_db visit
--redis_address 192.168.99.100:6379
--ip_path C:\\data\\Enjoy_Projects\\bd-lab\\topic10-example-visit_analysis\\src\\main\\resources\\ip.dat

15.4.2. 本地调试

运行 run.mind.lab.visitanalysis.Startup 加上参数

调试时打开pom.xml中的<spark.scope>compile</spark.scope>

15.4.3. 部署

  1. 注释pom.xml中的<spark.scope>compile</spark.scope>

  2. mvn assembly:assembly

  3. 上传target/visit-analysis-0.0.1-jar-with-dependencies.jar/src/main/resources/ip.dat到服务器

  4. 执行spark-submit --class run.mind.lab.visitanalysis.Startup <some path>/visit-analysis-0.0.1-jar-with-dependencies.jar <args>

ip.dat文件必须是所有Spark工作节点都可以访问的,可以放在NAS中

示例

./frameworks/spark/bin/spark-submit \
   --class run.mind.lab.visitanalysis.Startup \
   --master local[2] \
   --executor-memory 512M \
   /opt/workspaces/apps/visit_analysis/visit-analysis-0.0.1-jar-with-dependencies.jar \
    -s local[2] \
    -z bd:2181 \
    --kafka_topic test \
    --mongo_address 192.168.99.100:27017 \
    --mongo_db visit \
    --redis_address 192.168.99.100:6379 \
    --ip_path /opt/workspaces/apps/visit_analysis/ip.dat

./frameworks/kafka/bin/kafka-console-producer.sh --topic test --broker-list bd:9092
http://www.baidu.com|122.255.21.25|wfjosms=sfwtksdksetsd

15.5. 接口

15.5.1. 输入

kafka消息,消息格式为: <url>|<ipv4>|<cookies>, e.g. http://www.baidu.com|122.255.21.25|wfjosms=sfwtksdksetsd

15.5.2. 输出

Mongo 数据库,库名visit,有两张表:

Table 3. statistics 统计表
字段名 类型 说明

category

string

统计类型,目前三个,host表示此记录是统计访问host的,province表示此记录按省份统计,``为空表示统计的是不区分类型的访问数

clue

string

追踪值,是统计类型下的细分值

date

long

日期,格式yyyyMMdd

count

long

不同统计维度下的访问数

例如,收到一条http://www.baidu.com|122.255.21.25|wfjosms=sfwtksdksetsd,则会生成如下记录:

{ "_id" : xx , "category" : "" , "clue" : "" , "date" : 0 , "count" : 1} // 总访问数1个
{ "_id" : xx , "category" : "host" , "clue" : "www.baidu.com" , "date" : 0 , "count" : 1} // 百度host的总访问数1个
{ "_id" : xx  , "category" : "host" , "clue" : "www.baidu.com" , "date" : 20160416 , "count" : 1} // 20160416这天百度host的总访问数1个
{ "_id" : xx, "category" : "province" , "clue" : "斯里兰卡" , "date" : 0 , "count" : 1} // ip为斯里兰卡(国外到不了省)的总访问数1个
{ "_id" : xx, "category" : "province" , "clue" : "斯里兰卡" , "date" : 20160416 , "count" : 1} // 20160416这天ip为斯里兰卡(国外到不了省)的总访问数1个
date会按日期自动增加
Table 4. logs 日志表
字段名 类型 说明

url

string

请求的url

ip

string

请求的ip

cookies

string

请求的cookies

time

timestamp

请求时间

16. 综合实例:支付宝数据处理

16.1. 业务流程

alipay process flow.png
  1. 数据抓取组件抓取支持宝数据存放在本地并调用大数据处理脚本

  2. 大数据处理脚本将抓取到的数据转存到HDFS并执行Spark处理程序

  3. Spark处理程序将数据处理后存到Hive表中

  4. 使用Zeppelin/Hue完成基于Spark SQL的业务化数据分析

16.2. 涉及技术/框架

Meteor、NodeJS 、HDFS、Spark SQL、Hive、Zeppelin/Hue

16.3. 环境

  1. JDK >=1.8

  2. Scala >=2.10.x

  3. NodeJS >=4.x

  4. Spark >=1.6.x

  5. Hive >=1.2.x

  6. Zeppelin >=0.5.6

16.4. 大数据处理脚本

这是一个很简单的脚本,大致逻辑是使用hadoop fs -put将文件上传到HDFS,再调用spark-submit提交执行作业。

16.5. 如何运行

16.5.1. 参数列表

Alipay Process 1.0
Usage: Alipay Process [options]

  -s <value> | --spark_master <value>
        spark master address , e.g. local[2]
  -a <value> | --aplipay_address <value>
        aplipay address , default hdfs://bd:9000/user/alipay
  -h <value> | --hive_db <value>
         hive db , default alipay

16.5.2. 部署

  1. 注释pom.xml中的<spark.scope>compile</spark.scope>

  2. mvn assembly:assembly

  3. 上传`target/alipay-process-0.0.1-jar-with-dependencies.jar到服务器

  4. 执行spark-submit --class run.mind.lab.alipayprocess.Startup <some path>/alipay-process-0.0.1-jar-with-dependencies.jar <args>

示例

./frameworks/spark/bin/spark-submit \
   --class run.mind.lab.alipayprocess.Startup \
   --master spark://bd:7077 \
   --executor-memory 512M \
   /opt/workspaces/apps/alipay_process/alipay-process-0.0.1-jar-with-dependencies.jar \
    -s spark://bd:7077 \
    -a hdfs://bd:9000/user/alipay

16.6. 接口

16.6.1. 输入

Alipay账务数据,保存到HDFS

格式示例:

withdraw	提现	1506300077173571	20150630000000000000020002959288	chenrg2013@asto.com.cn	dummy	0	5000000	7569459		2015-07-01 06:28:17
transfer	交易付款	2015062821001001000282250033	T200P1108608169315343	chenrg2013@asto.com.cn	1353212988@qq.com	12800	0	7582259	忆红妆敬酒服短款红色新娘结婚晚礼服 夏季伴娘孕妇婚纱2015新款	2015-07-01 08:23:43
transfer	转账	BO20150701009774914702	CAE_POINT_92362913436	chenrg2013@asto.com.cn	jifenb2c@taobao.com	0	64	7582195	代扣返点积分1108608169315343	2015-07-01 08:23:43
transfer	交易付款	2015062621001001860282310083	T200P1103148967888053	chenrg2013@asto.com.cn	18863595622	12500	0	7594695	忆红妆敬酒服短款红色新娘结婚晚礼服 夏季伴娘孕妇婚纱2015新款	2015-07-01 08:34:48

16.6.2. 输出

Hive 数据库,库名alipay,有两张表:.finance 账务流水表和 trade_amount_monthly 月交易额统计表

16.7. 使用zeppelin查询

示例:

%sql
select alipayid,ordermonth,sum(price) from alipay.finance where category='交易付款' group by alipayid,ordermonth

17. 大数据实施建议

预研学习阶段先投入一到两名员工了解大数据的概念、基本环境配置的及使用,使用HDP搭建不少于3个节点的实验集群,导入部分生产数据做一些业务场景练习, 在有实际业务输入时根据情况选择合适的技术、搭建测试生产集群,组建独立大数据团队。

17.1. 集群环境

一般而言需要3个独立的集群

名称 说明

开发调试集群

用于平时的开发、调试及新技术测试等,此集群建议在5-8个节点

测试集群

用于上线前的功能测试,由于测试集群使用频度及负载不高,所以5个节点比较合适

生产集群

用于生产作业,至少8个节点以上

17.2. 大数据团队

一般建议在3-12人左右,应用开发:系统运维:ETL的人员比可为 5:1:4

以上的节点数量及人员配置仅针对初创阶段,数据量及作业量不是很大的情况,否则要具体情况具体分析。

17.3. 技术选型

17.3.1. 数据采集

  • 如果有很多历史在关系型数据库中且希望将这些数据导入大数据平台,那么可考虑使用Sqoop实现数据抽取,Kettle并不是为大数据而生,扩展性不好,如数据量不是很大可以尝试使用

  • 如果有大量的Web数据那推荐使用Nutch方便地抓取网页内容

  • 对于日志的分析推荐使用Kafka来实现,大概流程是用Logstash对接各类日志文件(e.g. log4j logback) 然后使用LogstashKafka插件将收到的日志添加到队列中,此方案可参见 http://my.oschina.net/gudaoxuri/blog/534710

17.3.2. 数据处理

如没有特殊情况推荐使用Spark作为处理引擎

  • 如果业务需要实时处理则可使用Spark Streaming

  • 如果需要有复杂的关系链处理可考虑使用Spark GraphX,用图来实现

  • 如果需要做机器学习相关,如推荐引擎,则可考虑使用Spark MLibMahout(目前版本处理引擎也是用Spark)

17.3.3. 数据存储

  • 对于需要快存快取且不需要做OLTP的业务HBase是比较合适的数据库

  • 如果业务需要比较复杂的分析但对实时性要求不高且查询的多为历史数据(不会变更)那么Hive是不二之选,可以对接TezSpark作为处理引擎以加快处理速度

  • 如果仅仅是想做留档或备份,偶尔做一些离线分析,那么直接放到HDFS是不错的选择

  • 如果数据体量很大且业务要求做近实时的复杂分析,可考虑使用ElasticSearch,另外也可以关注Drill

  • 如果数据体量是很大需要做近实时复杂分析那么Mongo也许是一个不错的选择

  • 如果只是简单的做指标统计,Redis是个好东西

17.3.4. 数据可视化

  • 简单的图表分析可使用Zeppelin

  • 需要平台级的工具那么推荐使用Hue,要效果“酷炫”可以关注caravel(https://github.com/airbnb/caravel)

  • 如果需要做Cube分析,那么Kylin是首选

  • 当然最贴近业务的必定是自主开发,可使用EchartsD3.js实现定制化的图表

17.4. 请对以下技术保持关注