大數據實戰項目(2)-數據採集、處理、分發流程所涉及到的框架及配置

對該實戰項目的介紹及所使用的各種工具等可以查看這篇博客:大數據實戰項目(1)-項目簡介、開發技術、工具、架構等

Linux環境準備

總共使用了3臺虛擬機,先配置好1臺,然後採用VMware Workstation克隆出另外兩臺,有兩臺給2G的內存,1臺給1G。

常規設置

1)設置ip地址 可以直接使用界面修改ip,如果Linux沒有安裝操作界面,需要使用命令:vi /etc/sysconfig/network-scripts/ifcfg-eth0來修改ip地址,然後重啓網絡服務service network restart即可。

2)創建用戶

#創建用戶命令:
adduser bigDAta
#設置用戶密碼命令:
passwd bigDAta

3)設置主機名 因爲Linux系統的主機名默認是localhost,顯然不方便後面集羣的操作,所以需要手動修改Linux系統的主機名。

 #查看主機名命令:
 $ hostname 
 #修改主機名稱
 $ vi /etc/sysconfig/network
 NETWORKING=yes 
 HOSTNAME=bigdata-pro01.bigDAta.com

4)主機名映射 如果想通過主機名訪問Linux系統,還需要配置主機名跟ip地址之間的映射關係。 vi /etc/hosts 192.168.1.151 bigdata-pro01.bigDAta.com 配置完成之後,reboot重啓Linux系統即可。 爲了能在windows下通過hostname訪問Linux系統,也在windows下的hosts文件中配置主機名稱與ip之間的映射關係。在windows系統下找到C:\WINDOWS\system32\drivers\etc\路徑,打開HOSTS文件添加如下內容: 192.168.1.151 bigdata-pro01.bigDAta.com

5)root用戶下設置無密碼用戶切換 在開發過程中bigDAta用戶經常使用root權限操作文件,需要頻繁與root用戶切換,每次輸入密碼非常麻煩,故設置無密碼切換。修改/etc/sudoers這個文件添加如下代碼,即可實現無密碼用戶切換操作。 vi /etc/sudoers 。。。添加如下內容即可 bigDAta ALL=(root)NOPASSWD:ALL

6)關閉防火牆 我們都知道防火牆對我們的服務器是進行一種保護,但是有時候防火牆也會給我們帶來很大的麻煩。 比如它會妨礙hadoop集羣間的相互通信,所以我們需要關閉防火牆。

#永久關閉防火牆
vi /etc/sysconfig/selinux
SELINUX=disabled 
#查看防火牆狀態:
 service iptables status 
 #打開防火牆:
 service iptables start
 #關閉防火牆:
 service iptables stop

7)卸載Linux本身自帶的jdk 一般情況下jdk需要我們手動安裝兼容的版本,此時Linux自帶的jdk需要手動刪除掉,具體操作如下所示: a)

#查看Linux自帶的jdk
rpm -qa|grep java
#刪除Linux自帶的jdk 
rpm -e --nodeps [jdk進程名稱1 jdk進程名稱2 ...]

項目配置

1)bigDAta用戶下創建各個目錄

#軟件目錄--未解壓的,FileZilla上傳
mkdir /opt/softwares
#模塊目錄--解壓的各個框架
mkdir /opt/modules
#工具目錄
mkdir /opt/tools
#數據目錄
mkdir /opt/datas
#jar
mkdir /opt/jars

2)jdk安裝(1.8) 大數據平臺運行環境依賴JVM,所以我們需要提前安裝和配置好jdk。因爲安裝了64位的centos系統,所以jdk也需要安裝64位的,與之相匹配 。

#解壓命令
tar -zxf jdk-8u191-linux-x64.tar.gz /opt/modules/
#配置環境變量
vi /etc/profile
export JAVA_HOME=/opt/modules/jdk1.8.0_191
export PATH=$PATH:$JAVA_HOME/bin
#查看是否安裝成功
java -version

