Day3.Hadoop學習筆記1

零、概述

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

  • 使用領域:電商推薦、論壇(精裝營銷)、交通(實時路況)、醫療、電信、金融程序員

1、引言

  • 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

2、瞭解HDFS(hadoop分佈式文件系統)

  • HDFS借鑑了GFS的數據冗餘度思想
    存在批量的硬盤;【DataNode 數據節點】
    HDFS默認冗餘度爲「3」,就是一份一樣數據保存三份;
    利用「水平復制」提高上傳效率;
    以「數據塊」做爲單位進行數據傳輸(1.x版本 64m、2.x版本 128m);
    存在一個「管理員」進行管控調度【NameNode 名稱節點】

  • hadoop的安裝模式(三種)
    本地模式(一臺)、僞分佈模式(一臺)、全分佈環境(至少三臺)

  • HDFS區別其餘分佈式文件系統:
    ①是一個高容錯性系統——高容錯性(fault-tolerant)
    ②提供高吞吐量的數據訪問——高吞吐量(high throughput)
    ③廉價機器,成本低——(low-cost)
    ④超大數據存儲——超大數據集(large data set)

3、HDFS環境搭建(僞分佈式,單機跨進程)

  1. 安裝好Linux64位後,執行操做激活ip
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)
  1. 關閉防火牆
[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
  1. 軟件需求
CentOS-6.5-x86_64-minimal.iso
jdk-8u171-linux-x64.rpm
  1. 建議,修改主機名
[root@CentOS ~]# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=CentOS
[root@CentOS ~]# reboot # 重啓虛擬機
  1. 配置主機名和ip映射關係
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通,表示正常
  1. 安裝JDK jdk-8u171-linux-x64.rpm
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 #卸載
  1. SSH 免密碼認證(本機免密碼登陸本身)
ssh-keygen -t rsa	#加密算法加密
ssh-copy-id CentOS	#第一次
  1. 安裝HDFS(解壓配置HADOOP_HOME) hadoop-2.6.0_x64.tar.gz
tar -zxf hadoop-2.6.0_x64.tar.gz -C /usr/
#配置環境變量,ps上邊已經配過

後續課程中Hbase、Hive、Spark On Yarn都須要識別系統的HADOOP_HOME

  1. 配置Hadoop的配置文件etc/hadoop目錄下*
    core-site.xml
<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

  1. 啓動HDFS
#第一次啓動,須要格式化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/

4、HDFS Shell(HDFS的shell命令)

[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 	#尾部查看 

5、JavaAPI操做HDFS

  1. Windows測試HDFS API 注意事項
  • 解壓hadoop安裝包並在Windows 配置HADOOP_HOME環境變量
  • hadoop_dll2.6.0_64bit.zip中的winutils.exehadoop.dll文件拷貝到Hadoop的bin目錄下
  • 在Win7 上配置CentOS和IP的映射關係C:\Windows\System32\drivers\etc下hosts文件追加
192.168.153.137 CentOS
  • 重啓IDEA 確保開發編輯器能夠識別 HADOOP_HOME
  1. 導入依賴
<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>
  1. 測試
  • 解決HADOOP寫權限問題?
    ①解決方案1、關閉HDFS權限檢查
    修改hdfs-site.xml重啓hdfs
<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>

②解決方案2、欺騙hadoop,讓程序認爲是root用戶在寫數據(修改java啓動虛擬機參數),以下圖
圖1

  • 代碼示例
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());
        }
    }
}
相關文章
相關標籤/搜索