1. 程式人生 > >windows下搭建Flume client + Ubuntu18.04 Hadoop偽分散式

windows下搭建Flume client + Ubuntu18.04 Hadoop偽分散式

經過兩天的吐血折騰終於在hadoop的介面上看見我同步的日誌檔案了,記錄一下。先來張定妝照:
dashboard裡檢視:
dashboard裡檢視
ubuntu下檢視:
ubuntu下檢視
從Windows裡上傳的日誌檔案:
從Windows裡上傳的日誌
==================================從0開始折騰===================================
環境:windows server 2012 IP:172.17.154.228 產生日誌通過flume同步到hadoop伺服器上
Ubuntu 18.04 IP:172.17.154.226 部署Hadoop,做日誌伺服器
安裝java環境,這個就不寫了,配置好Java home
1. 首先在windows下安裝Flume,下載apache-flume-1.7.0-bin,解壓到本地目錄例如:F:\Software\apache-flume-1.7.0-bin,進入/conf資料夾,建立一個test.conf檔案,內容如下:

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = D:/work/logs #監聽的本地目錄

a1.sources.r1.deserializer = org.apache.flume.sink.solr.morphline.BlobDeserializer$Builder
a1.sources.r1.batchsize
= 1 # Describe the sink a1.sinks.k1.type = hdfs a1.sinks.k1.hdfs.path = hdfs://172.17.154.226:9000/flume #改成你自己的hadoop路徑 a1.sinks.k1.hdfs.fileType = DataStream a1.sinks.k1.hdfs.writeFormat = Text a1.sinks.k1.hdfs.batchSize = 1 a1.sinks.k1.hdfs.rollInterval = 0 a1.sinks.k1.hdfs.rollcount = 1 a1.sinks.k
1.hdfs.rollsize = 0 #a1.sinks.k1.hdfs.filePrefix = logFile.%Y-%m-%d #監聽的日誌名稱格式,字首 a1.sinks.k1.hdfs.fileSuffix = .log ##監聽的日誌名稱格式,字尾 a1.sinks.k1.hdfs.useLocalTimeStamp = true a1.sinks.k1.hdfs.idleTimeout = 60000 # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1

具體含義可以參考flume配置文章,我也是一知半解就不多解釋了。有一點需要注意,將”flume-env.ps1.template”改名成”flume-env.ps1”,然後確保系統有執行powershell指令碼的許可權(我的win10不能執行.ps1檔案,不知道為什麼)
2. 去github上下載winutils,裡面有若干hadoop的版本,我用的是3.0.0,下載後解壓到本地目錄,比如:“F:\Software\hadoop-3.0.0\bin”,這便是本地的hadoop home目錄,一會兒啟動flume的時候要用
3. 下載hadoop,這裡沒有3.0.0,我下的是3.0.2,這個是要安裝在ubuntu上的,先解壓出來,需要拷貝里面的*.jar包到flume的lib目錄下。假定解壓後的目錄:D:\software\hadoop-3.0.2
4. 先將share\hadoop\common資料夾下的*.jar和share\hadoop\common\lib下的所有jar檔案統統拷貝到flume的lib目錄下,可能會提示有重複的,不管它覆蓋掉(簡單 暴力 有效),否則可能後面會出現什麼java.io.之類的錯誤;繼續拷貝,將D:\software\hadoop-3.0.2\share\hadoop\hdfs下的所有jar包扔進flume的lib目錄下(對,就是 扔)
5. 暫時不管flume了,轉戰hadoop。將剛才下的hadoopxxxx.tar上傳到ubuntu下
6. 建立一個名字為hadoop的普通使用者並賦管理員許可權

$ sudo useradd -m hadoop -s /bin/bash  #建立hadoop使用者,並使用/bin/bash作為shell
$ sudo passwd hadoop                   #為hadoop使用者設定密碼,之後需要連續輸入兩次密碼
$ sudo adduser hadoop sudo             #為hadoop使用者增加管理員許可權
$ su - hadoop                          #切換當前使用者為使用者hadoop
$ sudo apt-get update                  #更新hadoop使用者的apt,方便後面的安裝
  1. 設定ssh免密登入
