大数据工程实战:实时数据流处理
一、配置环境
小tips:
删除hadoop
cd /usr/local
sudo rm -rf hadoop
删除hbase
cd /usr/local
sudo rm -rf hbase
1、hadoop伪分布配置
$ cd ~/Downloads # 进入下载目录
$ wget -c http://res.aihyzh.com/大数据技术原理与应用3/02/hadoop-3.1.3.tar.gz #下载
资源
$ sudo tar -zxf ~/Downloads/hadoop-3.1.3.tar.gz -C /usr/local # 解压
到/usr/local中
$ cd /usr/local/
$ sudo mv ./hadoop-3.1.3/ ./hadoop # 将文件夹名改为hadoop
$ sudo chown -R stu:stu ./hadoop # 修改文件权限
需要配置相关文件,才能够让Hadoop在伪分布式模式下顺利运行。Hadoop的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,进行伪分布式模式配置时,需要修改3个配置文件,即hadoop-env.sh , core-site.xml 和 hdfs-site.xml
1.使用vim编辑器打开 hadoop-env.sh 文件,进行修改 JAVA_HOME 配置。
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
2.使用vim编辑器打开 core-site.xml 文件
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
3.使用vim编辑器打开 hdfs-site.xml 文件
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
4.执行名称节点格式化
cd /usr/local/hadoop
./bin/hdfs namenode -format
5.启动hadoop
cd /usr/local/hadoop
./sbin/start-dfs.sh
出现NameNode、DataNode、SecondaryNameNode就算成功。
2、hbase伪分布配置
cd ~/Downloads # 进入下载目录
wget -c http://res.aihyzh.com/大数据技术原理与应用3/04/hbase-2.2.2-bin.tar.gz #下载资源
sudo tar -zxf ~/Downloads/hbase-2.2.2-bin.tar.gz -C /usr/local
sudo mv /usr/local/hbase-2.2.2 /usr/local/hbase
1.配置环境变量:
vim ~/.bashrc
和之前hadoop写一起
export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/usr/local/hbase/bin
添加后,执行如下命令使设置生效:
source ~/.bashrc
2.添加用户权限
sudo chown -R stu:stu /usr/local/hbase
不要直接查看hbase版本,会报错,配好伪分布再看。
3.配置hbase-env.sh文件
vim /usr/local/hbase/conf/hbase-env.sh
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export HBASE_CLASSPATH=/usr/local/hadoop/conf
export HBASE_MANAGES_ZK=true
配置hbase-site.xml文件
vim /usr/local/hbase/conf/hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
4.查看HBase版本信息,以确认HBase已经安装成功:
/usr/local/hbase/bin/hbase version
先启动hadoop,再启动hbase。
以进入 HBase Shell 模式,命令如下
bin/hbase shell
。创建Flume日志文件
在/usr/local/flume/conf下新建一个配置文件 streaming_project.conf,配置source、sink、Channel的
各项参数,连接各个组件,其配置内容如下:
第五行是一行!!!
exec-memory-kafka.sources = exec-source
exec-memory-kafka.sinks = kafka-sink
exec-memory-kafka.channels = memory-channel
exec-memory-kafka.sources.exec-source.type = exec
exec-memory-kafka.sources.exec-source.command = tail -F /home/pabu/data/click.log
exec-memory-kafka.sources.exec-source.shell = /bin/sh -c
exec-memory-kafka.channels.memory-channel.type = memory
exec-memory-kafka.sinks.kafka-sink.type = org.apache.flume.sink.kafka.KafkaSink
exec-memory-kafka.sinks.kafka-sink.brokerList = localhost:9092
exec-memory-kafka.sinks.kafka-sink.topic = streamtopic
exec-memory-kafka.sinks.kafka-sink.batchSize = 10
exec-memory-kafka.sinks.kafka-sink.requiredAcks = 1
exec-memory-kafka.sources.exec-source.channels = memory-channel
exec-memory-kafka.sinks.kafka-sink.channel = memory-channel
。。hbase建表
、、、、、、
。。mysql建表
低版本mysql可能出现的问题
mysql插入数据无法插入中文
使用: show variables like “%character%”;
查看编码,发现数据库默认编码时Latin,该编码无法使用中文。
解决办法,创建表时直接设置默认编码,使用utf-8后能正常插入中文。
二、后端项目
目录结构:
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.8</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-scala_2.11</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>net.jpountz.lz4</groupId>
<artifactId>lz4</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
</dependencies>
配置maven前最好修改成国内镜像源
settings.xml
在图示位置添加阿里云
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
在util包下创建Java类HBaseUtils,用于连接HBase,存储处理的结果,类HBaseUtils完整代码如下:
HBaseUtils.java
注意!!!下面这行要改成localhost
configuration.set("hbase.zookeeper.quorum", "localhost:2181");
package com.spark.streaming.project.utils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HTable;
/**
* Hbase工具类,用于:
* 连接HBase,获得表实例
*/
public class HBaseUtils {
private Configuration configuration = null;
private Connection connection = null;
private static HBaseUtils instance = null;
/**
* 在私有构造方法中初始化属性
*/
private HBaseUtils(){
try {
configuration = new Configuration();//指定要访问的zk服务器
configuration.set("hbase.zookeeper.quorum", "localhost:2181");
//得到Hbase连接
connection = ConnectionFactory.createConnection(configuration);
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 获得HBase连接实例
*/
public static synchronized HBaseUtils getInstance(){
if(instance == null){
instance = new HBaseUtils();
}
return instance;
}
/**
*由表名得到一个表的实例
* @param tableName
* @return
*/
public HTable getTable(String tableName) {
HTable hTable = null;
try {
hTable = (HTable)connection.getTable(TableName.valueOf(tableName));
}catch (Exception e){
e.printStackTrace();
}
return hTable;
}
}
测试是否写入Hbase
- 启动hadoop
cd /usr/local/hadoop
./sbin/start-dfs.sh
- 启动hbase
cd /usr/local/hbase
./bin/start-hbase.sh
- 启动kafka
cd /usr/local/kafka
./bin/kafka-server-start.sh config/server.properties
- 利用crontab -e实现数据流的产生
- 启动Flume,监控存储日志的文件
cd /usr/local/flume/bin
./flume-ng agent --conf conf --name exec-memory-kafka --conf-file /usr/local/flume/conf/streaming_project.conf
- 运行本项目的核心类 CountByStreaming ,因为我们设置main方法要接收许多参数,因此在运行前需要配置一下该类:
新建application
选择运行的主类
配置main方法接收的参数
开启所有的服务。
开启ZooKeeper时提示地址已在使用,无法开启。
使用语句:sudo lsof -i:2181
查看2181端口,发现被ipv6占用,直接kill掉进程,能正常启动。
运行后端项目:
打开hbase shell
输入
scan 'ns1:courses_search_clickcount'
scan 'ns1:courses_clickcount'
可以看到数据成功写入hbase。
可能会出现的情况:注意!!一定要先等后端程序运行完,再开启hbase shell读数据,不然会报错 。。。is not online on xxx-virtual-machine
或者拒绝连接
推测是不能两边同时读写hbase,会报错。解决不了,建议重头再来吧。
三、前端项目
目录结构
配置maven
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
</dependencies>
推荐用maven安装MySQL的jdbc的驱动
代码略
idea配置mysql要花点时间。
测试mysql是否连接成功
测试hbase是否连接成功
有问题再写