更多資料點擊此處
1 基礎知識回顧
1.1 IO
在程序中IO流是阻塞的 , 支持隨機讀取數據 , 不支持修改數據html
1 複習 文件複製 java
2 隨機讀取數據 node
3 不能隨機寫數據mysql
/** * FileName: TestIo * Author: 多易教育-DOIT * Date: 2020/11/12 0012 * Description: 測試IO的隨機讀取數據 * 1 做業 複製文件 */ public class TestIo { public static void main(String[] args) throws Exception { // 1 獲取一個文件的輸入流 FileInputStream fis = new FileInputStream("d://word.txt"); // 輸出流沒有相似於skip的方法 不能隨機寫數據 FileOutputStream fout = new FileOutputStream(""); // 2 讀取數據 // int read1 = fis.read(); // a 97 // int read2 = fis.read(); // 98 // 跳過指定的字節 fis.skip(2L); // 2k 1024*2*1024 1k=1024byte int read3 = fis.read(); // 3 打印 // System.out.println(read1); // System.out.println(read2); System.out.println(read3); //101 } }
1.2 序列化
將內存中的對象數據存儲在磁盤上 ,或者是將對象經過網絡傳輸 ! 須要對象實現序列化 ,linux
本質:就是對象轉二進制的規則 , 反序列化 怎麼將二進制轉換成對像規則sql
java中有本身的序列化機制實現接口express
將對象持久化到磁盤 持久化 鈍化json
將磁盤上的對象數據反序列化成java對象 活化windows
1.2.1 java的序列化
/** * FileName: TestSer * Author: 多易教育-DOIT * Date: 2020/11/12 0012 * Description: * 思考 : User類能不能不直接實現序列化接口 * 可是能將數據存儲在磁盤上 : 保證存儲的數據比Serializable方式存儲的數據少 * 網絡傳輸節省資源 */ public class TestSer { public static void main(String[] args) throws Exception { // 將內存對象持久化到磁盤 // 寫出對象流 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d://user.user")); User user = new User(); user.set(1,"王奔",20000); // 在磁盤中存儲的任何數據都是二進制 oos.writeObject(user);// 110長度 1 王奔 20000 /** * java中的Serializable接口的序列化在磁盤中存儲的數據有 * 包名 類名 屬性名 數據類型 ... 方便經過反射反序列化方便 * 有不少的冗餘數據 */ oos.close(); // 將磁盤中的對象數據 反序列化成內存java對象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d://user.user")); User u = (User)ois.readObject(); System.out.println(u); }
1.2.2 將對象轉換成JSON (String)
https://mvnrepository.com/search maven倉庫下載jar包bash
/** * FileName: JsonToDisc * Author: 多易教育-DOIT * Date: 2020/11/12 0012 * Description: * 將java對象轉換成Json串 --->寫到磁盤 */ public class JsonToDisc { public static void main(String[] args) throws Exception { User user = new User(); user.set(1,"benB",20000); String str = JSON.toJSONString(user); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d://user.json")); oos.writeUTF(str); oos.close(); } }
1.2.3 直接寫屬性到磁盤(簡單的類型)
/** * FileName: FieldsToDisc * Author: 多易教育-DOIT * Date: 2020/11/12 0012 * Description: * 靈活 * 方便 * 數據小 * 注意 寫和讀的順序 */ public class FieldsToDisc { public static void main(String[] args) throws Exception { /*User user = new User(); user.set(1,"benB",20000); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d://user.f")); // 寫出屬性 oos.writeInt(user.getId()); oos.writeUTF(user.getName()); oos.writeDouble(user.getSal()); oos.close();*/ ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d://user.f")); // 讀取數據 按照寫的順序讀 Int UTF Double int id = ois.readInt(); String name = ois.readUTF(); double sal = ois.readDouble(); System.out.println(); User user = new User(); user.set(id,name,sal) ; System.out.println(user); } }
1.2.4 自定義序列化規則
1 定義一個接口 有讀寫方法
2 要序列化的java類實現接口 重寫讀寫規則(序列化規則)
3 測試使用 調用讀寫方法實現序列化和反序列化
接口
/** * FileName: Writable * Author: 多易教育-DOIT * Date: 2020/11/12 0012 * Description: 接口 * 定義兩個方法 寫 讀 * 做用 : 之後 有類要序列化 實現這個接口 * 重寫裏面的讀寫方法 (指定了序列化和反序列化的規則) */ public interface Writable { public void write(ObjectOutputStream oos) throws Exception; public void read(ObjectInputStream ois)throws Exception; }
實現類
/** * FileName: Teacher * Author: 多易教育-DOIT * Date: 2020/11/12 0012 * Description: 要進行序列化和反序列化 * 實現接口 重寫方法 */ public class Teacher implements Writable{ private int tid ; private String name ; private String gender ; private double faceValue ; public void set (int tid, String name, String gender, double faceValue) { this.tid = tid; this.name = name; this.gender = gender; this.faceValue = faceValue; } public int getTid() { return tid; } public void setTid(int tid) { this.tid = tid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public double getFaceValue() { return faceValue; } public void setFaceValue(double faceValue) { this.faceValue = faceValue; } @Override public String toString() { return "Teacher{" + "tid=" + tid + ", name='" + name + '\'' + ", gender='" + gender + '\'' + ", faceValue=" + faceValue + '}'; } /** * 序列化 * @param oos * @throws Exception */ @Override public void write(ObjectOutputStream oos) throws Exception { oos.writeInt(this.tid); oos.writeUTF(this.name); oos.writeUTF(this.gender); oos.writeDouble(this.faceValue); oos.close(); } /** * 反序列化 * @param ois * @throws Exception */ @Override public void read(ObjectInputStream ois) throws Exception { this.tid = ois.readInt(); this.name = ois.readUTF() ; this.gender = ois.readUTF() ; this.faceValue = ois.readDouble() ; ois.close(); } }
測試
/** * FileName: TestMyWrite * Author: 多易教育-DOIT * Date: 2020/11/12 0012 * Description: */ public class TestMyWrite { public static void main(String[] args) throws Exception { Teacher teacher = new Teacher(); // teacher.set(1,"wangben","M",99.99); // 寫出去 序列化 //teacher.write(new ObjectOutputStream(new FileOutputStream("d://teacher2.txt"))); // 讀回來 反序列化 teacher.read(new ObjectInputStream(new FileInputStream("d://teacher2.txt"))) ; System.out.println(teacher); } }
1.3 迭代器
在不知道數據結構和數據條數的狀況下使用
好比: 公司中有本身的數據 1#zss:23@M ,提供迭代器 hasNext -- next --> User
package com._51doit.cn.hdp.day01.iter; import java.io.BufferedReader; import java.io.FileReader; import java.util.Iterator; /** * FileName: MyIteratable * Author: 多易教育-DOIT * Date: 2020/11/12 0012 * Description: */ public class MyIteratable implements Iterator<User> { BufferedReader br; String line = null; User user = new User(); { try { br = new BufferedReader(new FileReader("d://user.txt")); } catch (Exception e) { e.printStackTrace(); } } /** * 當這個方法返回true的時候 纔會執行next方法 * * @return */ @Override public boolean hasNext() { boolean flag = false; try { line = br.readLine(); if (line != null) { flag = true; } else { flag = false; } } catch (Exception e) { e.printStackTrace(); } return flag; } @Override public User next() { // 處理每行數據 封裝結果到User中 返回 //8#fengjie:53@F String uid = line.split("#")[0]; String name = line.split("#")[1].split(":")[0]; String age = line.split("#")[1].split(":")[1].split("@")[0]; String gender = line.split("#")[1].split(":")[1].split("@")[1]; user.set(uid,name,age,gender); return user; } }
package com._51doit.cn.hdp.day01.iter; /** * FileName: User * Author: 多易教育-DOIT * Date: 2020/11/12 0012 * Description: */ public class User { private String uid ; private String name ; private String age ; private String gender ; public void set(String uid, String name, String age, String gender) { this.uid = uid; this.name = name; this.age = age; this.gender = gender; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "User{" + "uid='" + uid + '\'' + ", name='" + name + '\'' + ", age='" + age + '\'' + ", gender='" + gender + '\'' + '}'; } }
/** * FileName: Test1 * Author: 多易教育-DOIT * Date: 2020/11/12 0012 * Description: */ public class Test1 { public static void main(String[] args) { MyIteratable mi = new MyIteratable(); while(mi.hasNext()){ // 返回的數據始終是一個對象來接收的 System.out.println(mi.next()); } } }
大數據背景
hadoop簡介
hadoop是一個大數據的技術(框架)
主要大數據的問題 1) 海量數據的存儲 2) 海量的數據的運算 3)多臺機器的資源調配(存儲資源 , 運算資源)
1 海量數據的存儲 HDFS hadoop distribute filesystem
2 海量的數據的運算 MapReduce運算框架
3 運算資源調度和任務監控平臺 Yarn
4 工具包 Commons
特色
1 高容錯 高可用
2 極易擴容 集羣規模擴展 加強存儲能力和計算能力
3 廉價性
HDFS 簡介
分佈式文件系統 hadoop distribute filesystem
文件系統: 讀寫 讀取數據 上傳數據 刪除數據 建立文件夾 移動 複製..... 提供虛擬的訪問目錄 相似於百度雲盤
mysql是文件系統 關係型數據 條數據單位
linuxwindows操做系統中的文件系統
分佈式文件系統 :
將數據存儲在不一樣的機器上 ,提供數據的操做
基本功能:
HDFS安裝
1 上傳
[root@linux01 apps]# pwd
/opt/apps
2 解壓
tar -zxvf hadoop-3.1.1.tar.gz
3 配置
vi /opt/apps/hadoop-3.1.1/etc/hadoop/hadoop-env.sh
# variable is REQUIRED on ALL platforms except OS X! export JAVA_HOME=/opt/apps/jdk1.8.0_141/
vi /opt/apps/hadoop-3.1.1/etc/hadoop/hdfs-site.xml
<!-- 集羣的namenode的位置 datanode能經過這個地址註冊--> <property> <name>dfs.namenode.rpc-address</name> <value>linux01:8020</value> </property> <!-- namenode存儲元數據的位置 --> <property> <name>dfs.namenode.name.dir</name> <value>/opt/hdpdata/name</value> </property> <!-- datanode存儲數據的位置 --> <property> <name>dfs.datanode.data.dir</name> <value>/opt/hdpdata/data</value> </property> <!-- secondary namenode機器的位置--> <property> <name>dfs.namenode.secondary.http-address</name> <value>linux02:50090</value> </property>
vi /opt/apps/hadoop-3.1.1/etc/hadoop/core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://linux01:8020</value> </property>
4 分發
scp -r hadoop-3.1.1 linux02:$PWD
scp -r hadoop-3.1.1 linux03:$PWD
5 初始化(bin)
在bin目錄下執行
./hadoop namenode -format
在/opt/hdpdata/name
6 啓動(sbin)
在sbin目錄下執行
./hadoop-daemon.sh start namenode
jps 出現Namenode進程
訪問頁面 http://linux01:9870
分別在linux01 linux02 linux03 的sbin目錄下執行
./hadoop-daemon.sh start datanode
7 配置系統環境變量
vi /etc/profile
export JAVA_HOME=/opt/apps/jdk1.8.0_141 export HADOOP_HOME=/opt/apps/hadoop-3.1.1 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
8 一鍵啓停
在 etc/hadoop/workers 配置 須要啓動DataNode的機器名
linux01
linux02
linux03
在啓停腳本中聲明用戶 sbin/start-dfs.sh sbin/stop-dfs.sh
#!/usr/bin/env bash HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root
start-dfs.sh
stop-dfs.sh
HDFS客戶端
hdfs dfs -
[root@linux01 bin]# hdfs dfs Usage: hadoop fs [generic options] [-appendToFile <localsrc> ... <dst>] [-cat [-ignoreCrc] <src> ...] [-checksum <src> ...] [-chgrp [-R] GROUP PATH...] [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] [-chown [-R] [OWNER][:[GROUP]] PATH...] [-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>] [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...] [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>] [-createSnapshot <snapshotDir> [<snapshotName>]] [-deleteSnapshot <snapshotDir> <snapshotName>] [-df [-h] [<path> ...]] [-du [-s] [-h] [-v] [-x] <path> ...] [-expunge] [-find <path> ... <expression> ...] [-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-getfacl [-R] <path>] [-getfattr [-R] {-n name | -d} [-e en] <path>] [-getmerge [-nl] [-skip-empty-file] <src> <localdst>] [-head <file>] [-help [cmd ...]] [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]] [-mkdir [-p] <path> ...] [-moveFromLocal <localsrc> ... <dst>] [-moveToLocal <src> <localdst>] [-mv <src> ... <dst>] [-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>] [-renameSnapshot <snapshotDir> <oldName> <newName>] [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...] [-rmdir [--ignore-fail-on-non-empty] <dir> ...] [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]] [-setfattr {-n name [-v value] | -x name} <path>] [-setrep [-R] [-w] <rep> <path> ...] [-stat [format] <path> ...] [-tail [-f] <file>] [-test -[defsz] <path>] [-text [-ignoreCrc] <src> ...] [-touchz <path> ...] [-truncate [-w] <length> <path> ...] [-usage [cmd ...]]