大數據筆記

Linux

Linux的文件結構

  /bin  //二進制文件目錄,全部Linux版本公有的命令php

  /sbin  //二進制文件目錄java

  /dev   //device,設備目錄,光驅、磁盤、分區node

  /etc  //配置文件目錄,Environment Configmysql

  /lib  //庫文件,共享對象文件(SO--Shared Object,等價於windows dll文件)web

  /home  //主目錄,裏面有不少用戶目錄,如:/home/ubuntu,但root用戶目錄位於/root下。算法

  /mediasql

  /mntshell

  /opt數據庫

  /root  //root用戶目錄編程

  /usr   //不一樣Linux廠商的目錄

  /usr/bin  //Linux廠商的可執行文件目錄,/usr/bin/apt-get

  /usr/sbin  //Linux廠商的可執行文件目錄

  /usr/local  //用戶目錄

  /usr/local/bin   //用戶命令存放的目錄

  /usr/local/sbin  //用戶命令存放的目錄

Linux經常使用的命令

  xxx --help(或-h)  //查看幫助

  man ls  //查看ls命令的幫助

  info ls  //查看ls命令的幫助 

  help <內置命令>  //查看內置命令的幫助

  cd   //改變目錄

  ls  //列出文件

    ls -al | more  //a表示all:即列出全部.開頭文件,等價於隱藏文件;滾動屏幕查看,空格翻屏,q退出

  clear  //清屏

  whoami  //查看當前用戶

  which  //查看可執行文件的位置

  echo $PATH  //顯示文本

  pwd  //顯示當前路徑

  sudo  <command>  //以root的權限去操做 

    sudo mkdir dir1

    sudo passwd  //設置root用戶的密碼。

  su root  //切換root用戶,只有設置root用戶密碼後才能切換root用戶.

  ifconfig  //查看ip地址  至關於window中的ipconfig

  find  //find <路徑> 以樹形結構顯示該路徑全部的目錄及其子目錄,相似於windows的tree命令。

  mkdir  //建立目錄  mkdir  -p a/b  -p parent若是父目錄不存在,還遞歸建立父目錄

  rm  //刪除目錄  rm -rf a/b  -r recursive遞歸  -f force強制

  touch  //建立空文件  touch hello.txt

  echo  //echo hello,world > hello.txt  將顯示的內容覆蓋的形式寫入到hello.txt中。

      //echo hello,world >> hello.txt  將顯示的內容追加的形式寫入到hello.txt中。

  cat  //cat hello.txt  查看文件內容

  cp  //拷貝文件 -r recursive 遞歸 eg:cp b/c/d.txt ../

  mv  //移動或重命名

  head  //顯示前10行  eg:head -n 3顯示前3行

  tail  //顯示後10行

  hostname  //查看主機名 

    hostname  //顯示主機名  vi /etc/hostname 修改主機名

  reboot  //重啓

  shutdown   //關機  -P:Power off   -r:reboot  now:馬上執行

  halt  //halt -p  關機

  uname  //打印系統內核信息  uname -a

  file  //查看文件類型  file  <文件名>  eg:  file /lib/xxx.so.0.0.0  so爲共享對象文件,相似於windows dll文件。

  tar  歸檔

    類型:

      war:web archive file

      ear:enterprise archive file

      jar:java archive file

    參數:

      -c:create建立歸檔

      -f:file指定文件

      -v:verbose顯示詳細信息

      -x:extract解檔

      -z:gzip經過gzip進行過濾

      -t:查看歸檔文件

      -r:追加文件

    tar -zxvf mytar.tar.gz

  gzip  //壓縮

      -d:decompress解壓縮

      -1:faster快速壓縮

      -9:better高壓縮率

  gunzip  //解壓縮

   

  xargs  //將管道輸出的內容合併成一行數據,使用空格分隔。

      $>find . | grep txt | cp `xargs' kk  //將當前目錄下全部txt的文件複製到kk目錄下。

      ``是按命令進行輸出,如:echo `hostname`

  mount  //掛載 

      mount /dev/cdrom  /mnt/cdrom  //掛載光驅到/mnt/cdrom下  

      umount /dev/cdrom  //解除掛載

  ln  //連接

    1.硬連接:根據源文件建立一個副本,源文件內容改變,副本也改變,且和源文件佔用一樣的磁盤空間。但刪除源文件,副本卻不會刪除。如:ln hello.txt hello.txt.ln

    2.符號連接:ln -s how.txt how.txt.ln,//-s:symbolic,符號連接至關於快捷方式。

  jobs  //顯示做業

  kill  //殺死做業

     //kill %1  殺死1號做業 

  ps  //顯示進程  process show

    //-a : all  -f:full

    ps -af  //查看全部進程的完整信息

  cut  //剪切字符

    cut -c 3-6 hello.txt  //從hello.txt的第3個字符開始截取到第6個。

  fdisk  //查看磁盤包括分區

    fdisk -l /dev/sda

  df  //disk free查看磁盤使用狀況

    df -ah  //-a:all  -h:human人性化顯示

  dirname  //查看文件全部目錄

      eg:dirname /bin/cp  # /bin

  basename  //輸出文件的基本名稱(去除目錄的部分)

      eg:basename /home/ubuntu/how.txt .txt //how

      eg:basename /home/ubuntu/data  //data

  netstat -ano | grep 8088  //查看網絡鏈接信息

  $(command)

    eg:$>echo $(hostname)  //echo `hostname`

  cd -P  (P:Physical)進入物理目錄,而不是連接目錄

    $>ln -s /bin mybin

    $>cd mybin  //:mybin$

    $>cd -P mybin  //:bin$

  echo $PATH  //或echo ${PATH} 或echo "$PATH"

  export  //導入環境變量

    eg:export MYPATH=/home/ubuntu  //只在當前會話中有效,重啓後就丟失。

    eg:export MYPATH=${PATH}:/home/ubuntu  //拼接

    eg:export YOURPATH=${PATH-$MYPATH}  //若是PATH變量不存在,就取$MYPATH

   if  <命令>; then <命令>; elif <命令>;...else <命令>; fi

    eg:if rm b; then echo ok; else echo error; fi

  Linux內置變量的訪問方式

    1.$?:返回剛剛執行命令的結果,0表示成功,非0表示失敗

    2.$#:表示獲取參數的個數  eg:rm -r bin   //$# 2(含bin)

      eg:if[$# -gt 1]

    3.$n:表示取第n個參數

    4.$@:表示全部參數

    5.shift:表示向左移動參數,左邊的參數被覆蓋掉。

  命令組合

    1.a && b  //a執行成功後再執行b

    2.a || b  //a執行失敗後再執行b

    3.a ; b  //a執行後再執行b

    4.(a ;b)  //只在當前目錄下執行,不切換目錄 

 

  NetCat  //美其名日,瑞士軍刀

    1.tcp/ip:

      socket編程

        Server socket  //server,listener,port

        Socket    //connection,port

    2.nc命令

      $>nc  -l   8888  &  //開啓本機(服務器端)的套接字(ServerSocket)進程,&表示在後臺運行,-l:listener

      $>nc localhost 8888  //啓動客戶端,鏈接到服務器的端口8888

      hello,world.  //客戶端發送信息

      ^z  //ctrl+z暫停當前進程並放入後臺,變成做業(job)了。ctrl+d結束任務

      s>jobs  //查看做業,重點查看做業編號

      $>bg %1  //將編號爲1的後臺做業激活

      $>fg %1  //將編號爲1的做業切換到前臺

      傳送文件

        服務端:nc -l 1234 > readme2.txt  //重定向接收數據到文件

        客戶端:nc localhost 1234 < readme1.txt  //從定向輸入

      端口掃描

        nc ip -z port1-port2  //指定要掃描的ip和端口區間

        nc -v -w 2 s1 -z 2000-4000

          -v:詳細信息

          -w:鏈接超時

          -z:掃描端口

  文件和權限

  1.文件類型

    d:directory

    -:文件

    b:block  塊設備

    l:link  連接文件

  2.權限

    user(owner)  用戶

    group  用戶組  //Linux用戶能夠隸屬於多個組,可是有一個首要組(primary group)

    other  其餘

    all  全部  ugo

  3.控制權限

    r:read  //若是是文件,讀是指查看文件內容。對於文件夾,讀是指查看文件夾包含的資源。

    w:write  //若是是文件,寫是指修改文件內容;對於文件夾,是指建立文件或刪除文件。

    x:execute  //是指可執行文件;對於文件夾,是指是否能夠進入文件夾

    -:none

 

  chmod  //修改權限

    eg: chmod ugo+rwx hello.txt

    eg: chmod a+rw hello.txt  //給全部用戶加讀和執行權限

      ./hello.txt  加了執行權限後,若是不指定路徑,系統會在$PATH裏找。因此對於不是可執行的文件執行時,須要加路徑。如:./hello.txt

    eg: chmod -R 777 dir  //R表示遞歸,文件夾裏的文件也是777

    eg:chmod ubuntu:ubuntu /soft  //將/soft目錄的擁有權限修改成ubuntu組中的ubuntu用戶

  adduser

    eg: adduser --system --home /home/ubuntu2 --gid 1000 ubuntu2  //gid爲組編號

  useradd

    是一個底層添加用戶的命令

 

  apt

    apt-get update  //更新

    apt-get upgrade  //升級

    apt-cache search ubuntu-desktop  //搜索

    apt-get install ubuntu-desktop  .//安裝

  從本地安裝桌面

    1.取得iso文件

    2.掛載iso文件到/mnt下

      $>mount /dev/cdrom /mnt/cdrom

    3.修改/etc/apt/source.list

      deb file:/mnt/cdrom ./

    4.更新和升級軟件源

      $>apt-get update

      $>apt-get upgrade

    5.安裝

      $>apt-get install ubuntu-desktop

    6.卸載

      $>apt-get remove ubuntu-desktop

    7.dpkg  //安裝deb軟件包

      dpkg -i xxx.deb  //i:install

      dpkg --remove xxx  //卸載軟件

      dpkg-query --list

  安裝虛擬機加強工具

    1.VMware->從新安裝VMware tools

    2.自動打開光驅文件

    3.複製vmware-tools-xxx.tar.gz

    4.解壓

    5../vmware-install.pl

 

   客戶機和宿主機共享文件夾

    1.虛擬機->選項->共享文件夾

    2.進入客戶機的/mnt/hgfs查看共享的文件夾

 

  客戶機和宿主機共享剪貼板

    1.虛擬機->設置->客戶機隔離

 

  客戶機和宿主機之間支持拖放

    略

  

  虛擬機的網絡鏈接方式

    1.bridge(橋接)

      徹底模擬網絡中的真實電腦,可配IP,訪問互聯網,局域網內互訪。若是無網絡,彼此之間沒法連通。

 

    2.NAT

      Net Address Transform  網絡地址轉換

      和Host造成局域網,由Host做NAT或DNS,可訪問互聯網,局域網內的主機沒法訪問客戶機。沒有網絡時,Host和客戶機之間仍然能連通。

      Vnet8是宿主機的虛擬網卡,做NAT

    3.only host(僅主機)

      和NAT很是像,但client不能訪問外部網絡,主要出於安全角度出發。即client和host之間造成封閉的局域網絡。

 

  編輯ubuntu網絡配置文件(/etc/network/interfaces)

    $>sudo gedit interfaces

      iface eth0 inet static

      address 192.168.238.128

      netmask 255.255.255.0

      gateway 192.168.238.2

      dns-nameservers 192.168.238.2

      auto eth0

    重啓網絡服務

      $>sudo /etc/init.d/networking/restart

  for循環格式一

    eg: for a in 1 2 3 4; do echo $a > ${a}.txt;done  //產生4個新文件

    可編寫腳本文件test.sh

      $>gedit test.sh

        #! /bin/bash

        if [[ $# -lt 1]]; then echo no parameter!!!;exit;fi  //表示參數個數

        for a in "$@"; do echo $a > ${a};done  //$@表示全部參數

      $>chmod a+x test.sh  //test.sh需加執行權限

      $>./test.sh 1.txt 2.txt 3.txt   //執行時帶參數

  for循環格式二

    for(( a=1;a< 11;a=a+1));do echo $a;done

  while循環

    ((表達式1))

    while(( 表達式2));do

      命令;

      ((表達式3))

    done

    例:

      ((a=1))

      while((a<=10) ;do

        echo $a

        ((a=a+1))

      done

 

hadoop環境的搭建(ubuntu)

ubuntu桌面模式和文本模式的切換:

  1.ctrl+alt+F6  //切換文本模式

  2.ctrl+alt+F7  //切換桌面模式,也能夠運行startx進入圖形界面

ubuntu開機進入文本模式:

  1.修改/etc/default/grub文件

    #GRUB_CMDLINE_LINUX_DEFAULT="quite"  //quite爲圖形模式

    GRUB_CMDLINE_LINUX_DEFAULT="text"  //text爲文本模式

  2.運行update-grub

    $>sudo update-grub

1、配置ubuntu系統

1.修改主機名:

  $>su root  //切換root

  $>echo s100 > hostname  //重定向

  $>reboot  //重啓

2.修改IP:

  [/etc/network/interfaces]

    iface eth0 inet static  //靜態IP

    address 192.168.231.100

    netmask 255.255.255.0

    gateway 192.168.231.2

    dns-nameservers 192.168.231.2

    auto eth0

3.修改dns:

  [/etc/hosts]

    127.0.0.1  localhost

    192.168.231.100  s100

    192.168.231.101  s101

    ...   

win7修改dns:

  [c:\windows\system32\drivers\etc\hosts]

    127.0.0.1  localhost

    192.168.231.100  s100

    192.168.231.101  s101

    ...

BigData:

  數據存儲單位:

    K、M、G、T、P、E、Z、Y、N

  hadoop:

    可靠、可伸縮、分佈式計算的開源軟件。

    hadoop是分佈式計算大規模數據集框架,使用簡單數據模型,可從單個服務器擴展到幾千臺主機,每臺機器都有本地存儲和計算,不須要使用硬件來得到高可用性,類庫在應用層檢測和處理故障,所以在集羣之上得到HA(高可用,達到99.999%存活率)服務。

  分佈式:

    分佈在不一樣主機上的進程協同在一塊兒,才能構成整個應用。(也但是同一主機上的不一樣進程)

  去IOE:

    是阿里巴巴造出的概念,其本意是在阿里巴巴的體系架構中,去掉IBM的小型機,Oracle數據庫,EMC存儲設備,代之以本身在開源軟件的基礎上開發的系統。即被新型的雲計算技術所替代(雲化)。還有一層意思,是對美國產品「嚴打」,減小或者再也不購買IBM、Oracle、EMC的產品。

    IBM(服務器提供商)、Oracle(數據庫軟件提供商)、EMC(存儲設備提供商)    

  4V:

    Volumn(體量大)、Variaty(樣式多,有結構化、半結構化、非結構化的)、Velocity(數據產生的速度快)、Valueless(價值密度低)

  MapReduce:

    MR  //映射和化簡,編程模型

2、hadoop安裝 

  配置文件介紹:      

    用戶級:

      能夠在當前用戶的目錄下配置.bashrc或者.profile,配置的信息只有當前用戶可用。

      [~/.bashrc]或[~/.profile]

    全局:

      [/etc/enviroment]

  1.安裝jdk

    1)安裝(略)

      $>ln -s  /soft/jdk1.8.0_65 jdk //作個符號連接

    2)配置環境變量

      a.配置JAVA_HOME變量

        JAVA_HOME=/soft/jdk

      b.配置PATH變量

        PATH=.../soft/jdk/bin

      c.編譯 

        source <配置文件>

        如:source /etc/enviroment

      d)檢測安裝是否成功

        $>java -version

  2.安裝hadoop  

    1)安裝(略)

    2)配置環境變量

      a.配置HADOOP_HOME

        HADOOP_HOME=/soft/hadoop

      b.配置PATH

        PATH=...:/soft/hadoop/bin:/soft/hadoop/sbin

      c.編譯

        $>source /etc/enviroment

      d.檢測安裝是否成功

        $>hadoop -version

      

   hadoop包含的模塊:

    1)hadoop common

      支持其餘模塊的通用工具模塊

    2)hadoop Distributed File System(HDFS)

      分佈式文件系統,提供了 對應用程序高吞吐量訪問。

      [進程]

        NameNode  //NN

        DataNode  //DN

        SecondaryNameNode  //2NN 

    3)hadoop yarn(Yet Another Resource Negotiate)

      做業調度與集羣資源管理

      [進程]

        ResourceManager  //RM

        NodeManager  //NM

    4)hadoop mapreduce

      基於yarn系統的大數據集並行處理

 

  hadoop安裝的三種模式:

    1)Standalone/local(獨立/本地)

      用的就是本地文件系統,不須要啓動守護進程,全部的程序都運行在一個JVM中,它是默認的模式。

      hadoop fs -ls

    2)Peseudo Distributed Mode (僞分佈)配置過程

      a.修改配置文件

        [core-site.xml]

          <configuration>

            <property>

              <name>fs.defaultFS</name>

              <value>hdfs://localhost/</value>

            </property>

          </configuration>

        [hdfs-site.xml]

          <configuration>

            <property>

              <name>dfs.replication</name>

              <value>1</value>

            </property>

          </configuration> 

        [mapred-site.xml]

          <configuration>

            <property>

              <name>mapreduce.framework.name</name>

              <value>yarn</value>

           </property>

          </configuration>

        [yarn-site.xml]  

          <configuration>

            <property>

              <name>yarn.resourcemanager.hostname</name>

              <value>localhost</value>

            </property>

            <property>

              <name>yarn.nodemanager.aux-services</name>

              <value>mapreduce_shuffle</value>

            </property>

          </configuration>

        [slaves]

          localhost

      b.配置SSH免密登陸

        安裝ssh

          $>sudo apt-get install ssh

        生成密鑰對

          $>ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa  //-t rsa:指定加密算法爲rsa  -P '':指定密碼爲空  -f:指定文件

            //id_rsa.pub爲公鑰文件,id_rsa爲私鑰文件

        將公鑰內容映射追加到密鑰庫裏

          $>cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

        登陸確認

          $>ssh localhost

          ...

          $>exit  //退出登陸

         再次登陸

          $>ssh localhost  //免密

      c.格式化hdfs

        $>hadoop namenode -format

      d.啓動全部進程

        $>start-all.sh  //啓動hadoop全部進程

        $>jps  //查看進程

          //SecondaryNameNode

          //ResourceManager

          //NameNode

          //DataNode

          //NodeManager

        $>hadoop fs -mkdir -p /user/ubuntu/data  //在hdfs上建立文件夾

        $>hadoop fs -lsr /  //遞歸查看/下全部的文件

        查看hdfs的WebUI:http://localhost:50070

 

    3)Full Distributed Mode

      a.修改配置文件

        //相似於僞分佈

        [core-site.xml]

          fs.defaultFS=hdfs://s100  

        [hdfs-site.xml]

          dfs.replication=3

        [yarn-site.xml]

          yarn.resourcemanager.hostname=s100  //資源管理器節點爲s100

        [mapred-site.xml]

          mapred.framework.name=yarn

        [slaves]  //數據節點

          s101

          s102

        ...

      b.配置SSH無密登陸

        修改ubuntu的軟件源:

          [/etc/apt/source.list]

            ...

          $>apt-get update  //修改後要apt-get update更新

        安裝ssh

          $>apt-get install ssh  

          $>ps -Af | grep ssh  //查看是否有sshd服務進程

        生成密鑰對

          //略

          //如下僅供參考

            用nc將公鑰複製到其餘的機器上:  

              接收端:nc -l 8888 > id_rsa.pub.s100  //監聽8888端口,將接收到的數據重定向到id_rsa.pub.s100文件中。

              發送端:nc s101 8888 < id_rsa.pub  //將公鑰id_rsa.pub內容發送到s101的8888端口上

              接收端:cat id_rsa.pub.s100 >> authorized_keys  //將id_rsa.pub.s100的內容追加到密鑰庫文件中。

 

      scp是安全的遠程複製程序,基於ssh

      缺點:拷貝符號連接時,會轉換成文件

 

      rsync是遠程同步工具,主要用於備份和鏡像,支持連接拷貝,能夠避免複製相同的文件,

 

      編寫集羣文件分發腳本:

        [xsync]

#! /bin/bash
#判斷參數個數
pcount=$#
if (( pcount<1 )); then 
    echo no args!
fi

#得到文件名
p1=$1
fname=`basename $p1`

#得到路徑,將相對路徑轉換物理路徑
pdir=`cd -P $(dirname $p1) ; pwd`

cuser=`whoami`

for(( host=101;host<105;host=host+1 )) ;do
    echo ------------ s$host --------------
    rsync -rvl $pdir/$fname $cuser@s$host:$pdir    #r表示遞歸、v表示顯示信息、l表示包括連接
done

 

      編寫遠程調用集羣中每一臺節點執行命令:

      [xcall]

#! /bin/bash
#判斷參數個數
pcount=$#
if (( pcount<1 )); then 
    echo no args!
fi

echo -------- localhost --------
$@  #全部參數


for(( host=101;host<105;host=host+1 )) ;do
    echo -------- s$host --------
    ssh s$host $@
done

   

  hadoop默認的配置文件在jar包中的位置:

    [hadoop-common-x.x.x.jar/core-default.xml]

    [hadoop-hdfs-x.x.x.jar/hdfs-default.xml]

    [hadoop-yarn-x.x.x.jar/yarn-default.xml]

    [hadoop-mapred-client-core-x.x.x.jar/mapred-default.xml]

 

  設置集羣的SecondaryNameNode節點:

    [hdfs-site.xml]

      ...

      <property>

        <name>dfs.namenode.secondary.http-address</name>

        <value>s104:50090</value>

      </property>

      ...

    守護進程就是爲其它進程提供服務的進程

    單獨啓動進程:

      hadoop-daemon.sh start namenode   //啓動名稱節點,關閉使用start換成stop

      hadoop-daemon.sh start secondarynamenode  //啓動輔助名稱節點

      hadoop-daemons.sh start datanode  //啓動全部的數據節點

    

    hadoop經常使用的文件操做命令

      hadoop fs -<command>

      hdfs dfs -<command>  //和上面的命令同樣

      hadoop fs -help <command>  //查看put命令的幫助 

      hdfs dfs -ls -R /  //遞歸查看集羣根目錄

      hdfs dfs -put hello.txt .  //.表示集羣的當前目錄,就是/user/ubuntu/

        //put等價於copyFromLocal

hadoop環境的搭建(centos)

1)在Linux中安裝jdk,並設置環境變量
  安裝比較簡單,略
  配置環境變量:vi /etc/profile

export JAVA_HOME=/usr/local/jdk-1.8.0
export JRE_HOME=$JAVA_HOME/jre
export HADOOP_HOME=/opt/hadoop-1.2.1
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$PATH

2)下載Hadoop,並設置hadoop環境變量
  配置環境變量:vi /etc/profile 如上所示
  設置好後編譯一下:source /etc/profile
3)修改4個配置文件
  位於安裝目錄下conf目錄裏
  hadoop-env.sh

# The java implementation to use.  Required.
 export JAVA_HOME=/usr/local/jdk-1.8.0

  core-site.xml(在<configuration></configuration>裏添加)

<property>
  <name>hadoop.tmp.dir</name>
  <value>/hadoop</value>
</property>

<property>
  <name>dfs.name.dir</name>
  <value>/hadoop/name</value>
</property>

<property>
  <name>fs.default.name</name>
  <value>hdfs://imooc:9000</value>
</property>

  hdfs-site.xml

 <property>
  <name>dfs.data.dir</name>
  <value>/hadoop/data</value>
</property>

  mapred-site.xml

  <property>
  <name>mapred.job.tracker</name>
  <value>imooc:9001</value>
</property>

4)執行
hadoop namendoe -format  //格式化namenode
start-all.sh  //啓動hadoop
jps  //查看當前啓動的進程,以下所示

[root@imooc conf]# jps
3700 DataNode
3892 JobTracker
3573 NameNode
3815 SecondaryNameNode
4039 TaskTracker
4233 Jps

hadoop環境搭建完畢...

 

 

 

HDFS的基本概念

塊(block)
是一個固定大小的邏輯單元,在HDFS中,HDFS的文件被分紅塊進行存儲的
HDFS塊的默認大小是64MB
塊是文件存儲處理的邏輯單元

HDFS裏有兩類節點,一個NameNode,一個是DataNode。

NameNode
  NameNode是管理節點,存放文件元數據,元數據包括兩個部分:
  (1)文件與數據塊的映射表
  (2)數據塊與數據節點的映射表
  NameNode節點裏保存了大量的元數據,客戶查詢文件時,它會從NameNode讀取元數據,返返回結果就知道這個文件是存放在哪些節點上的,因而向這些節點去拿數據塊,而後拼裝成一個完整的文件

DataNode
  DataNode是HDFS的工做節點,存放數據塊的。

 

 

HDFS數據管理策略

 

心跳檢測:所謂心跳檢測就是NameNode和DataNode之間會有一個心跳協議。每隔幾秒DataNode會向NameNode彙報本身的狀態,是否是還處於一個active狀態,這個網絡有沒有斷,是否是關機了,或down機的狀況。那麼NameNode就會知道當前的整個機羣裏,哪些DataNode已經掛了,哪些DataNode還健康。

 

爲了保證NameNode的數據不會丟失,它同時作了一個備份,元數據會按期時行一個同步,同步到一個SecondaryNode節點上。


 
第1步客戶端會向NameNode發出一個讀取文件請求,把文件路徑告訴NameNode,NameNode查詢元數據,將元數據返回客戶端,這樣客戶端就知道這個文件包含哪些塊,以及這些塊分別在哪些DataNode裏,從這些DataNode讀取block將數據下載下來之後進行組裝。這樣讀取的過程就完成了。

 

第1步將文件拆分紅塊,固定大小64M的block,通知NameNode。第2步NameNode會找到一些可用的、當前在線的、有足夠磁盤空間的DataNode返回給客戶端。第3步根據返回的DataNode,客戶端會將數據塊進行寫入。第4步寫入第一個塊以後要進行流水線複製,經過流水線管道複製到其它的DataNode裏(包括本機架和其它的機架)。第5步更新元數據,告訴NameNode,數據塊建立已經完成,這樣能夠保證NameNode裏的元數據都是最新的狀態。這樣第一個block完成後,再開始寫第二個block...

 

HDFS的特色

一、數據冗餘,硬件容錯
用三個備份來硬件上的容錯,這樣就能夠容許運行在廉價的機器上。
二、流式的數據訪問
所謂流式訪問就是咱們的數據是一次寫入,屢次讀取。一旦寫入以後是不會被修改。除非刪除再添加
三、存儲大文件
若是是大量的小文件,NameNode的壓力會很是大,由於小文件它的元數據也是很大的,因此NameNode的負載壓力就會很大。因此它適合存儲大文件。

HDFS的適用性和侷限性
適合數據批量讀寫,吞吐量高;
不適合交互式的應用,低延遲很難知足(好比數據庫的操做就不適合)
適合一次寫入屢次讀取,順序讀寫
不支持多用戶併發寫相同文件

 

 

Job是一個做業,好比:從100g的日誌文件中找出出現次數最多的IP,一個job做業要完成的話,它須要分紅多個任務Task,而每個task又要分紅MapTask和ReduceTask。

而在整個Hadoop MapReduce體系結構中,分紅兩類節點JobTracker和TaskTracker。jobTracker是一個master管理節點,當一個job進來後,JobTracker把它放在後選隊列中,在適當的時候進行調度,選擇一個job出來,將這個job拆分紅多個map任務和reduce任務,這些任務分發給下面的TaskTracker來作,TaskTracker和HDFS的DataNode是同一組,這樣能夠保證個人計算是跟着數據走的。節點分配的任務專門計算本節點的數據,這樣能夠保證讀寫數據的開銷最小,可以最快地找到個人數據,這也是MapReduce的設計思想,用移動計算來代替移動數據。

 

因此JobTracker的角色就包括:
(1)做業調度
  做業過來的話,在後選隊列裏按着某種規則來進行調度。好比:先到先服務
(2)分配任務、監控任務執行進度
  整個任務分發下去,任務分給TaskTracker去作的時候,TaskTracker將每一個任務的進度給JobTracker一個狀態更新,如今執行到一個什麼狀態
(3)監控TaskTracker的狀態
  看看TaskTracker是否出現故障

TaskTracker的角色
(1)執行任務
(2)彙報任務狀態

 

 

 

輸入數據進行數據分片,分片以後按照必定的規則分配TaskTracker,放到TaskTracker裏,分配map任務,任務分配好了以後產生一箇中間結果,中間結果就是鍵值隊(key-value),key和value根據規則進行交換,再到reduce端進行reduce任務,Reduce端也是一些TaskTracker,只不過它是作reduce任務,運算完之後,數據結果寫回到HDFS裏面去。小結:數據是可能從HDFS來的,中間的一些結果可能會寫到本地磁盤,通過交換以後,再發reduce的TaskTracker,運算完以後寫回到HDFS裏去。任何一個任務過來都先交到JobTracker裏,JobTracker採用必定的調度策略進行分配(map任務和reduce任務),這就是MapReduce做業的執行過程。

 

MapReduce的容錯機制
所謂容錯就是容許在整個任務執行過程當中,這些TaskTracker中間可能會出現一些故障。有兩種容錯機制:
(1)重複執行
  這個出錯有多是job自己有錯,也多是硬件問題,或者是數據有問題。無論是什麼狀況,首先它要嘗試重試,就是從新執行。
(2)推測執行
  所謂推測執行就是在咱們整個任務執行過程當中須要等待全部的map端都執行完,reduce端纔會開始。若是一個TaskTracker節點特別慢,JobTracker就會發現,而後容許算的慢的節點繼續算,再找一臺TaskTracker就作一樣的事,這兩個誰先算完,就把另外一個終止掉。這樣推測執行能夠保證不會由於一兩個TaskTracker的故障致使整個任務執行效率很低。這是hadoop裏的一個容錯機制。

 

 javac編譯時指定包

javac -classpath /opt/hadoop-1.2.1/hadoop-core-1.2.1.jar:/opt/hadoop-1.2.1/lib/commons-cli-1.2.jar -d word_count_class/  WordCount.java

 

jar打包

jar -cvf wordcount.jar *.class //將當前目錄下全部的class文件打成jar包

 

將指定的文件上傳到hadoop指定的目錄下

hadoop fs -put input/* input_wordcount  //input_wordcount須要在hadoop中建立,如:
hadoop fs -mkdir input_wordcount

 

hadoop運行jar包

hadoop jar word_count_class/wordcount.jar WordCount input_wordcount output_wordcount
//WordCount是主函數,input_wordcount和output_wordcount是該函數的兩個參數,output_wordcount該文件夾若是沒有建立,hadoop會自動建立的
查看輸出目錄:hadoop fs -ls output_wordcount
查看結果文件:hadoop fs -cat output_wordcount/part-r-00000
首先咱們要打包程序,,打包完畢,咱們該如何運行
  首先顯示一個比較簡單的:
  上面命令:hadoop jar x.jar 是運行包的一種方式,完整的方式爲
  hadoop jar x.jar ×××.MainClassName inputPath outputPath
  同時解釋一下:
  x.jar爲包的名稱,包括路徑,直接寫包名稱,則爲默認路徑
  ×××.MainClassName爲運行的類名稱
  inputPath爲輸入路徑
  outputPath爲輸出路徑。

  HIVE理解

hive不是數據庫,而是一個數據倉庫,更像一個查詢工具,是一個SQL解析引擎,能把SQL語句轉換成MapReduce任務。

依靠存儲在其它關係數據庫metaStore來對hdfs結構化的數據進行管理,實現相似數據庫的功能。  

  hive 表的結構信息是存儲在傳統的關係型數據庫(metaStore)上(如: MySQL 、默認的是derby),而表的數據則是存儲在hdfs 文件中,並且數據是結構化的。

  表的結構信息(元數據meta)主要包括表的ID、表名、所屬數據庫、隸屬人等。

 計算引擎是MapReduce

適合存儲海量全量(歷史+更新)的軌跡數據,比對數據進行指的數據挖掘和分析等操做。

缺點:不具有數據庫的主鍵、索引和更新的特性、但提供了分區、塊索引和sql等特性。

總之,hive是利用mysql數據庫在hadoop上層套了一個殼,來實現對hdfs結構化數據的映射,來爲上層提供sql服務。

HBASE理解

HBASE是分佈式數據,是按列存儲的非結構化的數據庫 (noSql)

計算執行引擎是 HBASE自身提供的,底層存儲是基於hdfs的。

比較適合海量帶時間序列的數據的存儲和檢索,性能較好。

原生支持rowkey的一級索引。

 

zookeeper:zk

  保證高可靠、高可用的協同服務。集中式服務,用於配置信息、名稱服務、分佈式同步處理。

zk組件

  1.client

    向Server週期性發送信息,代表本身還活着,Server向Client響應確認消息。

  2.Server

    一個zk節點,向client提供全部服務,通知client,server是alive。

  3.ensemble

    全體,一組zk節點,須要最小值爲3.

  4.leader

    領袖,特殊的zk節點,zk集羣啓動時,推選leader.

  5.follow

    隨從,聽命於leader的指令。

 

 

 

zk的namespace的等級結構(zk data modal)

  1.駐留在內在的

  2.樹上每一個節點都是znode

  3.每一個znode都有name,並且/分割

  4.每一個znode存放的數據不能超過1M

  5.每一個節點都有stat對象

    a.version:與之關聯的數據都發生改變,版本增長

    b.acl:action control list

    c.timestamp

    d.datalength

 

zk znode節點類型

  1.持久節點

  2.臨時節點

  3.順序節點

 

Flume

  是分佈式、可靠、可用性好服務,用於收集、聚合和移動大量的日誌數據。

基於流計算(stream)的簡單靈活架構。用於在線分析。

  

  Flume是一個高可靠的,分佈式的,可配置的工具。它主要被設計爲從各類類型的web服務器拷貝流數據(日誌)到HDFS。

  

  Flume的主要應用

    假設某一電商服務器想要分析某一地區的顧客行爲。爲了這麼作,他們必須將日誌數據移到hadoop上進行分析。 Flume能夠幫咱們實現這一任務。

    Flume一般能夠將應用服務器產生的日誌數據快速地移到hdfs.

 

  Flume的優勢

    1.能夠存儲數據到任何的中央存儲(hdfs,hbase)

    2.當輸入數據的速率大於寫入存儲目的地的速度時,Flume會進行緩衝。

    3.Flume提供了上下文路由(數據流路線)。

    4.Flume的事務是基於通道(channel),使用了兩個事務模型(sender+receiver),確保消息被可靠發送。

    5.Flume是可靠的,容錯的,可伸縮的,可維護的,而且是可定製的。

  

  Flume的特色

    1.Flume能夠高效地從web 服務器收集數據到hdfs上。

    2.使用Flume,咱們能夠從多個服務器快速獲取數據到hadoop.

    3.能夠用來導入由社交網絡(twitter、facebook)、電商網站(Amozon)產生的海量事件數據。

    4.Flume支持大量的源類型(source,web服務器、netcat瑞士軍刀)和目標類型(destination)。

    5.支持多級跳躍,扇入扇出,上下文路由。

    6.支持水平伸縮。

  爲何不用put命令而用Flume

    1.同一時刻只能傳輸一個文件。

    2.使用put命令,數據必須打包才能上傳。而web服務器生成數據是持續不斷的,因此,它難以勝任。

kafka

  分佈式流計算平臺。

  發佈和訂閱數據流,相似消息系統。

  以分佈式、副本集羣的方式來存儲數據流。

  實時處理數據流。

  構建實時數據流管道,水平可伸縮、容錯、速度快。

  

 

   kafka的特色

    1.持久存儲,海量數據,TB級。

    2.高吞吐量

    3.分佈式

      支持多個server間的消息分區

    4.多客戶端支持

      多語言協同(java .net php ruby),它是一箇中間件

    

   體驗kafka

    1.啓動服務器

      a.啓動zk服務器

        $>bin/zookeeper-server-start.sh config/zookeeper.properties

      b.啓動kafka服務器

        $>kafka-server-start.sh config/server.properties

    2.建立主題

      #建立一個分區一個副本的主題

      $>kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

      $>zkcli.sh -server localhost:2181   //經過zk客戶端查看zk的數據結構

      $>kafka-topic.sh --list --zookeeper localhost:2181  //列出主題:test

    3.發送信息

      $>kafka-console-producer.sh --broker-list localhost:9092 --topic test

        helloworld

        how are you

    4.啓動消費者

      $>kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning 

        #helloworld

        #how are you

    5.建立多broker的kafka集羣

      a.建立多個server的配置文件

        $>cp server.properties server-1.properties

          [server-1.properties]

            broker.id=1

            listeners=PLAINTEXT://9093

            ...

            log.dir=/tmp/kafka-log-1

        

        $>cp server.properties server-1.properties

          [server-1.properties]

            broker.id=2

            listeners=PLAINTEXT://9094

            ...

            log.dir=/tmp/kafka-log-2

      b.啓動server

        $>kafka-server-start config/server-1.properties &

        $>kafka-server-start config/server-2.properties &

      c.建立主題

        $>kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic

        $>kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic

        $>kafka-topics.sh --describe --zookeeper localhost:2181 --topic test  #查看原有主題

      d.發送信息給主題

        $>kafka-consol-producer.sh --broker-list localhost:9092 --topic my-replicated-topic

      e.消費消息

        $>kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic

      f.容錯測試 

        1)找到server-1進程

          $>ps -Af |grep server-1

        2)殺死進程 

          $>kill pid 

        3)查看主題描述

          $>kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic

        4)啓動消費者主題消息

          $>kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic

 sqoop

  Apache Sqoop是hadoop和RDBMS之間傳遞數據的工具。

  配置Sqoop2 Server和Sqoop Client:

    Server:是全部Client的入口。

    Client:能夠安裝在任何節點上。

    安裝Sqoop Server:

      1.確保hadoop可用,且hadoop環境變量可用。

      2.配置hadoop core-site.xml文件:

        <property>

          <name>hadoop.proxyuser.sqoop2.hosts</name>

          <value>*</value>

        </property>

        <property>

          <name>hadoop.proxyuser.sqoop2.group</name>

          <value>*</value>

        </property>

      3.配置hadoop/etc/hadoop/container-executor.cfg:

        allowed.system.users=sqoop2

      4.第三方類庫(驅動程序)

        直接複製jar包到sqoop/tools/lib下

      5.配置sqoop Server配置文件:

        [sqoop/conf/sqoop_bootstrap.properties]

        [sqoop/conf/sqoop.properties]

      6.倉庫的初始化

        $bin>sqoop2-tool upgrade

        $bin>sqoop2-tool verify  //驗證初始化是否成功

      7.Server的啓動和中止

        $bin>sqoop2-server start  //端口12000

        $bin>sqoop2-server stop

    安裝Sqoop Client:

      1.啓動客戶端

        $bin>sqoop2-shell

      2.鏈接到本身的Server

        sqoop:000>set server --host localhost --port 12000 --webapp sqoop

        sqoop:000>show version --all  //驗證鏈接

      3.查看sqoop註冊的鏈接

        sqoop:000>show connector

      4.建立mysql鏈接

        sqoop:000>create link --connector generic-jdbc-connector

            Name:mysql

            Driver class:com.mysql.jdbc.Driver

            Connection string:jdbc:mysql://192.168.231.1:3306/test

            Username:root

            Password:****

            entry#protocal=tcp

         sqoop:000>show link --all; 

      5.建立hdfs鏈接

        sqoop:000>create link --connector hdfs-connector

            Name:hdfs

            URI:file:///

            Conf directory:/soft/hadoop/etc/hadoop

            entry#回車

        sqoop:000>show link --all;

      6.建立做業(job)

        sqoop:000>create job -f "mysql" -t "hdfs"

          Name:myjob

          Schema:test

          Table name:customers

          ...

         element#回車

        sqoop:000>show job  //顯示做業

      7. 啓動做業

        sqoop:000>start job --name myjob

 

    sqoop將mysql導入到hdfs

      1.import

        sqoop import --connect jdbc:mysql://192.168.231.1:3306/test \  //"\"表示續行,即一條命令多行寫。

              --driver com.mysql.jdbc.Driver \

              --username root \

              --password root \

              --table customers \  //指定要導出的表爲customers

              --target-dir /home/ubuntu/tt \  //指定導入的目錄

              --increment append \  //增量模式爲追加

              --check-column id \  //檢查id列

      2.import-all-tables

        sqoop import-all-tables --connect jdbc:mysql://192.168.231.1:3306/test \

                  --driver com.mysql.jdbc.Driver \

                  --username root \

                  --password root 

     sqoop 將hdfs導出到mysql

      sqoop export --connect jdbc:mysql://192.168.231.1:3306/test \

            --username root \

            --password root \

            --table ctmp \ #事先在mysql中建立一個臨時表,準備接受hdfs導出的數據,注意數據結構要匹配。

            --export-dir /home/ubuntu/emp_data

 

    sqoop將mysql導入hive

      sqoop import-all-tables --connect jdbc:mysql://192.168.231.1:3306/test \

                  --driver com.mysql.jdbc.Driver \

                  --username root \

                  --password root \

                  --table customers \

                  --hive-import \

                  --hive-overwrite \

                  --hive-table test

    sqoop 將mysql數據導入hbase

      sqoop import-all-tables --connect jdbc:mysql://192.168.231.1:3306/test \

                  --driver com.mysql.jdbc.Driver \

                  --username root \

                  --password root \

                  --table customers \

                  --hbase-create-table \

                  --hbase-table tt \

                  --column family cf1 \

                  --hbase-row-key id \

 pig

  相似於hive,大數據集數據分析平臺,pig有編譯器最終生成MR程序。

  pig latin:相似於sql,易於編寫,優化處理,可擴展。

  pig                      MR

  數據流語言                  數據處理過程 

  高級語言                   低級語言

  做鏈接操做很是簡單              在兩個數據集間執行鏈接操做很是困難

  對具備SQL基礎的人員來講容易使用       須要寫java程序

  屢次查詢就能夠達到,代碼量少         20倍的代碼量

  不須要編譯,轉換成MR做業            須要較長的編譯過程

 

  pig                      sql

  過程式語言                  聲明式語言

  schema(元數據,即表結構)是可選的      必須有schema

  數據模型是嵌套關係                扁平關係(flat)

  提供有限的查詢優化              有更多機會進行SQL優化

 

  pig                      hive

  使用的是pig latin(最開始是由雅虎建立)     使用是HQL,最開始是由facebook建立

  是一種數據流語言                 是一種查詢處理語言

  是一種過程式語言,適用於管道編程         是一種聲明式語言

  結構化、半結構化和非結構化          結構化

 

Storm

  是一個開源分佈式實時計算系統

  應用:實時分析,在線機器學習,持續計算,流式計算

  特色:速度快,每秒每節點百萬級別的元組。無狀態,集羣狀態和分佈式環境在zk中保存。確保每一個消息至少被消費一次。

  核心概念:

    1.tuple:元組,是一種有序的數據結構,一般是任意類型的數據,使用逗號分隔,交給Storm計算。

    2.stream:流,一系列無序的tuple。

    3.spount:水龍頭(源源不斷產生數據的地方,數據源)

    4.bolt:轉接頭,邏輯處理單元,spout數據傳給bolt,bolt處理後產生新的數據,能夠filter、aggregation(聚合)、鏈接、交互。

        接收數據處理後發送給一個或多個bolt

    5.topology:不會中止,除非主動殺死。MR是會中止 的。

    6.tasks:spout和bolt的執行過程就是task。spout和bolt均可以以多實例的方式運行(每一個運行在單獨的線程上)

    7.works:工做線程,storm在works中均衡地分發任務,監聽job,啓動和中止進程。

    8.stream grouping:控制tuple如何進行路由。

             內置4個分組策略

  storm架構

    1.節點類型

      a)Numbus(靈氣),master node。

        主要工做運行topology,分析topology,收集執行的task。將task分發到supervisor。

      b)supervisor:work node

        接收Nimbus指令,有多個work 進程,監督work進程,完成任務的執行。

      c)work process:執行的是相關的task,自己不執行,建立執行線程(executor),能夠有多個executor。

      d)executor:執行線程,由work進程孵化的一個線程,運行一個或多個task(spout/bot)

      e)task:處理數據

      f)zk:維護狀態

    

 

     

 

Python 中文分詞 jieba

CUT函數簡介
  cut(sentence, cut_all=False, HMM=True)
  返回生成器,遍歷生成器便可得到分詞的結果
  lcut(sentence)
  返回分詞列表

代碼示例:

   import jieba
  sentence = '我愛天然語言處理'
  # 建立【Tokenizer.cut 生成器】對象
  generator = jieba.cut(sentence)
  # 遍歷生成器,打印分詞結果
  words = '/'.join(generator)
  print(words)

打印結果:
我/愛/天然語言/處理

詞雲wordCloud

簡介

  詞雲圖,也叫文字雲,是對文本中出現頻率較高的「關鍵詞」予以視覺化的展示,詞雲圖過濾掉大量的低頻低質的文本信息,使得瀏覽者只要一眼掃過文本就可領略文本的主旨。

代碼示例:

#導入所需庫
from wordcloud import WordCloud
f = open(r'C:\Users\JluTIger\Desktop\texten.txt','r').read()
wordcloud = WordCloud(background_color="white",width=1000, height=860, margin=2).generate(f)

# width,height,margin能夠設置圖片屬性
# generate 能夠對所有文本進行自動分詞,可是對中文支持很差
# 能夠設置font_path參數來設置字體集
#background_color參數爲設置背景顏色,默認顏色爲黑色


import matplotlib.pyplot as plt
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
wordcloud.to_file('test.png')
# 保存圖片,可是在第三模塊的例子中 圖片大小將會按照 mask 保存

運行結果:

相關文章
相關標籤/搜索