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
容器说明
|
后续环境使用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
注意事项
|
-
安装完成,配置网络
ONBOOT=yes
BOOTPROTO=static
IPADDR=<ip>
NETMASK=<mask>
GATEWAY=<getway>
ifup eth0
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 账号
|
6. 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. 配置(伪分布式)
# 添加JDK目录
export JAVA_HOME=/opt/env/java
# 指定Hadoop日志写入到先前定义的目录
export HADOOP_LOG_DIR=/opt/workspaces/logs/hadoop
<!--指定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下,启动的时会被清空。
|
<!--副本数,默认是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.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.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>
7. 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. 配置(伪分布式)
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.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
./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
属性名称 | 默认值 | 说明 |
---|---|---|
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脚本中设置
模式 | 属性名称 | 默认值 | 说明 |
---|---|---|---|
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.11. 整合Hive
-
在
spark-env.sh
中添加配置项# Hive目录 export HIVE_HOME=$HIVE_HOME
SPARK_CLASSPATH
有些教程中说要添加 |
-
复制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
官网: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.6. Zookeepr常用命令
# 创建文件并初始内容
create /zk "test"
# 获取文件内容
get /zk
# 修改文件内容
set /zk "new"
# 显示目录
ls /
# 删除文件
delete /zk
# 退出客户端
quit
Zookeeper znode节点属性
|
9. HBase
官网:http://hbase.apache.org/ 官方文档:http://hbase.apache.org/book.html
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. 配置(完全分布式)
export JAVA_HOME=/opt/env/java
export HBASE_LOG_DIR=/opt/workspaces/logs/hbase
export HBASE_MANAGES_ZK=false
<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>
10. Hive
官网:http://hive.apache.org/
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. 配置(单机)
export HIVE_HOME=/opt/workspaces/frameworks/hive
export PATH=$PATH:$HIVE_HOME/bin
source ~/.profile
mysql -u root -p
create database hive;
grant all on *.* to'hive'@'%' identified by 'hive'; #账号hive,密码hive,所有IP都可以访问(%)
flush privileges;
exit;
./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
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
hive.log.dir=/opt/workspaces/frameworks/logs/hive
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.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
官网: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. 配置(伪分布式)
# 设置如下参数:
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的消息持久化文件,并不是一般意义的运行日志
|
# 设置日志目录
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
官网: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. 配置
export SQOOP_HOME=/opt/workspaces/frameworks/sqoop
source ~/.profile
export HADOOP_COMMON_HOME=/opt/workspaces/frameworks/hadoop
export HADOOP_MAPRED_HOME=/opt/workspaces/frameworks/hadoop
export HIVE_HOME=/opt/workspaces/frameworks/hive
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.4. 使用
./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 ''
增量的字段必须是timestamp 或date/datetime
|
13. 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. 配置
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"
14. others
15. 综合实例:访客分析
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. 部署
-
注释
pom.xml
中的<spark.scope>compile</spark.scope>
-
mvn assembly:assembly
-
上传
target/visit-analysis-0.0.1-jar-with-dependencies.jar
及/src/main/resources/ip.dat
到服务器 -
执行
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
,有两张表:
字段名 | 类型 | 说明 |
---|---|---|
category |
string |
统计类型,目前三个, |
clue |
string |
追踪值,是统计类型下的细分值 |
date |
long |
日期,格式 |
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 会按日期自动增加
|
字段名 | 类型 | 说明 |
---|---|---|
url |
string |
请求的url |
ip |
string |
请求的ip |
cookies |
string |
请求的cookies |
time |
timestamp |
请求时间 |
16. 综合实例:支付宝数据处理
16.1. 业务流程
-
数据抓取组件抓取支持宝数据存放在本地并调用大数据处理脚本
-
大数据处理脚本将抓取到的数据转存到HDFS并执行Spark处理程序
-
Spark处理程序将数据处理后存到Hive表中
-
使用Zeppelin/Hue完成基于Spark SQL的业务化数据分析
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. 部署
-
注释
pom.xml
中的<spark.scope>compile</spark.scope>
-
mvn assembly:assembly
-
上传`target/alipay-process-0.0.1-jar-with-dependencies.jar到服务器
-
执行
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
17. 大数据实施建议
预研学习阶段先投入一到两名员工了解大数据的概念、基本环境配置的及使用,使用HDP搭建不少于3个节点的实验集群,导入部分生产数据做一些业务场景练习, 在有实际业务输入时根据情况选择合适的技术、搭建测试生产集群,组建独立大数据团队。
17.1. 集群环境
一般而言需要3个独立的集群
名称 | 说明 |
---|---|
开发调试集群 |
用于平时的开发、调试及新技术测试等,此集群建议在5-8个节点 |
测试集群 |
用于上线前的功能测试,由于测试集群使用频度及负载不高,所以5个节点比较合适 |
生产集群 |
用于生产作业,至少8个节点以上 |
17.3. 技术选型
17.3.1. 数据采集
-
如果有很多历史在关系型数据库中且希望将这些数据导入大数据平台,那么可考虑使用
Sqoop
实现数据抽取,Kettle
并不是为大数据而生,扩展性不好,如数据量不是很大可以尝试使用 -
如果有大量的Web数据那推荐使用
Nutch
方便地抓取网页内容 -
对于日志的分析推荐使用
Kafka
来实现,大概流程是用Logstash
对接各类日志文件(e.g. log4j logback) 然后使用Logstash
的Kafka
插件将收到的日志添加到队列中,此方案可参见 http://my.oschina.net/gudaoxuri/blog/534710
17.3.2. 数据处理
如没有特殊情况推荐使用Spark
作为处理引擎
-
如果业务需要实时处理则可使用
Spark Streaming
-
如果需要有复杂的关系链处理可考虑使用
Spark GraphX
,用图来实现 -
如果需要做机器学习相关,如推荐引擎,则可考虑使用
Spark MLib
与Mahout(目前版本处理引擎也是用Spark)
17.3.3. 数据存储
-
对于需要快存快取且不需要做OLTP的业务
HBase
是比较合适的数据库 -
如果业务需要比较复杂的分析但对实时性要求不高且查询的多为历史数据(不会变更)那么
Hive
是不二之选,可以对接Tez
或Spark
作为处理引擎以加快处理速度 -
如果仅仅是想做留档或备份,偶尔做一些离线分析,那么直接放到
HDFS
是不错的选择 -
如果数据体量很大且业务要求做近实时的复杂分析,可考虑使用
ElasticSearch
,另外也可以关注Drill
-
如果数据体量不是很大需要做近实时复杂分析那么
Mongo
也许是一个不错的选择 -
如果只是简单的做指标统计,
Redis
是个好东西
17.3.4. 数据可视化
-
简单的图表分析可使用
Zeppelin
-
需要平台级的工具那么推荐使用
Hue
,要效果“酷炫”可以关注caravel
(https://github.com/airbnb/caravel) -
如果需要做Cube分析,那么
Kylin
是首选 -
当然最贴近业务的必定是自主开发,可使用
Echarts
及D3.js
实现定制化的图表
17.4. 请对以下技术保持关注
-
Flink:自诩比Spark更先进的计算引擎 http://flink.apache.org/
-
Phoenix: All Of SQL https://phoenix.apache.org/
-
Drill:Google dremel的山寨品 http://drill.apache.org/
-
Nifi 很复杂但很全面的数据分发工具,来自NSA http://nifi.apache.org/
-
KyLin 很有前途的多维分析工具 http://kylin.apache.org/