您好,登錄后才能下訂單哦!
這篇文章主要介紹“Hadoop如何安裝配置”,在日常操作中,相信很多人在Hadoop如何安裝配置問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hadoop如何安裝配置”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
1)在/home/atguigu/bin目錄下創建腳本xcall.sh
vim xcall.sh
2)在腳本中編寫如下內容
#! /bin/bash #1、判斷是否輸入參數 if [ $# -lt 1 ] then echo "必須輸入至少一個參數..." exit fi #2、執行命令 for host in hadoop102 hadoop103 hadoop104 do echo "===================$host==================" ssh $host "$*" done #xcall.sh mkdir -p /xx/xx
3)修改腳本執行權限
chmod +x xcall.sh
4)啟動腳本
xcall.sh jps
安裝Hadoop
1)生產環境服務器磁盤情況
2)在hdfs-site.xml文件中配置多目錄,注意新掛載磁盤的訪問權限問題。
HDFS的DataNode節點保存數據的路徑由dfs.datanode.data.dir參數決定,其默認值為file://${hadoop.tmp.dir}/dfs/data,若服務器有多個磁盤,必須對該參數進行修改。如服務器磁盤如上圖所示,則該參數應修改為如下的值。
<property> <name>dfs.datanode.data.dir</name> <value>file:///dfs/data1,file:///hd2/dfs/data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4</value> </property>
注意:每臺服務器掛載的磁盤不一樣,所以每個節點的多目錄配置可以不一致。單獨配置即可。
總結: 1、HDFS存儲多目錄 1、好處: 1、增大存儲容量 2、提高IO、并發 2、如何實現存儲多目錄: 需要在hdfs-site.xml中配置 <property> <name>dfs.datanode.data.dir</name> <value>file://磁盤掛載點1/存儲路徑,file://磁盤掛載點2/存儲路徑</value> </property> 在真實的生產環境中,每天服務器磁盤數以及掛載點可能都不太一樣,所以該配置需要在每臺服務器上單獨配置
數據可能累積在某個或者某個datanode節點上,或者服務器有多塊磁盤的時候,數據累積在某一塊磁盤上,所以此時可能會造成某些 節點或者磁盤負載壓力會比較大,所以需要在節點以及磁盤上進行數據均衡 1、節點數據均衡 1、開啟節點數據均衡: start-balancer --threshould N N代表節點之間磁盤的利用率不能超過N% 2、停止節點數據均衡: stop-balancer 2、磁盤的數據均衡 1、生成執行計劃: hdfs diskbalancer -plan 主機名 <代表指定主機需要執行磁盤的數據均衡> 2、開啟均衡: hdfs diskbalancer -execute 主機.plan.json 3、查看均衡進度: hdfs diskbalancer -query 主機名 4、停止均衡: hdfs diskbalancer -cancel 主機.plan.json 不管是節點數據均衡還是磁盤數據均衡都需要選擇集群空閑的時候進行,因為均衡 的時候需要消耗大量的磁盤IO以及網絡IO。
hadoop本身并不支持lzo壓縮,如果想要支持lzo壓縮,需要額外操作配置。
1)將編譯好后的hadoop-lzo-0.4.20.jar 放入hadoop-3.1.3/share/hadoop/common/
[atguigu@hadoop102 common]$ pwd /opt/module/hadoop-3.1.3/share/hadoop/common [atguigu@hadoop102 common]$ ls hadoop-lzo-0.4.20.jar
2)同步hadoop-lzo-0.4.20.jar到hadoop103、hadoop104
[atguigu@hadoop102 common]$ xsync hadoop-lzo-0.4.20.jar
3)core-site.xml增加配置支持LZO壓縮
<property> <name>io.compression.codecs</name> <value> org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.DefaultCodec, org.apache.hadoop.io.compress.BZip2Codec, org.apache.hadoop.io.compress.SnappyCodec, com.hadoop.compression.lzo.LzoCodec, com.hadoop.compression.lzo.LzopCodec </value> </property> <property> <name>io.compression.codec.lzo.class</name> <value>com.hadoop.compression.lzo.LzoCodec</value> </property>
com.hadoop.compression.lzo.LzoCodec: 后續MR讀取lzo壓縮文件的時候不會切片 com.hadoop.compression.lzo.LzopCodec: 后續MR讀取lzo壓縮文件的時候會切片<前提是生成索引文件>
4)同步core-site.xml到hadoop103、hadoop104
[atguigu@hadoop102 hadoop]$ xsync core-site.xml
5)啟動及查看集群
[atguigu@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh [atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
1)創建LZO文件的索引,LZO壓縮文件的可切片特性依賴于其索引,故我們需要手動為LZO壓縮文件創建索引。若無索引,則LZO文件的切片只有一個。
hadoop jar /opt/module/hadoop/share/hadoop/common/hadoop-lzo-4.1.x.jar com.hadoop.compression.lzo.DistributedLzoIndexer 需要建索引的lzo文件名
1、HDFS吞吐量測試 ①、寫吞吐量: hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles N -size 128MB //-nrFiles個數應該設置為集群所有CPU個數-1 ②、讀吞吐量: hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -read -nrFiles N -size 128MB 測試結果: 2020-04-16 13:41:24,724 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write 2020-04-16 13:41:24,724 INFO fs.TestDFSIO: Date & time: Thu Apr 16 13:41:24 CST 2020 2020-04-16 13:41:24,724 INFO fs.TestDFSIO: Number of files: 10 2020-04-16 13:41:24,725 INFO fs.TestDFSIO: Total MBytes processed: 1280 2020-04-16 13:41:24,725 INFO fs.TestDFSIO: Throughput mb/sec: 8.88 <單個maptask寫的速率> 2020-04-16 13:41:24,725 INFO fs.TestDFSIO: Average IO rate mb/sec: 8.96 2020-04-16 13:41:24,725 INFO fs.TestDFSIO: IO rate std deviation: 0.87 2020-04-16 13:41:24,725 INFO fs.TestDFSIO: Test exec time sec: 67.61 HDFS讀/寫的吞吐量 = 單個maptask寫的速率 * nrFiles ③、刪除測試生成數據 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -clean
2、MR計算性能測試:<使用Sort程序評測MapReduce> (1)使用RandomWriter來產生隨機數,每個節點運行10個Map任務,每個Map產生大約1G大小的二進制隨機數 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar randomwriter random-data (2)執行Sort程序 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar sort random-data sorted-data (3)驗證數據是否真正排好序了 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar testmapredsort -sortInput random-data -sortOutput sorted-data
1、namenode線程池的線程數調整: 原因:namenode中有一個線程池,線程池中的線程主要用于datanode與namenode心跳以及客戶端獲取/寫入元數據的請求,所以如 果并發比較大或者datanode比較多,就可能導致線程池中線程不夠用。通常需要增大參數dfs.namenode.handler.count的默認值10 如何調整: 在hdfs-site.xml中配置: <property> <name>dfs.namenode.handler.count</name> <value>10</value> </property> 調整為多少: 20 * log(集群機器臺數) <以e為底> 2、調整nodemanager能夠使用的資源數 原因: 服務器的資源不會全部給nodemanager使用,默認提供給nodemanager使用的內存8G,在真實生產中該默認值不夠用需要進 行調整 如何調整: 在yarn-site.xml中配置: <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>1024</value> </property> 一般設置為服務器總內存的70%-80%
安裝Zookeeper
#! /bin/bash #1、判斷參數是否傳入 if [ $# -lt 1 ] then echo "必須傳入參數..." exit fi #2、根據參數執行對應的邏輯 case $1 in "start") for host in hadoop102 hadoop103 hadoop104 do echo "=======================start $host zookeeper===============" ssh $host "/opt/module/zookeeper/bin/zkServer.sh start" done ;; "stop") for host in hadoop102 hadoop103 hadoop104 do echo "=======================stop $host zookeeper===============" ssh $host "/opt/module/zookeeper/bin/zkServer.sh stop" done ;; "status") for host in hadoop102 hadoop103 hadoop104 do echo "=======================status $host zookeeper===============" ssh $host "/opt/module/zookeeper/bin/zkServer.sh status" done ;; *) echo "參數輸入錯誤..." ;; esac
zookeeper常用指令 1、創建節點: create 節點路徑 2、保存數據: set 路徑 數據 3、獲取數據: get 路徑 4、查看節點: ls 路徑 5、刪除節點: 1、刪除非空節點: deleteall 路徑 2、刪除空節點: delete 路徑
安裝Kafka
#! /bin/bash #1、判斷參數是否傳入 if [ $# -lt 1 ] then echo "必須傳入參數..." exit fi #2、根據參數匹配邏輯 case $1 in "start") for host in hadoop102 hadoop103 hadoop104 do echo "=================start $host kafka==============" ssh $host "/opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties" done ;; "stop") for host in hadoop102 hadoop103 hadoop104 do echo "=================stop $host kafka==============" ssh $host "/opt/module/kafka/bin/kafka-server-stop.sh" done ;; "status") for host in hadoop102 hadoop103 hadoop104 do echo "=================status $host kafka==============" pid=$(ssh $host "ps -ef | grep server.properties | grep -v grep") [ "$pid" ] && echo "kafka進程正常" || echo "kafka進程不存在" done ;; *) echo "參數輸入錯誤...." ;; esac
1、shell常用命令 1、topic相關 1、創建topic: bin/kafka-topics.sh --create --topic topic名稱 --bootstrap-server hadoop102:9092,hadoop103:9092 --partitions 分區數 --replication-factor 副本數 2、查看集群所有topic: bin/kafka-topics.sh --list --bootstrap-server hadoop102:9092 3、查看topic詳細信息: bin/kafka-topics.sh --describe --topic topic名稱 --bootstrap-server hadoop102:9092 4、修改topic<只能修改分區,而且只能增加分區>: bin/kafka-topics.sh --alter --topic topic名稱 --bootstrap-server hadoop102:9092 --partitions 分區數 5、刪除topic: bin/kafka-topics.sh --delete --topic topic名稱 --bootstrap-server hadoop102:9092 2、生產者相關: bin/kafka-console-producer.sh --topic topic名稱 --broker-list hadoop102:9092 3、消費者相關: 1、消費數據:bin/kafka-console-consumer.sh --topic topic名稱 --bootstrap-server hadoop102:9092 [--group 消費者id] [--from-beginning] 2、查看消費者組消費topic的進度: bin/kafka-consumer-group.sh --all-groups --all-topics --describe --bootstrap-server hadoop102:9092 4、數據相關: bin/kafka-dump-log.sh --files 待查看文件路徑 --print-data-log
1、kafka吞吐量測試: 1、讀吞吐量: bin/kafka-consumer-perf-test.sh --broker-list hadoop102:9092,hadoop103:9092,hadoop104:9092 --topic topic名稱 --messages 總共拉取多少條數據 測試結果: start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec 2019-02-19 20:29:07:566, 2019-02-19 20:29:12:170, 9.5368, 2.0714, 100010, 21722.4153 開始測試時間,測試結束數據,共消費數據9.5368MB,吞吐量2.0714MB/s,共消費100010條,平均每秒消費21722.4153條。 MB.sec就是吞吐量測試結果 2、寫吞吐量: bin/kafka-producer-perf-test.sh --record-size 指定每條數據大小 --topic topic名稱 --num-records 寫入topic數據條數 --producer-props bootstrap.servers=hadoop102:9092 --throughput 寫入的速率[-1代表不限制] 100000 records sent, 95877.277085 records/sec (9.14 MB/sec), 187.68 ms avg latency, 424.00 ms max latency, 155 ms 50th, 411 ms 95th, 423 ms 99th, 424 ms 99.9th. 9.14 MB/sec就是吞吐量測試結果
Kafka機器數量(經驗公式)=2*(峰值生產速度*副本數/100)+1 先拿到峰值生產速度,再根據設定的副本數,就能預估出需要部署Kafka的數量。 比如我們的峰值生產速度是50M/s。副本數為2。 Kafka機器數量=2*(50*2/100)+ 1=3臺
1)創建一個只有1個分區的topic 2)測試這個topic的producer吞吐量和consumer吞吐量。 3)假設他們的值分別是Tp和Tc,單位可以是MB/s。 4)然后假設總的目標吞吐量是Tt,那么分區數=Tt / min(Tp,Tc) 例如:producer吞吐量=20m/s;consumer吞吐量=50m/s,期望吞吐量100m/s; 分區數=100 / 20 =5分區 https://blog.csdn.net/weixin_42641909/article/details/89294698 分區數一般設置為:3-10個
安裝三臺Flume(日志采集:102、103,消費kafka:104)
tailDirSource,kafkaChannel
(1)在/opt/module/flume/conf目錄下創建file-flume-kafka.conf文件
[atguigu@hadoop102 conf]$ vim file-flume-kafka.conf
在文件配置如下內容
#1、定義agent、source、channel名稱 a1.sources = r1 a1.channels = c1 #2、描述source<taildir> a1.sources.r1.type = TAILDIR #指定文件組的名稱 a1.sources.r1.filegroups = f1 #指定組監控的目錄 a1.sources.r1.filegroups.f1 = /opt/module/applog/log/app.* #指定斷點續傳文件 a1.sources.r1.positionFile = /opt/module/flume/position.json #指定一個批次采集多少數據 a1.sources.r1.batchSize = 100 #3、描述lan截器 a1.sources.r1.interceptors = i1 a1.sources.r1.interceptors.i1.type = com.atguigu.interceptor.ETLInterceptor$Builder #4、描述channel a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel #指定kafka集群地址 a1.channels.c1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092 #指定數據寫入的topic名稱 a1.channels.c1.kafka.topic = applog #數據寫入kafka的時候是否以event格式寫入: true=是 false: 不是,只寫body數據 a1.channels.c1.parseAsFlumeEvent = false #5、關聯source->channel a1.sources.r1.channels = c1
@Override public Event intercept(Event event) { byte[] body = event.getBody(); String log = new String(body, StandardCharsets.UTF_8); if (JSONUtils.isJSONValidate(log)) { return event; } else { return null; } } @Override public List<Event> intercept(List<Event> list) { Iterator<Event> iterator = list.iterator(); while (iterator.hasNext()){ Event next = iterator.next(); if(intercept(next)==null){ iterator.remove(); } } return list; }
#! /bin/bash #1、判斷參數是否傳入 if [ $# -lt 1 ] then echo "必須傳入參數...." fi #2、根據參數匹配邏輯 case $1 in "start") for host in hadoop102 hadoop103 do echo "===============開啟$host服務器采集===============" ssh $host "nohup /opt/module/flume-1.9.0/bin/flume-ng agent -n a1 -c /opt/module/flume-1.9.0/conf/ -f /opt/module/flume-1.9.0/jobs/file_to_kafka.conf -Dflume.root.logger=INFO,LOGFILE >/opt/module/flume-1.9.0/logs 2>&1 &" done ;; "stop") for host in hadoop102 hadoop103 do echo "===============停止$host服務器采集===============" ssh $host "ps -ef |grep file_to_kafka.conf | grep -v grep | awk '{print \$2}'| xargs kill -9" done ;; *) echo "參數輸入錯誤..." ;; esac
kafkaSource、fileChannel/memoryChannel、hdfsSink
@Override public Event intercept(Event event) { Map<String, String> headers = event.getHeaders(); String log = new String(event.getBody(), StandardCharsets.UTF_8); JSONObject jsonObject = JSONObject.parseObject(log); String ts = jsonObject.getString("ts"); headers.put("timestamp", ts); return event; } @Override public List<Event> intercept(List<Event> list) { events.clear(); for (Event event : list) { events.add(intercept(event)); } return events; }
#1、定義agent、channel、source、sink名稱 a1.sources = r1 a1.channels = c1 a1.sinks = k1 #2、描述source a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource #指定kafka集群地址 a1.sources.r1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092 #指定從哪個topic讀取數據 a1.sources.r1.kafka.topics = applog #指定消費者組的id a1.sources.r1.kafka.consumer.group.id = g1 #指定source從kafka一個批次拉取多少條消息: batchSize<=事務容量<=channel容量 a1.sources.r1.batchSize = 100 #指定消費者組第一個消費topic的數據的時候從哪里開始消費 a1.sources.r1.kafka.consumer.auto.offset.reset = earliest #3、描述lan截器 a1.sources.r1.interceptors = i1 a1.sources.r1.interceptors.i1.type = com.atguigu.interceptor.MyTimestampInterceptor$Builder #4、描述channel a1.channels.c1.type = file #指定數據保存在本地磁盤哪個目錄 a1.channels.c1.dataDirs = /opt/module/flume/datas #指定channel內存中event的指針數據 a1.channels.c1.checkpointDir = /opt/module/flume/checkpoint #指定checkpoint的持久化的間隔時間 a1.channels.c1.checkpointInterval = 5000 #指定channel容量 a1.channels.c1.capacity = 1000000 #5、描述sink a1.sinks.k1.type = hdfs #指定數據存儲目錄 a1.sinks.k1.hdfs.path = hdfs://hadoop102:8020/applog/%Y%m%d #指定文件的前綴 a1.sinks.k1.hdfs.filePrefix = log- #指定滾動生成文件的時間間隔 a1.sinks.k1.hdfs.rollInterval = 30 #指定滾動生成文件的大小 a1.sinks.k1.hdfs.rollSize = 132120576 #指定寫入多少個event之后滾動生成新文件<一般禁用> a1.sinks.k1.hdfs.rollCount = 0 #指定sink每個批次從channel拉取多少數據 a1.sinks.k1.hdfs.batchSize = 100 #指定寫入hdfs的時候壓縮格式 #a1.sinks.k1.hdfs.codeC = lzop #指定文件寫入的是格式 SequenceFile-序列化文件, DataStream-文本文件, CompressedStream-壓縮文件 #a1.sinks.k1.hdfs.fileType = CompressedStream a1.sinks.k1.hdfs.fileType = DataStream #6、關聯source->channel->sink a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
1)在/home/atguigu/bin目錄下創建腳本f2.sh
[atguigu@hadoop102 bin]$ vim f2.sh
在腳本中填寫如下內容
#! /bin/bash case $1 in "start"){ for i in hadoop104 do echo " --------啟動 $i 消費flume-------" ssh $i "nohup /opt/module/flume/bin/flume-ng agent --conf-file /opt/module/flume/conf/kafka-flume-hdfs.conf --name a1 -Dflume.root.logger=INFO,LOGFILE >/opt/module/flume/log2.txt 2>&1 &" done };; "stop"){ for i in hadoop104 do echo " --------停止 $i 消費flume-------" ssh $i "ps -ef | grep kafka-flume-hdfs | grep -v grep |awk '{print \$2}' | xargs -n1 kill" done };; esac
2)增加腳本執行權限
[atguigu@hadoop102 bin]$ chmod u+x f2.sh
3)f2集群啟動腳本
[atguigu@hadoop102 module]$ f2.sh start
4)f2集群停止腳本
[atguigu@hadoop102 module]$ f2.sh stop
flume默認的內存最大是2000M,一般在項目中需要設置為4G左右 Xms: 啟動內存大小 Xmx: 運行時最大內存大小 Xms與Xmx在設置的時候最好設置的一樣。因為設置的不一樣,啟動時Xms內存比較小,導致很快內存不夠用,需要進行內存的擴容<在擴容 之前會進行GC>,GC會影響性能。兩者設置為一樣就不會出現內存擴容,減少GC次數
到此,關于“Hadoop如何安裝配置”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。