大數據入門之Hadoop基礎學習
前言
目前人工智能和大數據火熱,使用的場景也越來越廣,日常開發中前端同學也逐漸接觸了更多與大數據相關的開發需求。因此對大數據知識也有必要進行一些學習理解
基礎概念
大數據的本質
一、數據的存儲:分布式文件系統(分布式存儲)
二、數據的計算:分部署計算
基礎知識
學習大數據需要具備Java知識基礎及Linux知識基礎
學習路線
(1)Java基礎和Linux基礎
(2)Hadoop的學習:體系結構、原理、編程
***階段:HDFS、MapReduce、HBase(NoSQL數據庫)
第二階段:數據分析引擎 -> Hive、Pig
- 數據采集引擎 -> Sqoop、Flume
第三階段:HUE:Web管理工具
- ZooKeeper:實現Hadoop的HA
- Oozie:工作流引擎
(3)Spark的學習
- ***階段:Scala編程語言
- 第二階段:Spark Core -> 基于內存、數據的計算
- 第三階段:Spark SQL -> 類似于mysql 的sql語句
- 第四階段:Spark Streaming ->進行流式計算:比如:自來水廠
(4)Apache Storm 類似:Spark Streaming ->進行流式計算
NoSQL:Redis基于內存的數據庫
HDFS
分布式文件系統 解決以下問題:
- 硬盤不夠大:多幾塊硬盤,理論上可以***大
- 數據不夠安全:冗余度,hdfs默認冗余為3 ,用水平復制提高效率,傳輸按照數據庫為單位:Hadoop1.x 64M,Hadoop2.x 128M
管理員:NameNode 硬盤:DataNode
- 
MapReduce
基礎編程模型:把一個大任務拆分成小任務,再進行匯總
- MR任務:Job = Map + Reduce
Map的輸出是Reduce的輸入、MR的輸入和輸出都是在HDFS
MapReduce數據流程分析:
- Map的輸出是Reduce的輸入,Reduce的輸入是Map的集合
HBase
什么是BigTable?: 把所有的數據保存到一張表中,采用冗余 ---> 好處:提高效率
- 因為有了bigtable的思想:NoSQL:HBase數據庫
- HBase基于Hadoop的HDFS的
- 描述HBase的表結構
核心思想是:利用空間換效率
Hadoop環境搭建
環境準備
Linux環境、JDK、http://mirrors.shu.edu.cn/apache/hadoop/common/hadoop-3.0.0/hadoop-3.0.0-src.tar.gz
安裝
1、安裝jdk、并配置環境變量
- vim /etc/profile 末尾添加
- 
2、解壓hadoop-3.0.0.tar.gz、并配置環境變量
- tar -zxvf hadoop-3.0.0.tar.gz -C /usr/local/
- mv hadoop-3.0.0/ hadoop
vim /etc/profile 末尾添加
配置
Hadoop有三種安裝模式:
本地模式 :
- 1臺主機
- 不具備HDFS,只能測試MapReduce程序
偽分布模式:
- 1臺主機
- 具備Hadoop的所有功能,在單機上模擬一個分布式的環境
- (1)HDFS:主:NameNode,數據節點:DataNode
- (2)Yarn:容器,運行MapReduce程序
- 主節點:ResourceManager
- 從節點:NodeManager
全分布模式:
- 至少3臺
我們以偽分布模式為例配置:
修改hdfs-site.xml:冗余度1、權限檢查false
- <!--配置冗余度為1-->
- <property>
- <name>dfs.replication</name>
- <value>1</value>
- </property>
- <!--配置權限檢查為false-->
- <property>
- <name>dfs.permissions</name>
- <value>false</value>
- </property>
修改core-site.xml
- <!--配置HDFS的NameNode-->
- <property>
- <name>fs.defaultFS</name>
- <value>hdfs://192.168.56.102:9000</value>
- </property>
- <!--配置DataNode保存數據的位置-->
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/usr/local/hadoop/tmp</value>
- </property>
修改mapred-site.xml
- <!--配置MR運行的框架-->
- <property>
- <name>mapreduce.framework.name</name>
- <value>yar</value>
- </property>
- <property>
- <name>yarn.app.mapreduce.am.env</name>
- <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
- </property>
- <property>
- <name>mapreduce.map.env</name>
- <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
- </property>
- <property>
- <name>mapreduce.reduce.env</name>
- <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
- </property>
- <property>
- <name>mapreduce.application.classpath</name>
- <value>
- /usr/local/hadoop/etc/hadoop,
- /usr/local/hadoop/share/hadoop/common/*,
- /usr/local/hadoop/share/hadoop/common/lib/*,
- /usr/local/hadoop/share/hadoop/hdfs/*,
- /usr/local/hadoop/share/hadoop/hdfs/lib/*,
- /usr/local/hadoop/share/hadoop/mapreduce/*,
- /usr/local/hadoop/share/hadoop/mapreduce/lib/*,
- /usr/local/hadoop/share/hadoop/yarn/*,
- /usr/local/hadoop/share/hadoop/yarn/lib/*,
- </value>
- </property>
修改yarn-site.xml
- <!--配置ResourceManager地址-->
- <property>
- <name>yarn.resourcemanager.hostname</name>
- <value>192.168.56.102</value>
- </property>
- <!--配置NodeManager執行任務的方式-->
- <property>
- <name>yarn.nodemanager.aux-service</name>
- <value>mapreduce_shuffle</value>
- </property>
格式化NameNode
- hdfs namenode -format
看到common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted表示格式化成功
啟動
- start-all.sh
(*)HDFS:存儲數據
(*)YARN:
訪問
- (*)命令行
- (*)Java Api
- (*)WEB Console
HDFS: http://192.168.56.102:50070
Yarn: http://192.168.56.102:8088
查看HDFS管理界面和yarn資源管理系統
基本操作:
HDFS相關命令
- -mkdir 在HDFD創建目錄 hdfs dfs -mkdir /data
- -ls 查看目錄 hdfs dfs -ls
- -ls -R 查看目錄與子目錄 hdfs dfs -ls -R
- -put 上傳一個文件 hdfs dfs -put data.txt /data/input
- -copyFromLocal 上傳一個文件 與-put一樣
- -moveFromLocal 上傳一個文件并刪除本地文件
- -copyToLocal 下載文件 hdfs dfs -copyTolocal /data/input/data.txt
- -put 下載文件 hdfs dfs -put/data/input/data.txt
- -rm 刪除文件 hdfs dfs -rm
- -getmerge 將目錄所有文件先合并再下載
- -cp 拷貝
- -mv 移動
- -count 統計目錄下的文件個數
- -text、-cat 查看文件
- -balancer 平衡操作
MapReduce示例
結果:
如上 一個最簡單的MapReduce示例就執行成功了
思考
Hadoop是基于Java語言的,前端日常開發是用的PHP,在使用、查找錯誤時還是蠻吃力的。工作之余還是需要多補充點其它語言的相關知識,編程語言是我們開發、學習的工具,而不應成為限制我們技術成長的瓶頸