windows下搭建Flume client + Ubuntu18.04 Hadoop偽分散式
經過兩天的吐血折騰終於在hadoop的介面上看見我同步的日誌檔案了,記錄一下。先來張定妝照:
dashboard裡檢視:
ubuntu下檢視:
從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,方便後面的安裝
- 設定ssh免密登入
$ sudo apt-get install openssh-server #安裝SSH server
$ ssh localhost #登陸SSH,第一次登陸輸入yes
$ exit #退出登入的ssh localhost
$ cd ~/.ssh/ #如果沒法進入該目錄,執行一次ssh localhost
$ ssh-keygen -t rsa
- 然後再輸入:
$ cat ./id_rsa.pub >> ./authorized_keys #加入授權
$ ssh localhost # 成功的話,此時不需要密碼即可登入
- 安裝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 #修改檔案許可權
- 開啟/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檢查,確保各節點都執行起來。