$ sudo apt-get install openssh-server   #安裝SSH server
$ ssh localhost                         #登陸SSH,第一次登陸輸入yes
$ exit                                  #退出登入的ssh localhost
$ cd ~/.ssh/                            #如果沒法進入該目錄,執行一次ssh localhost
$ ssh-keygen -t rsa
  1. 然後再輸入:
$ cat ./id_rsa.pub >> ./authorized_keys #加入授權
$ ssh localhost   # 成功的話,此時不需要密碼即可登入                       
  1. 安裝hadoop
$ sudo tar -zxvf  hadoop-3.0.2.tar.gz -C /usr/local    #解壓到/usr/local目錄下
$ cd /usr/local
$ sudo mv  hadoop-3.0.2    hadoop                      #重新命名為hadoop
$ sudo chown -R hadoop ./hadoop                        #修改檔案許可權
  1. 開啟/home/hadoop/.bashrc,拉到最後新增:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64  #本機java路徑
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL

執行

source ~./bashrc

使配置生效
====================配置hadoop偽分散式====================
定位到 /usr/local/hadoop/etc/hadoop/
修改core-site.xml檔案:

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/home/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://172.17.154.226:9000</value>
    </property>
</configuration>

修改配置檔案 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>

然後將改好的這兩個檔案扔到windows機器上的flume的conf資料夾下
執行 NameNode 的格式化

 ./bin/hdfs namenode -format

啟動namenode和datanode程序,並檢視啟動結果

 ./sbin/start-dfs.sh
 jps

這裡寫圖片描述
如果沒有,可以執行”start-all.sh”試試
依上圖命令,再建立一個flume目錄用於接收windows上次的日誌

hadoop fs -mkdir /flume
hadoop fs -chmod 777 /flume

檢視的話可以使用hadoop fs -ls /flume列出檔案,使用hadoop fs -cat /flume/xxxxx檢視檔案內容
如果一切正常的話,在瀏覽器中輸入:http://172.17.154.226:9870
注意:hadoop3.0以上版本的埠改成9870了,網上的好多教程用的都是50070,這個是2.x版本的
這裡寫圖片描述
在8088埠可以看到 http://172.17.154.226:8088
這裡寫圖片描述
至此,hadoop搞定了。再次回到windows下
開啟cmd並定位到flume的bin目錄下,執行以下命令

flume-ng.cmd agent --conf ..\conf --conf-file ..\conf\test.conf --name a1 -property "flume.root.logger=INFO,LOGFILE,console;flume.log.file=MyLog.log;hadoop.home.dir=F:\Software\hadoop-3.0.0\bin"

特別是最後的hadoop.home.dir就是之前解壓的winunits路徑下的bin目錄,可能還是會出現警告,什麼hadoop_home沒有設定,找不到hadoopclasspath之類的,不管它。(其實我是不知道怎麼解決)

這裡寫圖片描述
隨便建立一個檔名格式為”logFile.2018-09-14.log”的文字檔案,內容隨便,然後扔到D:\work\logs目錄下,一切順利的話,flume會自動同步檔案到hdfs裡了。開啟hadoop的dashboard,這裡寫圖片描述
裡面就是我們上傳的日誌了,只是命名格式有問題,這個後續解決。這只是演示,後續,最後是直接在程式碼級別將日誌寫進hdfs,log4j貌似可以的,但我需要的是c#。
==========================我填的坑=====================
首先,必須下載winunits,並在flume啟動的時候指定本地的hadoop路徑,不然根本就沒有後面的java錯誤,剛開始還以為自己幸運一切順利呢
然後就是各種java錯誤,實在不行就把hadoop\share\資料夾下所有jar都拷貝過來
最後,在hdfs namenode -format的時候,如果次數多了,可能會出現datanode啟動失敗的情況,刪除/usr/local/hadoop/tmp/dfs目錄下的data目錄,然後重新建立一個,再次start-dfs.sh,然後用jps檢查,確保各節點都執行起來。