3)克隆虛擬機 在克隆虛擬機之前,需要關閉虛擬機,然後右鍵選中虛擬機——》管理——》克隆——》下一步——》下一步——》選擇創建完整克隆,下一步——》選擇克隆虛擬機位置(提前創建好),修改虛擬機名稱爲Hadoop-Linux-pro-2,然後選擇完成即可。 然後使用同樣的方式創建第三個虛擬機Hadoop-Linux-pro-3。

4)修改克隆虛擬機配置 對以上配置的常規配置進行相應修改

ZooKeeper分佈式集羣部署

1)完成ZooKeeper版本下載及安裝

2)相關配置

提前創建數據目錄/opt/modules/zookeeper-3.4.5-cdh5.10.0/zkData,並在該目錄下創建myid文件,編輯每臺機器的myid內容爲一個整數x,與zoo.cfg文件中server.x對應

<!--zoo.cfg-->
<!--The number of milliseconds of each tick-->
tickTime=2000
<!-- The number of ticks that the initial synchronization phase can take-->
initLimit=10
<!-- The number of ticks that can pass between sending a request and getting an acknowledgement-->
syncLimit=5
<!--the directory where the snapshot is stored. do not use /tmp for storage, /tmp here is just example sakes.-->
dataDir=/opt/modules/zookeeper-3.4.5-cdh5.10.0/zkData
<!-- the port at which the clients will connect-->
clientPort=2181
<!--server.每個節點服務編號 = 服務器ip地址:集羣通信端口:選舉端口-->
server.1=bigdata-pro01.bigDAta.com:2888:3888
server.2=bigdata-pro02.bigDAta.com:2888:3888
server.3=bigdata-pro03.bigDAta.com:2888:3888

Hadoop HA架構與部署

1)完成hadoop版本下載及安裝
2)相關配置

非HA Hadoop集羣文件參考:點擊此鏈接 https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html 進入,左下角有一個Configuration,點擊即可查看相應配置文件;HA Hadoop集羣配置,參照此鏈接 https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

  • HDFS相關配置文件
#hadoop-env.sh 運行Hadoop要用到的環境變量
#在默認的基礎上添加JAVA_HOME,或者在shell中設置,推薦前者
export JAVA_HOME=/opt/modules/jdk1.8.0_191
<!--core-site.xml Hadoop Core 的配置項:HDFS MapReduce YARN常用的I/O設置等-->
<configuration>
	<property>
        <name>fs.defaultFS</name>
        <value>hdfs://ns</value>
	</property>
	<property>
        <name>hadoop.http.staticuser.user</name>
        <value>bigDAta</value>
	</property>	
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/opt/modules/hadoop-2.6.0/data/tmp</value>
	</property>
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>file://${hadoop.tmp.dir}/dfs/name</value>
	</property>
	<!--注意參數一欄不能換行,用逗號隔開即可-->
	<property>
		<name>ha.zookeeper.quorum</name>
		<value>bigdata-pro01.bigDAta.com:2181,bigdata-pro02.bigDAta.com:2181,bigdata-pro03.bigDAta.com:2181</value>
	</property>
	<property>
  		<name>hadoop.proxyuser.bigDAta.hosts</name>
  		<value>*</value>
 	</property>
 	<property>
		<name>hadoop.proxyuser.bigDAta.groups</name>
  		<value>*</value>
	</property>
	<property>
		<name>hadoop.proxyuser.hue.hosts</name>
		<value>*</value>
	</property>
	<property>
		<name>hadoop.proxyuser.hue.groups</name>
		<value>*</value>
	</property> 
	

