#########ubuntu18.04 lts############
#########hadoop3.2.0################
#########jdk1.8.0_11################
客户机桌面模式和文本模式切换

1.ctrl+alt+f6   //文本模式
2.ctrl+alt+f7   //桌面模式

开机进入文本模式

1.修改/etc/default/grub文件
    [/etc/default/grub]
    ...
    #图形模式
    GRUB_CMDLINE_LINUX_DEFAULT="quiet"
    #文本模式
    GRUB_CMDLINE_LINUX_DEFAULT="text"
    ...
    #修改文本模式的分辨率(一般不推荐修改)
    GRUB_GFXMODE=640x480
    ...
2.运行update-grub更新启动项
    $>sudo update-grub文件
3.手动启动
    $>startx

客户机环境处理

1.ip        :100-104
2.主机名       s100 s101 s102 s103 s104
3.用户 fgq 密码 123456

修改主机名

步骤:1.终端中hostnamectl查看主机名
	  2.修改主机名为s100 sudo hostnamectl set-hostname s100
	  3.vim或者nano编辑/etc/hosts文件将旧主机名改为新的主机名  
*使用nano编辑文件后 保存ctrl+o 退出ctrl+x

修改dns解析

[/etc/hosts]
120.0.0.1   localhost
192.168.146.100 s100  
192.168.146.101 s101
192.168.146.102 s102
192.168.146.103 s103
192.168.146.104 s104

Hadoop

1.Apache、google等技术标准公司
2.可靠、可伸缩、分布式计算的开源框架
3.去IOE(去昂贵存储设备)
    IBM+Oracle+EMC(网络存储设备)
4.MapReduce
    MR       映射 编程模型
    Reduce   化简

Hadoop的安装

