1、概述html
Hadoop衍生自Nutch(搜索引擎和web爬蟲),面臨的問題:海量數據存儲和計算java
Big Data大數據,談的不單單是數據量,其實包含了數據量(Volume)、時效性(Velocity)、多樣性(Variety)、可疑性(Veracity)
綜上所述,咱們能夠總結出大數據的4V特徵:
Volume 數據體量龐大 (PB級->EB級->ZB級)
Velocity 速度要求快 (數據輸入輸出的速度)
Varity 數據類型多樣 (文本|圖像|音視頻)
Veracity 數據價值密度低 (商業價值高)node
Hadoop是一個開源存儲和計算框架,HDFS大規模數據存儲服務,MapReduce實現了對海量數據的並行處理和分析。linux
使用領域:電商推薦、論壇(精裝營銷)、交通(實時路況)、醫療、電信、金融程序員
Hadoop是什麼?
一種老牌的大數據解決方案。包括以下兩部分:
HDFS(Hadoop Distribute FileSystem):hadoop分佈式文件系統。
MapReduce:並行計算框架的稱呼,源自於該計算模型的實現策略。web
Hadoop ECO System(hadoop的生態圈)算法
HDFS:分佈式存儲
MapReduce:並行計算shell
HBASE:hadoop的數據庫系統,基於HDFS之上的一款NoSQL數據庫。面向列存儲的NOSQL數據庫,使用HDFS做爲底層存儲服務
Kafka:分佈式消息隊列,解決高併發
Flume:分佈式日誌採集系統,實現對數據收集、轉移以及聚合
Hive:一款基於SQL的解析引擎,能夠將SQL翻譯成MapReduce計算,下降程序員使用門檻。一款工具,將用戶的SQL翻譯成MapReduce任務
zookeeper:分佈協調服務框架
(瞭解)
Mahout: 一個能夠擴展的及其學習以及數據挖掘庫。
Spark:一個快速的通用的計算引擎用於計算Hadoop上的數據。基於內存。數據庫
分佈式計算(拓展自學)
一、離線的大數據分析系統
(Hadoop MapReduce,Spark Core)
二、在線的實時流處理分析
(Storm,Spark Streaming,Flink)apache
HDFS借鑑了GFS的數據冗餘度思想
存在批量的硬盤;【DataNode 數據節點】
HDFS默認冗餘度爲「3」,就是一份一樣數據保存三份;
利用「水平復制」提高上傳效率;
以「數據塊」做爲單位進行數據傳輸(1.x版本 64m、2.x版本 128m);
存在一個「管理員」進行管控調度【NameNode 名稱節點】
hadoop的安裝模式(三種)
本地模式(一臺)、僞分佈模式(一臺)、全分佈環境(至少三臺)
HDFS區別其餘分佈式文件系統:
①是一個高容錯性系統——高容錯性(fault-tolerant)
②提供高吞吐量的數據訪問——高吞吐量(high throughput)
③廉價機器,成本低——(low-cost)
④超大數據存儲——超大數據集(large data set)
ifconfig -a //查看ip狀況 vi /etc/sysconfig/network-scripts/ifcfg-eth0 //進入vi編輯,多使用tab補全避免出錯 //將onboot改爲yes 保存編輯後 ifup eth0 //啓動eth0 ifconfig -a //查看ip生效否(個人inet addr是192.168.153.137)
[root@centos ~]# service iptables stop iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ] [root@centos ~]# chkconfig iptables off
CentOS-6.5-x86_64-minimal.iso jdk-8u171-linux-x64.rpm
[root@CentOS ~]# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=CentOS [root@CentOS ~]# reboot # 重啓虛擬機
vi /etc/hosts #配置主機名和IP映射關係 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.153.137 CentOS #添加這一句 ping Centos #可以ping通,表示正常
yum install -y lrzsz #安裝插件,支持彈出窗口上傳 rz #打開窗口上傳 //上傳jdk rpm -ivh jdk-8u171-linux-x64.rpm #安裝 ls /usr/ #查看下是否安裝上 vi /root/.bashrc #編輯環境變量,以下(已將下方的HADOOP的環境變量也配置了) HADOOP_HOME=/usr/hadoop-2.6.0 JAVA_HOME=/usr/java/latest PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin CLASSPATH=. export JAVA_HOME export PATH export CLASSPATH export HADOOP_HOME source /root/.bashrc #加載當前環境變量 java -version #查看下,是否配置上
若是,卸載RPM安裝的JDK
[root@CentOS ~]# rpm -qa | grep jdk #查看 jdk1.8-1.8.0_171-fcs.x86_64 [root@CentOS ~]# rpm -e jdk1.8-1.8.0_171-fcs.x86_64 #卸載
ssh-keygen -t rsa #加密算法加密 ssh-copy-id CentOS #第一次
tar -zxf hadoop-2.6.0_x64.tar.gz -C /usr/ #配置環境變量,ps上邊已經配過
後續課程中Hbase、Hive、Spark On Yarn都須要識別系統的HADOOP_HOME
<property> <name>fs.defaultFS</name> <value>hdfs://CentOS:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/hadoop-2.6.0/hadoop-${user.name}</value> </property>
參考:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/core-default.xml
hdfs-site.xml
<property> <name>dfs.replication</name> <value>1</value> </property>
參考:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
slaves
CentOS #將localhost改爲CentOS
參考:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html
#第一次啓動,須要格式化namenode,要初始化fsimage鏡像 hdfs namenode -format #指令 啓動hdfs/中止hdfs 注意:沒有空格 start-dfs.sh |stop-dfs.sh #查看 java進程 jps [root@CentOS ~]# jps 3217 Jps 2979 DataNode 3115 SecondaryNameNode 1935 NameNode
正常,能夠嘗試啓動瀏覽器:http://192.168.153.137:50070/
[root@CentOS ~]# hdfs dfs -help # 或者hadoop fs -help 查看幫助,查看命令 Usage: hadoop fs [generic options] -appendToFile #追加文件 -cat #查看文件 -chmod #修改文件rwx全新啊 -copyFromLocal #同 -put 拷貝 -copyToLocal #同 -get 拷貝 (跨平臺 Linux和HDFS之間) -rm #刪除文件 -mv #移動,剪切 -cp #拷貝(HDFS內的操做) -touchz #建立空文件 -text #查看 -tail #尾部查看
HADOOP_HOME
環境變量hadoop_dll2.6.0_64bit.zip
中的winutils.exe
、hadoop.dll
文件拷貝到Hadoop的bin目錄下C:\Windows\System32\drivers\etc
下hosts文件追加192.168.153.137 CentOS
HADOOP_HOME
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.6.0</version> </dependency>
hdfs-site.xml
重啓hdfs<property> <name>dfs.permissions.enabled</name> <value>false</value> </property>
②解決方案2、欺騙hadoop,讓程序認爲是root用戶在寫數據(修改java啓動虛擬機參數),以下圖
import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org.junit.Before; import org.junit.Test; import java.io.*; /** * Created by Turing on 2018/12/3 */ public class HDFSDemo { private FileSystem fileSystem; @Before public void before() throws IOException { Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://CentOS:9000");//core-site.xml conf.set("dfs.replication","1"); fileSystem=FileSystem.get(conf); } /** * 上傳1 * @throws IOException */ @Test public void testUpload() throws IOException { FileInputStream is = new FileInputStream("C:\\Users\\Administrator\\Desktop\\study.txt"); Path path = new Path("/hdfs_study1.txt"); OutputStream os= (OutputStream) fileSystem.create(path); IOUtils.copy(is,os); //org.apache.commons.io.IOUtils; is.close(); os.close(); } /** * 下載1 * @throws IOException */ @Test public void testDownload() throws IOException { OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\study222.txt"); Path path = new Path("/hdfs_study1.txt"); InputStream is= (InputStream) fileSystem.open(path); org.apache.hadoop.io.IOUtils.copyBytes(is,os,1024,true); } /** * 上傳2 */ @Test public void testUpload02() throws IOException { Path src=new Path("C:\\Users\\Administrator\\Desktop\\study222.txt"); Path dst = new Path("/hdfs_study333.txt"); fileSystem.copyFromLocalFile(src,dst); } /** * 下載2 * @throws IOException */ @Test public void testDownLoad02() throws IOException { Path dst=new Path("C:\\Users\\Administrator\\Desktop\\study333.txt"); Path src = new Path("/hdfs_study1.txt"); //若是出錯了,嘗試使用重載方法 //fileSystem.copyToLocalFile(src,dst); fileSystem.copyToLocalFile(false,src,dst,true); } /** * 刪除 * @throws IOException */ @Test public void testDelete() throws IOException { Path src = new Path("/aa1.csv"); //第二個參數 boolean recursive 是否遞歸刪除 fileSystem.delete(src,true); } /** * 建立文件夾 * @throws IOException */ @Test public void testMkdir() throws IOException { Path src = new Path("/day1/study4"); fileSystem.mkdirs(src); } /** * 遞歸遍歷文件(只文件) * @throws IOException */ @Test public void testListFiles() throws IOException { Path src = new Path("/"); RemoteIterator<LocatedFileStatus> files = fileSystem.listFiles(src, true); while (files.hasNext()){ LocatedFileStatus file = files.next(); System.out.println(file.getPath()+" "+file.isDirectory()); } } /** * 遍歷根下文件 * @throws IOException */ @Test public void testListFileStatus() throws IOException { Path src = new Path("/"); FileStatus[] fileStatuses = fileSystem.listStatus(src); for (FileStatus fileStatus : fileStatuses) { System.out.println(fileStatus.getPath()+" "+fileStatus.isDirectory()); } } }