</configuration>
<!--hdfs-site.xml 守護進行的配置項:namenode 輔助namenode datanode -->
<configuration>
	<property>
	  <name>dfs.nameservices</name>
	  <value>ns</value>
	</property>
	<property>
	  <name>dfs.ha.namenodes.ns</name>
	  <value>nn1,nn2</value>
	</property>
	<property>
	  <name>dfs.namenode.rpc-address.ns.nn1</name>
	  <value>bigdata-pro01.bigDAta.com:8020</value>
	</property>
	<property>
	  <name>dfs.namenode.rpc-address.ns.nn2</name>
	  <value>bigdata-pro02.bigDAta.com:8020</value>
	</property>
	<property>
      <name>dfs.namenode.http-address.ns.nn1</name>
      <value>bigdata-pro01.bigDAta.com:50070</value>
    </property>
	<property>
       <name>dfs.namenode.http-address.ns.nn2</name>
       <value>bigdata-pro02.bigDAta.com:50070</value>
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://bigdata-pro01.bigDAta.com:8485;bigdata-pro02.bigDAta.com:8485;bigdata-pro03.bigDAta.com:8485/ns</value>
    </property>
	<property>
       <name>dfs.journalnode.edits.dir</name>
       <value>/opt/modules/hadoop-2.6.0/data/jn</value>
    </property>
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>sshfence</value>
	</property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/bigDAta/.ssh/id_rsa</value>
    </property>
	
	<property>
		<name>dfs.client.failover.proxy.provider.ns</name>
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
	<!--是否開啓自動故障轉移-->
	<property>
        <name>dfs.ha.automatic-failover.enabled.ns</name>
        <value>true</value>
    </property>
	<property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
	<property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>
	
</configuration>

<!--slaves-->
<!--列舉了可以運行datanode和節點管理器的機器,這個文件僅有運行在namenode和資源管理器上的控制腳本使用-->
bigdata-pro01.bigDAta.com
bigdata-pro02.bigDAta.com
bigdata-pro03.bigDAta.com

HDFS-HA自動故障轉移測試

  • 啓動ZooKeeper集羣
  • 初始化HA 在ZooKeeper中的狀態bin/hdfs zkfc -formatZK
  • 啓動HDFS服務,注意要提前配置ssh(參考: https://blog.csdn.net/xl132598798/article/details/105513039 ),否則sbin/start-dfs無法直接啓動(第一次啓動HDFS服務,需要在namenode進行格式化,bin/hdfs namenode -format
  • 在各個namenode節點上啓動zkfc線程sbin/hadoop-daemon.sh start zkfc,先啓動zkfc的namenode狀態是Active,另一個是Standy
  • 測試:上傳文件到hdfs上,kill狀態爲Active的namenode,再次查看namenode狀態時,就會發現主備切換了
#yarn-env.sh 運行YARN要用到的腳本(覆蓋hadoop-env.sh)
if [ "$JAVA_HOME" != "" ]; then
  #echo "run java in $JAVA_HOME"
  JAVA_HOME=/opt/modules/jdk1.8.0_191
fi
  
if [ "$JAVA_HOME" = "" ]; then
  echo "Error: JAVA_HOME is not set."
  exit 1
fi

JAVA=$JAVA_HOME/bin/java
JAVA_HEAP_MAX=-Xmx1000m 
<!--yarn-site.xml 守護進行的配置項:資源管理器 web應用代理服務器和節點管理器 -->
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
	<property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
	<property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>10000</value>
    </property>
	<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
	</property>
	<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>rs</value>
	</property>
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>bigdata-pro01.bigDAta.com</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>bigdata-pro02.bigDAta.com</value>
	</property>
	<property>
		  <name>yarn.resourcemanager.zk-address</name>
		  <value>bigdata-pro01.bigDAta.com:2181,bigdata-pro02.bigDAta.com:2181,bigdata-pro03.bigDAta.com:2181</value>
	</property>
	<property>
		<name>yarn.resourcemanager.recovery.enabled</name>
		<value>true</value>
	</property>
	<property>
		<name>yarn.resourcemanager.store.class</name>
		<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
	</property>	
	<property>
         <name>yarn.log.server.url</name>
         <value>http://bigdata-pro01.bigDAta.com:19888/jobhistory/logs</value>
	</property>
	<property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>4</value>    
    </property>
	<property>
		<name>yarn.resourcemanager.webapp.address</name>
		<value>bigdata-pro01.bigDAta.com:8088</value>
	</property>
	

</configuration>

YARN-HA故障轉移測試

  • 在rm1節點上啓動yarn服務 sbin/start-yarn.sh
  • 在rm2節點上啓動ResourceManager服務 sbin/yarn-daemon.sh start resourcemanager
  • 查看yarn的web界面
  • 上傳文件到hdfs並執行MapReduce例子
  • 執行到一半的時候,kill掉rm1上的resourcemanager ,任務會轉移到rm2繼續處理
#mapred-env.sh 運行MapReduce要用到的腳本(覆蓋hadoop-env.sh)
export JAVA_HOME=/opt/modules/jdk1.8.0_191
<!--mapred-site.xml 守護進行的配置項:作業歷史服務器 -->
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
	<property>
        <name>mapreduce.jobhistory.address</name>
        <value>bigdata-pro01.bigDAta.com:10020</value>
    </property>
	<property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>bigdata-pro01.bigDAta.com:19888</value>
    </property>
	
</configuration>

HBase分佈式集羣部署

1)完成HBase版本下載及安裝
2)相關配置