1.安装jdk
    a.复制jdk-xx.tar.gz 到 ~/Downloads
    b.tar开
        tar -xzvf file.tar.gz //解压tar.gz
            -c:C reate存档。
            -z:压缩zip存档。
            -v:在终端显示进度的同时创建归档,也被称为“V erbose”模式。 在V总是在这些命令可选的,但它是有帮助的。
            -f:允许你指定存档的Filename。
    c.移动到/soft(自己创建一个soft文件夹 权限给到普通用户,尽量避开root用户下安装软件) cp -r hadoop-3.2.0 ~/soft
        [创建符号链接] 在安装目录下创建符号链接 目的是为了在配置系统环境变量时 好写
        $>ln -s /soft/jdk-xx jdk  (删除符号rm -rf symbolic_name)
    d.配置环境变量
        第一种方式[/etc/environment]
                    JAVA_HOME=/soft/jdk
                    PATH="...:/soft/jdk/bin"
        第二种方式[~/.bashrc]
            (1)sudo gedit ~/.bashrc
            (2)在文件末尾添加以下几行代码
                # added by java jdk1.8.0
                export JAVA_HOME=/home/fgq/jdk
                export JRE_HOME=${JAVA_HOME}/jre
                export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
                # added by hadoop hadoop-3.2.0
                export HADOOP_HOME=/home/fgq/hadoop
                export PATH=${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
            然后保存文件
            (3)使配置文件生效
                source ~/.bashrc    //当前shell生效 要想全部shell有效得重启机器
            (4)验证jdk hadoop是否安装成功
                java -version
                javac -version
                hadoop version
    e.检查安装是否成功
        $>cd ~
        $>java -version
    *如果不成功 则重新启动
2.安装Hadoop  参看jdk的安装配置
    a.复制并tar开hadoop.tar.gz
    b.
    c.
    d.
    e.
    r.验证是否安装成功
        $>Hadoop version

大数据 4V 解决大数据的存储和计算 最广泛的应用就是做到了精准营销 推荐系统

1.volumn    量大
2.variaty   样式多
3.velocity  速度快
4.valueless 价值密度低

学习推荐

[o REILLY]出版社出版的一系列书籍
    Hadoop....
    Learning.Spark....
    看英文版的内容
    1.O'REILLY 出版社的大数据书籍
    2.看技术书籍最好还是看英文版 结合 百度翻译(google翻译)
    《hadoop 权威指南3》 《hadoop架构分析》
官方api apache官网

hadoop 包含四个模块=>hadoop架构分析 hdfs架构分析 yarn架构分析 mapreduce计算分析

1.Hadoop Common
    支持其他模块的工具模块
2.Hadoop Distributed File System(HDFS)
    分布式文件系统,提供了对应程序数据的高吞吐量访问
    [包含三个进程]
    NameNode            //名称节点  --NN
    DataNode            //数据节点  --DN
    SecondaryNameNode   //辅助名称节点 --2NN
3.Hadoop YARN
    作业调度与集群资源管理的框架
    [包含两个进程]
    ResourceMananger        //资源管理器--RM
    NodeManager             //节点管理器--NM
4.Hadoop MapReduce
    基于YARN系统的对大数据集进行并行处理技术

配置Hadoop(集群配置模式有三种) =>独立模式 伪分布式 完全分布式 ssh原理

1.Standalone/local
    独立/本地模式,使用的本地文件系统
    nothing!!!什么都不需要干,不需要启动单独的hadoop进程,使用的就是本地系统,无守护进程在运行
    查看文件系统的方式:
        $hadoop fs -ls
    没有启动任何java进程
    用于测试和开发环境
2.Pseudodistributed mode
    伪分布式
    [配置过程]
    a.进入${HADOOP_HOME}/etc/hadoop目录
    b.编辑core-site.xml
        <?xml version="1.0"?>
        <configuration>
            <property>
                <name>fs.defaultFS</name>
                <value>hdfs://localhost/</value>
            </property>
        </configuration>
    c.编辑hdfs-site.xml
        <?xml version="1.0"?>
        <configuration>
            <property>
                <name>dfs.replication</name>
                <value>1</value>
            </property>
        </configuration>
    d.编辑mapred-site.xml
        注意:cp mapred-site.xml.template mapred-site.xml(如果没有mapred-site.xml的话才有此步骤)
        <?xml version="1.0"?>
        <configuration>
            <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
            </property>
        </configuration>
    e.编辑yarn-site.xml
        <?xml version="1.0"?>
        <configuration>
            <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>localhost</value>
            </property>
            <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
            </property>
        </configuration>
    f.配置SSH(Secure Shell)
        安全登录
        1.安装ssh
            $>sudo apt install ssh  
            (查看是否启动了sshd服务 $>ps -Af|grep ssh)
        2.生成秘钥对
            $>ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
            $>cd ~/.ssh         //查看生成的公钥私钥
        3.导入公钥数据到授权文件(库)中
            $>cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
        4.登录到localhost
            $>ssh localhost
            $>...yes    //第一次需要询问
            $>exit
            $>ssh localhost //第二次不需要密码
        5.格式化hdfs文件系统
            $>hadoop namenode -format   //只一次需要格式化,不需要每次都格式化
        6.启动所有进程(在hadoop/sbin目录中有这个start-all.sh文件)
            $>start-all.sh
            *也许会报错 Hadoop初次启动时 进程启动失败 提示JAVA_HOME is not set and could not be found
                解决办法: 
                    在Hadoop 安装目录修改配置文件 "/usr/local/hadoop/etc/hadoop" 
                    修改里面的hadoop-env.sh
                    sudo vim hadoop-env.sh
                    找到 "export JAVA_HOME=${JAVA_HOME}" 
                    修改为Java安装路径的具体地址 
                    如我的 "export JAVA_HOME=/usr/lib/jvm/default-java" (如果你的java路径不是这里  则修改为你的Java安装目录 )
                    再次启动Hadoop 即可成功

        7.查看有关java的进程(查看有关xxx的所有进程 ps -Af|grep xxx) 成功的话会有五个进程 RM NM NN DN 2NN
            $>jps
        8.查看文件系统
            $>hadoop fs -ls
        9.创建文件系统
            $>hadoop fs -mkdir -p /user/fgq/data
            $>hadoop fs -ls -R /        //递归查看文件系统目录
            $>hadoop fs -put  <local file>  <hdfs file>  //hadoop放入文件命令
3.Fully distributed mode
    完全分布式
    1.准备五台机器
        a.分别实现ssh安装
        b.mkdir .ssh  (查看当前目录下文件列表 $>ls -al  //查看跟目录下文件列表$>ls -al /)
        a.以及实现s100 免密码登录其他四台机器(建议普通用户和root用户都做ssh免密码登录)
          s100作为NN节点 s101:DN-1 s102:DN-2 s103:DN-3 s104:2NN
          只需s100上生成公钥私钥即可,其他接收公钥切授权即可
            1.s100上 生成秘钥对 $>ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
            2.s100上 拷贝公钥给其他四台机器并授权
                2.1 fgq@s100:~/.ssh$>scp -r authorized_keys fgq@s101:~/.ssh/  //普通用户
                2.2 fgq@s100:~$>su root                             //切换用户root
                    root@s100:~$>scp authorized_keys root@s101:/root/.ssh
                (或在其他机器上 复制s100的公钥到本机器的.ssh目录中
                    fgq@s101:~$>scp fgq@s100:~/.ssh/authorized_keys ~/.ssh/   普通用户
                    root@s101:~$>scp root@s100:/root/.ssh/authorized_keys /root/.ssh/
                )
				**ubuntu18.04 root 用户做ssh配置时候要注意
				    1. 查看ssh服务器是否安装并启动
					  #sudo ps -e | grep ssh
					1. 安装ssh服务器
					#sudo apt-get install openssh-server
					2. 配置sshd文件
					#sudo vi /etc/ssh/sshd_config
					 	PermitRootLogin yes (默认为#PermitRootLogin prohibit-password)
					 或
					 	UsePrivilegeSeparation no
						PermitRootLogin yes
						PasswordAuthentication yes
					3. 重启服务器 service ssh restart
    2.搭建好s100这一台机器的jdk hadoop以及环境变量配置
    3.在s100上ssh免密码登录s101创建同样的软件安装文件夹目录 
        $>sudo mkdir soft   //查看文件路径 whereis 文件(夹)名
        $>sudo chown -R fgq:fgq soft    //由root拥有者改变文件夹的拥有者为fgq  (递归删除文件夹 sudo rm -rf soft)
    4.fgq@s100:~$>rsync -rvl soft/* fgq@s101:soft  //复制jdk hadoop等软件 (-rvl r递归拷贝 v可以看到复制过程 l 就是支持符号连接拷贝)
    5.fgq@s100:~$>rsync .bashrc fgq@s101:~  //复制.bashrc等环境配置文件  如果拷贝root权限的文件(/etc/environment)则是rsync /etc/environment root@s101:/etc/
    6.fgq@s101:~$>source ~/.bashrc  //配置立即生效
    7.其他几台机器重复2-6步
        (以上步骤在机器少时可以使用 但是机器多时显得不够自动化 所以 有了自定义脚本 参看 #自定义脚本xsync 设置)
    #开始借助 xcall xsync 脚本文件进行hadoop集群搭建
    9.配置文件  NN和RM 2NN节点在同一个节点s100上 s101:DN NM  s102:DN NM s103:DN NM 
        在伪分布式基础上进行修改
            a.[/soft/hadoop/etc/hadoop/core-site.xml]  
                fs.defaultFS=hdfs://s100/   //也可以写端口默认8020  NM节点机器配置
            b.[/soft/hadoop/etc/hadoop/hdfs-site.xml]  //数据副本数量配置
                replication=3
            c.[/soft/hadoop/etc/hadoop/yarn-site.xml]  //资源管理RM节点机器配置
                yarn.resourcemanager.hostname=s100
            d.[/soft/hadoop/etc/hadoop/workers] //hadoop3.x 版本之前是  /soft/hadoop/etc/hadoop/slaves 数据节点(数据副本 3台副本DN节点机器)
                s101
                s102
                s103
    10.在集群上分发以上三个文件
        fgq@s100:~$> cd soft/hadoop/etc/hadoop
        fgq@s100:~soft/hadoop/etc/hadoop$> xsync core-site.xml
        fgq@s100:~soft/hadoop/etc/hadoop$> xsync hdfs-site.xml
        fgq@s100:~soft/hadoop/etc/hadoop$> xsync yarn-site.xml
        fgq@s100:~soft/hadoop/etc/hadoop$> xsync workers
    11.停止一切hadoop服务
        fgq@s100:~$>stop-all.sh
    12.重新格式化系统
        fgq@s100:~$>hadoop namenode -format
    13.启动所有进程
        fgq@s100:~$>start-all.sh
    14.借助自定义的脚本xcall再次查对进程
        fgq@s100:~$>xcall jps
    15.webui 查看hadoop集群服务  localhost:9870(s100:9870)
    16.可以创建文件系统 放置文件
        fgq@s100:~$>hadoop fs -mkdir -p /user/fgq/data //创建文件库
        fgq@s100:~$>echo helloWord > hello.txt        //创建一个文件
        fgq@s100:~$>hadoop fs -put hello.txt /user/fgq/data    //放置文件到hadoop文件库中
    17.webui 查看hadoop集群服务的文件库(Utilites)

自定义脚本xsync 在集群上实现自动化分发内容(文件)到其他机器

用到的相关命令
    fgq@s100:~$> cd /usr/local/bin/     //制造商的命令执行(文件存放)目录 放置自己自定义的脚本命令文件
    fgq@s100:~/usr/local/bin$> touch xsync   //新建文件xsync
    fgq@s100:~/usr/local/bin$> sudo nano xsync       //编辑文件xsync
    fgq@s100:~/usr/local/bin$> chmod a+x xsync  //修改权限 使得所以人都可以执行
    fgq@s100:~/usr/local/bin$> echo hello world > hello.txt  //写入或输出hello world 到hello.txt(如果没有hello.txt 会自动创建)
    fgq@s100:~/usr/local/bin$> cat hello.txt  //查看文件
    dirname hello.txt  //取得文件或文件夹上级目录
    basename /soft/jdk  //取得文件名jdk
    echo  xxx           //输出后面带的命令执行结果
#实例 编写xsync文件内容如下 实现在s100上循环复制文件到所有节点的相同目录下:
    [/usr/local/bin/xsync]
    #!/bin/bash 
    pcount=$#;                  //参数个数
    if (( pcount<1 )) ; then
        echo no args;
        exit ;
    fi 

    #
    p1=$1       //获取第一个参数
    fname=`basename $p1`

    #获得上级目录的绝对路径
    pdir=`cd -P $(dirname $p1) ; pwd`
    echo $pdir

    cuser=`whoami`      //获取当前用户

    #循环
    for (( host=101 ; host<105 ; host=host+1 )) ; do 
        echo ------------s$host--------------
        rsync -rvl $pdir/$fname $cuser@s$host:$pdir
    done 
#执行实例
    xsync hello.txt   //xsync是上文中自定义的可执行文件 hello.txt待分发文件

自定义脚本xcall(在/usr/local/bin/下创建xcall文件 参看 #自定义脚本xsync) 实现在所有主机上执行相同的命令 基于ssh

实例
    #!/bin/bash 
    pcount=$#;
    if (( pcount<1 )) ; then
        echo no args;
        exit ;
    fi

    #循环
    for (( host=101 ; host<105 ; host=host+1 )) ; do 
        echo ------------s$host--------------
        ssh s$host $@       //$@ 表示在本机登录进行操作(例如 fgq@s100:~$>ssh @s101 ls -al)
    done 
执行
    xcall rm file  // xcall为/usr/local/bin/下创建的xcall可执行脚本文件

scp

安全远程文件复制程序,基于ssh
符号连接编程会转变成文件(比如上面的jdk、hadoop符号连接)

rsync 解决scp符号连接复制后编程文件的问题

远程同步工具,主要用于备份和镜像
支持连接、设备等等
速度快、避免复制相同文件的数据内容

nc在两台client之间传递文件

s100机器ssh免密码登录s101机器的做法
    1.s100机器上生成公钥私钥,s101机器生成公钥私钥 (ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa)
    2.将s100的公钥发给s101,然后s101上加上授权key就可以
        采用nc的方式(nc 俗称瑞士军刀)
            a.在s101机器上进到~/.ssh目录
                $>nc -l 8888 > id_rsa.pub.s100
            b.在s100机器上进到~/.ssh目录
                $>nc s101 8888 < id_rsa.pub
            c.在s101机器上进到~/.ssh目录
                $>ls    //可以看到s100的公钥id_rsa.pub.s100已经传递给了s101
            d.在s101机器上进到~/.ssh目录
                进行授权key操作
                    $>cat id_rsa.pub.s100 >> authorized_keys
                    $>cat authorized_keys       //可以看到s100的授权信息放到了里面

hadoop进程处理

1.查看hadoop进程个数(5)
    $>jps
        NN
        DN
        2NN
        RM
        NM
2.如果进程数不对,杀死所有进程
    $>stop-all.sh
3.重新格式化系统
    $>hadoop namenode -format
4.启动所有进程
    $>start-all.sh
5.jps 再次查对进程

使用webui访问hadoop3.2.0 hdfs

查看网络端口
    $>netstat -ano | more

1.name node
    http://localhost:9870
2.data node
    http://localhost:9866
3.2nn
    http://localhost:9868

4.All Applications
    mapreduce job 
    http://s100:8088

使用webui访问hadoop2.7.0 hdfs

1.name node
    http://localhost:50070
2....
3....

hadoop类库和配置文件抽取-2nn的配置

1.解压缩hadoop-3.2.0.tar.gz到一个目录下(在windows系统下)
2.整理jar包
    2.1 解压后的hadoop-3.2.0文件夹下创建_lib、_source、_test、_config文件夹
    2.2 hadoop-3.2.0中share文件夹下进行整体搜索jar(然后进行ctrl+a ctrl+c)复制到_lib目录下
    2.3 在_lib下进行source.jar搜索(然后进行ctrl+a ctrl+x)将hadoop源码和测试源码的jar包放到_source
    2.4 在_lib下进行test.jar搜索(然后进行ctrl+a ctrl+x)将测试jar包放到_test
3.抽取所有配置文件(在_lib目录下找)放到_config目录中
    [core-default.xml]
    hadoop-common-3.2.0.jar/core-default.xml
    [hdfs-default.xml]
    hadoop-hdfs-3.2.0.jar/hdfs-default.xml
    [yarn-default.xml]
    hadoop-yarn-3.2.0.jar/yarn-default.xml
    [mapred-default.xml]
    hadoop-mapreduce-client-core-3.2.0.jar/mapred-default.xml

4.配置2nn
    4.1 在_config目录中使用Editplus搜索功能找寻<name>dfs.namemode.secondary.http-address</name>
    4.2 hdfs-default.xml文件中好到2nn的配置相关内容 
        <property>
            <name>dfs.namemode.secondary.http-address</name>
            <value>0.0.0.0:9868</value>
        </property>
        进行2nn的配置修改
        <property>
            <name>dfs.namemode.secondary.http-address</name>
            <value>s104:9868</value>
        </property>
        将修改的property配置内容在s100上的hadoop的hdfs-site.xml进行粘贴
    4.3 xsync 分发hdfs-site.xml
        fgq@s100:~soft/hadoop/etc/hadoop$> xsync hdfs-site.xml
    4.5 停止hadoop集群 
        $>stop-all.sh
    4.6 重新格式化hadoop集群配置 
        $>hadoop namenode -format
    4.7 启动所有进程
        $>start-all.sh    
5.namenode的本地目录配置成多个,则每个目录存放内容相同
    在hdfs-default.xml中找dfs.namemode.name.dir节点
    复制到hdfs-site.xml文件中
    [hdfs-site.xml]    
    dfs.namemode.name.dir=file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2
6. datanode的本地目录配置成多个,不是副本,数据只会放到一个文件夹中,因为本身数据节点已经配置三台机器s101,s102,s103有备份意义了
    在hdfs-default.xml中找dfs.datanode.data.dir节点
    复制到hdfs-site.xml文件中
    [hdfs-site.xml]    
    dfs.datanode.data.dir=file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2
7. 然后建立逻辑文件系统的文件库(区别与hadoop临时目录存放的是namenode信息,以及区别与datanode目录配置存放的是实际的上传的文件) put上去一个文件
    fgq@s100:~$ hdfs dfs -ls -R /
    fgq@s100:~$ hadoop fs -mkdir -p /home/fgq/logicdata
    fgq@s100:~$ hdfs dfs -put hello.txt /home/fgq/logicdata
    fgq@s100:~$ hdfs dfs -ls -R /
    drwxr-xr-x   - fgq supergroup          0 2019-09-16 20:33 /home
    drwxr-xr-x   - fgq supergroup          0 2019-09-16 20:33 /home/fgq
    drwxr-xr-x   - fgq supergroup          0 2019-09-16 20:34 /home/fgq/logicdata
    -rw-r--r--   2 fgq supergroup         10 2019-09-16 20:34 /home/fgq/logicdata/hello.txt
    fgq@s100:~$ 
8. 进行webui查看测试

问题 如果启动后 xcall 查看有失败情况 则进行一下排除
    hadoop文件在本地有一个默认存放目录 
        $>cd /temp/ 
        $>ls
    将里面的hadoop-ubuntu、hadoop-ubuntu-datanode.pid(伪分布式时生成的文件)删除
        /temp$>xcall rm -rf /temp/hadoop-ubuntu
        /temp$>xcall rm -rf /temp/hadoop-ubuntu-datanode.pid
    然后再次重启hadoop集群

查看本地文件的内容 以备修改本地hadoop本地临时目录

1.s100:/tmp/hadoop-fgq/dfs/name/current/VERSION
    #Sun Sep 15 22:29:33 PDT 2019
    namespaceID=1574219430
    clusterID=CID-3f4ec779-7811-4251-a65f-bb3d520f0b86
    cTime=1568611773802
    storageType=NAME_NODE
    blockpoolID=BP-1040694739-192.168.146.100-1568611773802
    layoutVersion=-65

2.s101:/tmp/hadoop-fgq/dfs/data/current/VERSION
    #Sun Sep 15 22:30:56 PDT 2019
    storageID=DS-bf752c74-13cd-4243-a392-8bee0b0e5ac4
    clusterID=CID-3f4ec779-7811-4251-a65f-bb3d520f0b86
    cTime=0
    datanodeUuid=93f0655a-c5de-4a71-8179-a7238ef8969a
    storageType=DATA_NODE
    layoutVersion=-57

3.s102:/tmp/hadoop-fgq/dfs/data/current/VERSION
    略
4.s103:/tmp/hadoop-fgq/dfs/data/current/VERSION
    略
5.s104:/tmp/hadoop-fgq/dfs/namesecondary/current/VERSION
    #Sun Sep 15 22:32:04 PDT 2019
    namespaceID=1574219430
    clusterID=CID-3f4ec779-7811-4251-a65f-bb3d520f0b86
    cTime=1568611773802
    storageType=NAME_NODE
    blockpoolID=BP-1040694739-192.168.146.100-1568611773802
    layoutVersion=-65

修改本hadoop地临时目录: find . 递归查看文件夹下内容

1.在_config目录中使用Editplus搜索功能找寻hadoop.temp.dir
2.在core-default.xml中找到节点
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/tmp/hadoop-${user.name}</value>
    </property>
    [core-site.xml]修改为
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/fgq/hadoop</value>
    </property>
    复制修改后的内容到s100的hadoop的配置文件core-site.xml中
        <configuration>
            <property>
                <name>fs.defaultFS</name>
                <value>hdfs://s100/</value>
            </property>
            <property>
                <name>hadoop.tmp.dir</name>
                <value>/home/fgq/hadoop</value>
            </property>
        </configuration>
3.分发此配置文件
    $>xsync core-site.xml    
4.停止hadoop集群
    $>stop-all.sh
5.创建配置的hadoop文件目录/home/fgq/hadoop
    $>xcall mkdir /home/fgq/hadoop
6.查看是否创建成功
    $>xcall ls -l
7.删除以前的临时目录/tmp下的内容
    $>cd /tmp
    tmp$> xcall rm -rf /tmp/hadoop-fgq
8.以前的日志也删掉
    tmp$> xcall rm -rf /soft/hadoop/logs
9.格式化
    $>hadoop namenode -format
10.重启
    $>start-all.sh
11.put一个文件 使用webui查看完全分布式集群内容
    $>hadoop fs -put hello.txt /hadoop
    浏览器中 http://localhost:9870

hadoop脚本分析 百度"hadoop3.2.0启动脚本分析"进行深入学习

1.start-all.sh
    libexec/hadoop-config.sh                        --设置变量
    sbin/start-dfs.sh  --config $HADOOP_CONF_DIR    --启动hdfs
    sbin/start-yarn.sh --config $HADOOP_CONF_DIR    --启动yarn
2.libexec/hadoop-config.sh 包含的变量有
    COMMON_DIR
    ...
    HADOOP_CONF_DIR=...
    HEAP_SIZE=1000m
    CLASSPATH=...
3.sbin/start-dfs.sh     --config $HADOOP_CONF_DIR   --启动hdfs
    1.libexec/hdfs-config.sh
    2.获得名称节点主机名
        NAMENODES=hdfs getconf -namenodes 
    3.启动名称节点
        hadoop_uservar_su hdfs namenode "${HADOOP_HDFS_HOME}/bin/hdfs" \
        --workers \
        --config "${HADOOP_CONF_DIR}" \
        --hostnames "${NAMENODES}" \
        --daemon start \
        namenode ${nameStartOpt}
    4.启动datanode节点
        hadoop_uservar_su hdfs datanode "${HADOOP_HDFS_HOME}/bin/hdfs" \
        --workers \
        --config "${HADOOP_CONF_DIR}" \
        --daemon start \
        datanode ${dataStartOpt}
    5.启动2nn
        hadoop_uservar_su hdfs secondarynamenode "${HADOOP_HDFS_HOME}/bin/hdfs" \
        --workers \
        --config "${HADOOP_CONF_DIR}" \
        --hostnames "${SECONDARY_NAMENODES}" \
        --daemon start \
        secondarynamenode

4.libexec/hdfs-config.sh
    libexec/hadoop-config.sh
5.sbin/hadoop-daemons.sh        --启动守护进程脚本
    1.libexec/hdfs-config.sh    --执行配置脚本
    2.workers.sh
        循环workers文件,通过ssh方式登录远程主机,执行相应命令
        [sbin/hadoop-daemon.sh]
        [或出现个别进程无法启动后 自己手动启动的方法如下]
            a.$>hadoop-daemon.sh start datanode/namemode/secondarynamenode     --启动单一节点
            b.$>hadoop-daemons.sh start datanode    --启动所有节点
6.bin/hadoop
    hadoop-config.sh
    java ...
7.bin/hdfs
    hadoop-config.sh
    java...

hdfs常用操作

1.查看hdfs的文件列表
    $>hdfs dfs -ls -R /  --类比 hadoop fs -ls -R /
2.上传文件到hdfs
    $>hdfs dfs -put hello.txt /hadoop               --复制
    $>hdfs dfs -moveFromLocal hello.txt /hadoop     --剪切
3.重命名
    $>hdfs dfs -mv ./hello.txt ./how.txt
4.下载
    $>hdfs dfs -get ./hello.txt ./kk.txt
5.剪切下载
    未实现
6.删除文件(也可以删除目录)
    hdfs dfs -rm -r ...
7.删除目录(空目录)
    hdfs dfs -rmdir ...
8.在hdfs上进行文件复制
9.查看文件内容
    hadoop fs -cat  /user/hadoop/output

hadoop数据切块 hdfs文件块大小(128M)

磁盘寻道时间
磁盘的寻道时间==10ms
磁盘的IO速率==100M/s
寻道时间暂用磁盘读取速率的1%
10*100=1000ms=1s *100M/s =100M 换成二进制计算方法 2的n次幂的话 就是128M

hadoop集群 datanode启动不成功

1、问题描述:
    多次格式化文件系统时,会出现datanode无法启动
2、问题产生原因:
    执行文件系统格式化时(即执行命令$ bin/hadoop namenode -format 后),
    会在namenode数据文件夹(即配置文件中dfs.name.dir在本地系统的路径)
    中保存一个hadoopData/name(我的路径配置在core-cite.xml中)文件,记录namespaceID,
    标识了所格式化的namenode的版本。如果我们频繁的格式化namenode,
    那么datanode中保存(即配置文件中dfs.data.dir在本地系统的路径)
    的hadoopData/name文件(路径为usr/local/hadoop/tmp/dfs/data/hadoopData/name)
    只是你第一次格式化时保存的namenode的ID,因此就会造成namdenode 的 namespaceID 与 
    datanode的namespaceID 不一致,从而导致namenode和 datanode的断连。
3、解决方案:
    把/tmp下的Hadoop开关的临时文件删除,或者把/hadoop.tmp.dir目录清空
    (我是直接删除了:# rm -r /tmp,因为仅仅删除dir发现并没有效果,要根据具体情况解决问题,
    此处只是提供一个正确的思路)
    【注:在每次执行hadoop namenode -format时,都会为NameNode生成namespaceID,,
    但是在hadoop.tmp.dir目录下的DataNode还是保留上次的namespaceID,因为namespaceID的不一致,
    而导致DataNode无法启动,所以只要在每次执行hadoop namenode -format之前,
    先删除hadoop.tmp.dir(路径为 /usr/local/hadoop/下的)tmp目录就可以启动成功,
    或者删除/usr/local/hadoop/tmp/dfs下的data目录,
    然后重新启动dfs(在hadoop安装路径 /usr/local/hadoop/ 下,运行命令./sbin/start-dfs.sh)即可。
    请注意是删除hadoop.tmp.dir对应的本地目录,即/usr/local/hadoop/下的tmp文件夹,而不是HDFS目录。】
    [注意*删除hadoop临时目录要删除整个集群所有机器上的这个目录]

hdfs FileSystem API(java通过API访问hadoop文件)

错误集合
1.org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/home":fgq:supergroup:drwxr-xr-x
    由于/home这个hadoop的逻辑文件库目录权限的限制无法写
    fgq@s100:~$ hdfs dfs -ls -R /
    drwxr-xr-x   - fgq supergroup          0 2019-09-16 20:33 /home
    drwxr-xr-x   - fgq supergroup          0 2019-09-16 20:33 /home/fgq
    drwxr-xr-x   - fgq supergroup          0 2019-09-16 20:34 /home/fgq/logicdata
    -rw-r--r--   2 fgq supergroup         10 2019-09-16 20:34 /home/fgq/logicdata/he
    所以进行一下改动即可
    fgq@s100:~$ hdfs dfs -chmod 777 /home 
    改后的权限如下
    fgq@s100:~$ hdfs dfs -ls -R /
    drwxrwxrwx   - fgq supergroup          0 2019-09-16 20:33 /home
    drwxr-xr-x   - fgq supergroup          0 2019-09-16 20:33 /home/fgq
    drwxr-xr-x   - fgq supergroup          0 2019-09-16 20:34 /home/fgq/logicdata
    -rw-r--r--   2 fgq supergroup         10 2019-09-16 20:34 /home/fgq/logicdata/hello.txt
    使用程序上传一个文件
    fgq@s100:~$ hdfs dfs -ls -R /
    drwxrwxrwx   - fgq supergroup          0 2019-09-16 22:41 /home
    drwxr-xr-x   - fgq           supergroup          0 2019-09-16 20:33 /home/fgq
    drwxr-xr-x   - fgq           supergroup          0 2019-09-16 20:34 /home/fgq/logicdata
    -rw-r--r--   2 fgq           supergroup         10 2019-09-16 20:34 /home/fgq/logicdata/hello.txt
    -rw-r--r--   3 Administrator supergroup         22 2019-09-16 22:42 /home/hello.txt     --windows上使用eclipse代码上传的文件


2.由一个HADOOP_HOME and hadoop.home.dir are unset报错引起的window环境连接调试远程hadoop的一系列问题
    这个问题一般是因为当前服务器没有安装Hadoop,因此首先需要下载并解压Hadoop安装包,其次需要配置系统环境变量:
    控制面板 > 系统和安全 > 系统 > 高级系统变量 > 环境变量,添加一个环境变量,名字是:HADOOP_HOME,值是:D:\hadoop-3.0.3
    下载WINUTILS.EXE,并放到Hadoop的bin目录
3.注意了*在(旗舰版)windows上使用eclipse(java api)访问hadoop集群,如果不是在administrator的身份下登录的Windows那么会出现很多问题
代码示例
    示例一(不推荐)
    package com.it18zhang.hdfs;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.net.URL;
    import java.net.URLConnection;

    import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;

    public class TestHDFS {
        static {
            //注册协议处理器工厂,让java程序能够识别hdfs协议
                    URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
        }
        public static void main(String[] args) throws Exception {
            
            //定义url地址
            String url="hdfs://s100:8020/home/fgq/logicdata/hello.txt";
            //URL链接对象
            URL u=new URL(url);
            //URL连接
            URLConnection conn=u.openConnection();
            //打开输入流
            InputStream is=conn.getInputStream();
            
            //输出流
            FileOutputStream fos=new java.io.FileOutputStream("e:/fgq/hello.txt");
            //对拷贝
            byte[] buf=new byte[1024];
            int len=1;
            while((len=is.read(buf))!=-1) {
                fos.write(buf,0,len);
            }
            is.close();
            fos.close();
            
        }
    }
    示例二(推荐)
    package com.it18zhang.hdfs.test;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.lang.reflect.Method;

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataInputStream;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.fs.permission.FsAction;
    import org.apache.hadoop.fs.permission.FsPermission;
    import org.apache.hadoop.io.IOUtils;
    import org.junit.Before;
    import org.junit.Test;

    public class TestFileSystem {
        Configuration conf=null;
        FileSystem fs=null;
        @Before
        public void before() throws Exception {
            conf=new Configuration();
            fs=FileSystem.get(conf);
        }
        /***
        * 读操作,从hdfs上下载文件
        * @throws Exception 
        */
        @Test
        public void readFile() throws Exception {
            Path path=new Path("/home/hello.txt");
            FSDataInputStream fis=fs.open(path);
            FileOutputStream fos=new FileOutputStream("e:/fgq/hello.txt");
            IOUtils.copyBytes(fis, fos, 1024);
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
            System.out.println("读完了");
        }
        /***
        * 写操作
        * @throws Exception 
        */
        @Test
        public void writeFile() throws Exception {
            Path path=new Path("hdfs://s100:8020/home/hello.txt");
            //输出流
            FSDataOutputStream dos=fs.create(path);
            dos.write("helloworld hadoop hdfs".getBytes());
            dos.close();
            System.out.println("over");
            
        }
        
        /***
        * 写操作,指定副本数
        * @throws Exception 
        */
        @Test
        public void writeFileInReplication() throws Exception {
            Path path=new Path("hdfs://s100:8020/home/how.txt");
            //数据输出流
            FSDataOutputStream dos=fs.create(path,(short)2);
            dos.write("how are you?".getBytes());
            dos.close();
            System.out.println("over");
        }
        
        /***
        * 读文件,定义文件偏移量(分块来读)
        *  定位文件读取第一块 注意hello.txt大小有分块才可以,是否有分块可以在hadoop集群上查看,所以得找个大于128M的文件来测试
        * @throws Exception 
        */
        @Test
        public void readFileSeekBlock0() throws Exception {
            Path path=new Path("/home/hello.txt");
            FSDataInputStream fis=fs.open(path);
            FileOutputStream fos=new FileOutputStream("e:/fgq/hello.txt.part-0");
            int count=1024*1024*128;
            byte[] buf=new byte[1024];
            for (int i = 0; i < 1024*128; i++) {
                fis.read(buf);
                fos.write(buf);
            }
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
            System.out.println("读完了");
        }
        
        /***
        * 读文件,定义文件偏移量(分块来读)
        * 定位文件读取第二块 注意hello.txt大小有分块才可以,是否有分块可以在hadoop集群上查看,所以得找个大于128M的文件来测试
        * 当两块都读完后 可以在cmd使用 "cat 第二块文件  >>  第一块文件"命令合并
        * @throws Exception 
        */
        @Test
        public void readFileSeekBlock1() throws Exception {
            Path path=new Path("/home/hello.txt");
            FSDataInputStream fis=fs.open(path);
            FileOutputStream fos=new FileOutputStream("e:/fgq/hello.txt.part-1");
            //定义文件偏移量
            fis.seek(1024*1024*128); //从第二块开始读取(因为第一块的大小是128M)
            IOUtils.copyBytes(fis, fos, 1024);
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
            System.out.println("读完了");
        }
        /***
        * 创建目录并指定权限
        * @throws Exception
        */
        @Test
        public void mkdir() throws Exception {
            Path path=new Path("/home/myfolder");
            //创建权限对象
            FsPermission perm=new FsPermission(FsAction.ALL,FsAction.ALL,FsAction.ALL);
            //创建目录指定权限
            boolean b=fs.mkdirs(path,perm);
            System.out.println(b);
        }
        
        
        /***
        * 遍历目录(遍历所以参数为空的方法 getSymlink()这个方法不支持调用要排除掉)
        * @throws Exception
        */
        @Test
        public void fileStatus() throws Exception {
            FileStatus fs0=fs.getFileStatus(new Path("/"));
            Class clazz=FileStatus.class;
            Method[] ms=clazz.getDeclaredMethods();
            for (Method m : ms) {
                String mname=m.getName();
                Class[] ptype=m.getParameterTypes();
                if(mname.startsWith("get")&&(ptype==null||ptype.length==0)) {
                    if(!mname.equals("getSymlink")) {
                        Object ret=m.invoke(fs0, null);
                        System.out.println(mname+"() = "+ret);
                    }
                }
            }
            
        }
    }

查询集群副本数

$>hdfs getconf -confkey dfs.replication

查看文件块信息

/***
 * 获取文件块位置数组
 * @throws Exception
 */
public void getBlockLocation() throws Exception {
	//创建路径
	Path path=new Path("/home/fgq/logicdata/hello.txt");
	//得到文件状态
	FileStatus fss=fs.getFileStatus(path);
	//得到文件长度
	long length=fss.getLen();
	//得到文件块列表
	BlockLocation[] locs=fs.getFileBlockLocations(fss, 0, length);
	//
	for (BlockLocation loc : locs) {
		System.out.println(loc.getHosts());
	}
	
}

日志滚动(滚动编辑日志-融合镜像) 随着时间和编辑日志大小进行自动滚动

访问读写速度快
避免直接操作镜像文件导致的镜像文件锁定
手动滚动命令
    $>hdfs dfsadmin -rollEdits
保存名字空间/融合镜像和编辑日志
    $>hdfs dfsadmin -safemode enter
    $>hdfs dfsadmin -saveNamespace
    $>hdfs dfsadmin -safemode leave

数据的完整性 校验和

/***
    * 测试本地文件系统的校验和  LocalFileSystem
    * @throws Exception
    */
    @Test
    public void testLocalFileSystem() throws Exception {
        //创建配置对象,加载core-default.xml + core-site.xml
        Configuration conf=new Configuration();
        //自定义设定 覆盖默认加载core-default.xml + core-site.xml的内容
        conf.set("fs.defaultFS", "file:///");
        FileSystem fs=FileSystem.get(conf);
        Path path=new Path("d:/hello.txt");
        FSDataOutputStream fos=fs.create(path);
        fos.write("helloworld".getBytes());
        fos.close();
        fs.close();
        System.out.println("over");
    }

Ubuntu上安装eclipse 注意eclipse和jdk版本对应问题 不可乱下载

1.去eclipse官网下载 Eclipse IDE for Enterprise Java Developers (jdk1.8.0_xx)
2.gq@s100:~/Downloads$ tar -xzvf eclipse-jee-mars-2-linux-gtk-x86_64.tar.gz
    可以看到解压后的文件夹就叫eclipse
3.gq@s100:~/Downloads$ mv eclipse /home/fgq/soft/
4.建立jre软连接
    mkdir /home/fgq/soft/eclipse/jre
    ln -s /home/fgq/soft/jdk/bin /home/fgq/soft/eclipse/jre/
5.添加eclipse的桌面图标
    sudo gedit /usr/share/applications/eclipse.desktop
    在打开的文件中键入(注意Exec和Icon路径是否正确)
    [Desktop Entry]
    Encoding=UTF-8
    Name=eclipse
    Comment=eclipse
    Exec=/home/fgq/soft/eclipse/eclipse 
    Icon=/home/fgq/soft/eclipse/icon.xpm
    Terminal=false
    StartupNotify=true
    Type=Application
    Categories=Application;Development;

    sudo chmod u+x /usr/share/applications/eclipse.desktop
    
    然后点击图标进行开发

6.问题 如何是的eclipse正确的加载hadoop的本地类库 native-hadoop
1.Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    解决方式
        fgq@s100:~/soft/hadoop/lib/native$ sudo su root
        root@s100:/home/fgq/soft/hadoop-3.2.0/lib/native# rsync -l * /usr/local/lib

压缩和解压缩 deflate

管道模糊或精确查询

$>ls -al | grep xxx
或
$>find / | grep xxx

安装loz-2.06报错

fgq@s100:~/Downloads/lzo-2.06$ ./configure --enable-shared
configure: Configuring LZO 2.06
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking whether to enable maintainer-specific portions of Makefiles... no
checking for gcc... no              --缺少gcc
checking for cc... no               --缺少cc
checking for cl.exe... no           --缺少cl.exe
configure: error: in `/home/fgq/Downloads/lzo-2.06':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
解决方式 安装基础工具库
fgq@s100:~$>sudo apt-get install build-essential

压缩解压缩 代码

package com.it18zhang.hdfs.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.avro.file.BZip2Codec;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionInputStream;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.io.compress.DeflateCodec;
import org.apache.hadoop.io.compress.GzipCodec;
import org.apache.hadoop.io.compress.Lz4Codec;
import org.apache.hadoop.io.compress.SnappyCodec;
import org.apache.hadoop.util.ReflectionUtils;
import org.junit.Test;

import com.hadoop.compression.lzo.LzoCodec;

public class FileCompressionTest {
    /***
    * compression
    * @throws Exception
    */
    @Test
    public void begincompression() throws Exception{
        Class[] codecs={
                DeflateCodec.class,
                GzipCodec.class,
                BZip2Codec.class,
                LzoCodec.class,
                Lz4Codec.class,
                SnappyCodec.class,
        };
        for (Class clazz : codecs) {
            compress("hadoop.pdf",clazz);
            decompress("hadoop.pdf",clazz);
            System.out.println();
        }
    }
    
    @Test
    public void compress(String filename,Class clazz) throws Exception {
        // fgq@s100:~/soft/hadoop/lib/native$ sudo su root
        // root@s100:/home/fgq/soft/hadoop-3.2.0/lib/native# rsync -l *
        // /usr/local/lib
//		String codecClassname = "org.apache.hadoop.io.compress.DefaultCodec";
//		Class<?> codecClass = Class.forName(clazz.getName());
        long start=System.currentTimeMillis();
        Configuration conf = new Configuration();
        CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(clazz, conf);
        
        FileInputStream fis = new FileInputStream("/home/fgq/codec/"+filename);
        FileOutputStream fos = new FileOutputStream("/home/fgq/codec/"+(filename.substring(0,filename.indexOf(".")))+codec.getDefaultExtension());
        CompressionOutputStream out = codec.createOutputStream(fos);
        IOUtils.copyBytes(fis, out, 4096, false);
        out.finish();

        out.close();
        fos.close();
        fis.close();
        File file =new File("/home/fgq/codec/"+(filename.substring(0,filename.indexOf(".")))+codec.getDefaultExtension());
        long length=file.length();
        System.out.println(clazz.getSimpleName()+" :length="+length);
        
        System.out.print(",compressionTime="+(System.currentTimeMillis()-start));
    }
    
    /***
    * decompression
    * @throws Exception
    * @throws IOException
    */
    @Test
    public void decompress(String filename,Class clazz) throws Exception {
        long start=System.currentTimeMillis();
        Configuration conf =new Configuration();
//		Class<DeflateCodec> codecClass=DeflateCodec.class;
        DeflateCodec codec=ReflectionUtils.newInstance(clazz,conf);
        CompressionInputStream cis=codec.createInputStream(new FileInputStream("/home/fgq/codec/"+(filename.substring(0,filename.indexOf(".")))+codec.getDefaultExtension()));	
        FileOutputStream fos=new FileOutputStream("/home/fgq/codec/new_"+filename);
        IOUtils.copyBytes(cis, fos, 1024);
        fos.close();
        cis.close();
        System.out.print(",decompressionTime="+(System.currentTimeMillis()-start));
    }
}

使用codePool池优化压缩过程

package com.it18zhang.hdfs;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CodecPool;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionInputStream;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.io.compress.Compressor;
import org.apache.hadoop.io.compress.Decompressor;
import org.apache.hadoop.io.compress.DeflateCodec;
import org.apache.hadoop.util.ReflectionUtils;

public class CodecPoolTest {
    /***
    * compression,CodecPool
    * @param args
    * @throws Exception
    * @throws IOException
    */
    public static void main0(String[] args) throws Exception, IOException {
        Configuration  configuration=new Configuration();
        Class codecClass=DeflateCodec.class;
        CompressionCodec codec=(CompressionCodec)ReflectionUtils.newInstance(codecClass, configuration);
        Compressor compressor=CodecPool.getCompressor(codec);
        CompressionOutputStream coStream=codec.createOutputStream(new FileOutputStream("/home/fgq/codec/hadoop.defalte"),compressor);
        IOUtils.copyBytes(new FileInputStream("/home/fgq/codec/hadoop.pdf"), coStream, 1024);
        coStream.close();
        CodecPool.returnCompressor(compressor);
        System.out.println("over!!!");
    }
    
    /***
    * decompression,CodecPool
    * @param args
    * @throws Exception
    * @throws IOException
    */
    public static void main(String[] args) throws Exception, IOException {
        Configuration  configuration=new Configuration();
        Class codecClass=DeflateCodec.class;
        CompressionCodec codec=(CompressionCodec)ReflectionUtils.newInstance(codecClass, configuration);
        Decompressor decompressor=CodecPool.getDecompressor(codec);
        CompressionInputStream cis=codec.createInputStream(new FileInputStream("/home/fgq/codec/hadoop.defalte"),decompressor);
        IOUtils.copyBytes(cis,new FileOutputStream("/home/fgq/codec/hadoop.pdf"), 1024);
        cis.close();
        CodecPool.returnDecompressor(decompressor);
        System.out.println("over!!!");
    }
}

hadoop-day07-03-04-05 sequncefile->mapfile->arrayfile->setfile

源码提取 执行

mapreduce job 气温数据计算分析 day9-03

源码提取 执行

考察hadoop的底层IPC通信 day10-01

源码提取 执行

考察hadoop mapduce的计数器 day10-05

源码提取 执行

hadoop 利用mapreduce读写mysql数据 day11-07

源码提取

查看网络端口命令

&>netstat -ano | grep 8000

在做mapreduce编程时 避免切片文件太小

一个文件
    切片文件太小 导致切片很多 map很多 运行计算效率很低