#hbase-env.sh
export JAVA_HOME=/opt/modules/jdk1.8.0_191
#使用外部的ZooKeeper
export HBASE_MANAGES_ZK=false
<!--hbase-site.xml,需要將hadoop中hdfs-site.xml和core-site.xml拷貝到hbase的conf下,否則啓動失敗,因爲ns配置在hadoop中-->
<configuration>
	<property>
    		<name>hbase.rootdir</name>
    		<value>hdfs://ns/hbase</value>
	</property>
	<property>
    		<name>hbase.cluster.distributed</name>
    		<value>true</value>
	</property>
	<property>
		<name>hbase.zookeeper.quorum</name>
		<value>bigdata-pro01.bigDAta.com,bigdata-pro02.bigDAta.com,bigdata-pro03.bigDAta.com</value>
	</property>
</configuration>

3)HBase啓動

  • 先啓動ZooKeeper
  • 啓動HDFS HA
  • 在每個namenode上啓動zkfc
  • 啓動HBase
  • 訪問web頁面查看

4)shell連接

bin/hbase shell進入hbase,創建表CREATE weblogs,info

Kafka分佈式集羣部署

1)完成Kafka版本下載及安裝

2)相關配置

在三臺機器上分別配置如下幾個文件:

#server.properties
############################# Server Basics #############################

# The id of the broker. This must be set to a unique integer for each broker.
#另外兩臺機器上分別是1,2
broker.id=0

############################# Socket Server Settings #############################
#修改成爲自己機器的ip地址
listeners=PLAINTEXT://bigdata-pro01.bigDAta.com:9092

# The port the socket server listens on
port=9092

# Hostname the broker will bind to. If not set, the server will bind to all interfaces
#修改爲自己機器的hostname
host.name=bigdata-pro01.bigDAta.com


# The number of threads handling network requests
num.network.threads=3
 
# The number of threads doing disk I/O
num.io.threads=8

# The send buffer (SO_SNDBUF) used by the socket server
socket.send.buffer.bytes=102400

# The receive buffer (SO_RCVBUF) used by the socket server
socket.receive.buffer.bytes=102400

# The maximum size of a request that the socket server will accept (protection against OOM)
socket.request.max.bytes=104857600


############################# Log Basics #############################

# A comma seperated list of directories under which to store log files
#修改默認的log文件夾
log.dirs=/opt/modules/kafka_2.10-0.9.0.0/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
log.cleaner.enable=false

############################# Zookeeper #############################

# Zookeeper connection string (see zookeeper docs for details).
# This is a comma separated host:port pairs, each corresponding to a zk
# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002".
# You can also append an optional chroot string to the urls to specify the
# root directory for all kafka znodes.
zookeeper.connect=bigdata-pro01.bigDAta.com:2181,bigdata-pro02.bigDAta.com:2181,bigdata-pro03.bigDAta.com:2181

# Timeout in ms for connecting to zookeeper
zookeeper.connection.timeout.ms=6000

配置zookeeper. properties

#該目錄需要與zookeeper集羣配置保持一致
dataDir=/opt/modules/zookeeper-3.4.5-cdh5.10.0/zkData
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0

配置producer.properties

metadata.broker.list=bigdata-pro01.bigDAta.com:9092,bigdatapro02.bigDAta.com:9092,bigdata-pro03.bigDAta.com:9092

producer.type=sync

compression.codec=none

# message encoder
serializer.class=kafka.serializer.DefaultEncoder

配置consumer.properties

zookeeper.connect=bigdata-pro01.bigDAta.com:2181,bigdata-pro02.bigDAta.com:2181,bigdata-pro03.bigDAta.com:2181

# timeout in ms for connecting to zookeeper
zookeeper.connection.timeout.ms=6000

#consumer group id
group.id=test-consumer-group

3)編寫Kafka Consumer執行腳本

#/bin/bash
echo "bigDAta-kafka-consumer.sh start ......"
bin/kafka-console-consumer.sh --zookeeper bigdata-pro01.bigDAta.com:2181,bigdata-pro02.bigDAta.com:2181,bigdata-pro03.bigDAta.com:2181 --from-beginning --topic weblogs

Flume數據採集準備

項目使用2臺Flume服務器用於日誌收集,另一臺用於對前2臺收集到的日誌進行合併及處理,並將數據分發給Kafka、HBase,但是HBase中涉及到的表結構是自定義的,所以由Flume發送至HBase代碼需要進行修改,故需要下載flume源碼。並在開發工具IDEA中進行修改。

1)完成Flume版本下載及安裝

2)源碼修改

在IDEA找到解壓後的源碼包,選中flume-ng-hbase-sink,按照如下方式修改源碼,將修改後的flume-ng-hbase-sink源碼打成jar包,將原來Flume自帶的包覆蓋掉即可。

//自定義KfkAsyncHbaseEventSerializer.class,需要與配置文件中agent1.sinks.hbaseSink.serializer的屬性值對應
@Override
    public List<PutRequest> getActions() {
        List<PutRequest> actions = new ArrayList<>();
        if (payloadColumn != null) {
            byte[] rowKey;
            try {
                /*---------------------------代碼修改開始---------------------------------*/
                //解析列字段
                String[] columns = new String(this.payloadColumn).split(",");
                //解析flume採集過來的每行的值
                String[] values = new String(this.payload).split(",");
                for(int i=0;i < columns.length;i++) {
                    byte[] colColumn = columns[i].getBytes();
                    byte[] colValue = values[i].getBytes(Charsets.UTF_8);

                    //數據校驗:字段和值是否對應
                    if (colColumn.length != colValue.length) break;

                    //時間
                    String datetime = values[0].toString();
                    //用戶id
                    String userid = values[1].toString();
                    //根據業務自定義Rowkey
                    rowKey = SimpleRowKeyGenerator.getKfkRowKey(userid, datetime);
                    //插入數據
                    PutRequest putRequest = new PutRequest(table, rowKey, cf,
                            colColumn, colValue);
                    actions.add(putRequest);
                    /*---------------------------代碼修改結束---------------------------------*/
                }
            } catch (Exception e) {
                throw new FlumeException("Could not get row key!", e);
            }
        }
        return actions;
    }
//根據自己的業務修改這個類中自定義KEY生成的方法
public class SimpleRowKeyGenerator {

  public static byte[] getKfkRowKey(String userid,String datetime)throws UnsupportedEncodingException {
    return (userid + datetime + String.valueOf(System.currentTimeMillis())).getBytes("UTF8");
  }
}

3)相關配置

#flume-env.sh
export JAVA_HOME=/opt/modules/jdk1.8.0_191
export HADOOP_HOME=/opt/modules/hadoop-2.6.0
export HBASE_HOME=/opt/modules/hbase-1.0.0-cdh5.4.0

主要是對sources、channels、sinks的配置。

  • Source:source是從一些其他產生數據的應用中接收數據的活躍組件。Source可以監聽一個或者多個網絡端口,用於接收數據或者可以從本地文件系統讀取數據。每個Source必須至少連接一個Channel。基於一些標準,一個Source可以寫入幾個Channel,複製事件到所有或者某些Channel。

    Source可以通過處理器 - 攔截器 - 選擇器路由寫入多個Channel。

  • **Channel:**channel的行爲像隊列,Source寫入到channel,Sink從Channel中讀取。多個Source可以安全地寫入到相同的Channel,並且多個Sink可以從相同的Channel進行讀取。

    可是一個Sink只能從一個Channel讀取。如果多個Sink從相同的Channel讀取,它可以保證只有一個Sink將會從Channel讀取一個指定特定的事件。

    Flume自帶兩類Channel:Memory Channel和File Channel。Memory Channel的數據會在JVM或者機器重啓後丟失;File Channel不會。

  • Sink: sink連續輪詢各自的Channel來讀取和刪除事件。

#flume-conf.properties,日誌合併及預處理Flume的配置
agent1.sources = r1
agent1.channels = kafkaC hbaseC 
agent1.sinks =  kafkaSink hbaseSink

agent1.sources.r1.type = avro
agent1.sources.r1.channels = hbaseC kafkaC
agent1.sources.r1.bind = bigdata-pro01.bigDAta.com
agent1.sources.r1.port = 5555
agent1.sources.r1.threads = 5
# flume-hbase
agent1.channels.hbaseC.type = memory
agent1.channels.hbaseC.capacity = 100000
agent1.channels.hbaseC.transactionCapacity = 100000
agent1.channels.hbaseC.keep-alive = 20

agent1.sinks.hbaseSink.type = asynchbase
agent1.sinks.hbaseSink.table = weblogs
agent1.sinks.hbaseSink.columnFamily = info
agent1.sinks.hbaseSink.channel = hbaseC
agent1.sinks.hbaseSink.serializer = org.apache.flume.sink.hbase.KfkAsyncHbaseEventSerializer
agent1.sinks.hbaseSink.serializer.payloadColumn = datatime,userid,searchname,retorder,cliorder,cliurl

#flume-kafka
agent1.channels.kafkaC.type = memory
agent1.channels.kafkaC.capacity = 100000
agent1.channels.kafkaC.transactionCapacity = 100000
agent1.channels.kafkaC.keep-alive = 20

agent1.sinks.kafkaSink.channel = kafkaC
agent1.sinks.kafkaSink.type = org.apache.flume.sink.kafka.KafkaSink
agent1.sinks.kafkaSink.brokerList = bigdata-pro01.bigDAta.com:9092,bigdata-pro02.bigDAta.com:9092,bigdata-pro03.bigDAta.com:9092
agent1.sinks.kafkaSink.topic = weblogs
agent1.sinks.kafkaSink.zookeeperConnect = bigdata-pro01.bigDAta.com:2181,bigdata-pro02.bigDAta.com:2181,bigdata-pro03.bigDAta.com:2181
agent1.sinks.kafkaSink.requiredAcks = 1
agent1.sinks.kafkaSink.batchSize = 1
agent1.sinks.kafkaSink.serializer.class = kafka.serializer.StringEncoder
##flume-conf.properties,另2臺日志收集服務器的相關配置分別如下:
agent2.sources = r1
agent2.channels = c1
agent2.sinks = k1

agent2.sources.r1.type = exec
agent2.sources.r1.command = tail -F /opt/datas/weblog-flume.log
agent2.sources.r1.channels = c1

agent2.channels.c1.type = memory
agent2.channels.c1.capacity = 10000
agent2.channels.c1.transactionCapacity = 10000
agent2.channels.c1.keep-alive = 5

agent2.sinks.k1.type = avro
agent2.sinks.k1.channel = c1
agent2.sinks.k1.hostname = bigdata-pro01.bigDAta.com
agent2.sinks.k1.port = 5555



agent3.sources = r1
agent3.channels = c1
agent3.sinks = k1

agent3.sources.r1.type = exec
agent3.sources.r1.command = tail -F /opt/datas/weblog-flume.log
agent3.sources.r1.channels = c1

agent3.channels.c1.type = memory
agent3.channels.c1.capacity = 10000
agent3.channels.c1.transactionCapacity = 10000
agent3.channels.c1.keep-alive = 5

agent3.sinks.k1.type = avro
agent3.sinks.k1.channel = c1
agent3.sinks.k1.hostname = bigdata-pro01.bigDAta.com

Flume+HBase+Kafka集成及測試

1)原始日誌數據簡單處理

  • 下載搜狗實驗室數據,並在網頁上查看格式說明( 數據格式爲:訪問時間\t用戶ID\t[查詢詞]\t該URL在返回結果中的排名\t用戶點擊的順序號\t用戶點擊的URL 其中,用戶ID是根據用戶使用瀏覽器訪問搜索引擎時的Cookie信息自動賦值,即同一次使用瀏覽器輸入的不同查詢對應同一個用戶ID )
  • 日誌簡單處理,將文件中的空格更換爲逗號,再次查看格式,發現還有空格存在,再次將空格換成逗號,得到處理後的日誌文件weblog.log

2)編寫模擬日誌生成的過程

  • 代碼實現的功能是將原始日誌文件weblog.log,每次讀取一行並不斷寫入另一個文件weblog-flume.log,從而實現日誌生成過程。

    public class ReadWebLog {
    
        private static String readFileName;
        private static String writeFileName;
    
        public static void main(String args[]) {
            //需要手動收入兩個參數
            readFileName = args[0];
            writeFileName = args[1];
            readFile(readFileName);
    
        }
    
        public static void readFile(String fileName) {
    
            try {
                FileInputStream fis = new FileInputStream(fileName);
                InputStreamReader isr = new InputStreamReader(fis, "GBK");
                //以上兩步已經可以從文件中讀取到一個字符了,但每次只讀取一個字符不能滿足大數據的需求。故需使用BufferedReader,它具有緩衝的作用,可以一次讀取多個字符
                BufferedReader br = new BufferedReader(isr);
                int count = 0;
                while (br.readLine() != null) {
                    String line = br.readLine();
                    count++;
                    // 顯示行號
                    Thread.sleep(300);
                    String str = new String(line.getBytes("UTF8"), "GBK");
                    System.out.println("row:" + count + ">>>>>>>>" + line);
                    writeFile(writeFileName, line);
                }
                isr.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    
        public static void writeFile(String fileName, String conent) {
            try {
                FileOutputStream fos = new FileOutputStream(fileName, true);
                OutputStreamWriter osw = new OutputStreamWriter(fos);
           
                BufferedWriter bw = new BufferedWriter(osw);
                bw.write("\n");
                bw.write(conent);
                bw.close();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
  • 將項目打包成weblogs.jar放在兩臺日誌收集服務器/opt/jars目錄下

  • 編寫運行模擬日誌生成的shell腳本weblog-shell.sh

    echo "start log......"
    java -jar /opt/jars/weblogs.jar /opt/datas/weblog.log /opt/datas/weblog-flume.log
    
  • 運行./weblog-shell.sh即可不斷向weblog-flume.log寫入日誌信息

  • 編寫Flume啓動腳本flume-bigDAta-start.sh,第二臺的示例如下:

    #/bin/bash
    echo "flume-2 start ......"
    bin/flume-ng agent --conf conf -f conf/flume-conf.properties -n agent2 -Dflume.root.logger=INFO,console
    

    一切正常的話那麼接下來就需要,日誌合併及處理Flume機器就可以採集到的處理後的數據,接下來是向Kafka分發數據

  • 編寫Kafka消費執行腳本,並分發到其他集羣內機器上

    #/bin/bash
    echo "bigDAta-kafka-consumer.sh start ......"
    bin/kafka-console-consumer.sh --zookeeper bigdata-pro01.bigDAta.com:2181,bigdata-pro02.bigDAta.com:2181,bigdata-pro03.bigDAta.com:2181 --from-beginning --topic weblogs
    

3)數據採集分發測試

  • 啓動各個節點上的ZooKeeper

  • 啓動HDFS,在每臺namenode上,啓動zkfc

  • 啓動HBase並啓動備用master,保證HBase中已有weblogs表

  • 啓動Kafka,並創建weblogs topic;

  • 分別啓動Flume

  • 在日誌收集節點上啓動日誌模擬生產即weblog-shell.sh

  • 啓動編寫的Kafka消費腳本,並查看是否一直在進行消費

  • 查看HBase數據庫寫入情況。

    數據採集、處理、分發過程結束,接下來是對數據的分析處理。
    詳見: 大數據實戰項目(3)-離線處理及實時處理部分
    對實戰過程中所經歷的過程進行復盤。非常感謝在實戰過程中遇到問題所查閱的各種博客,本文就不一一列舉了。感謝~~~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章