Day3.Hadoop学习笔记1

零、概述

一、概述

  • Hadoop衍生自Nutch(搜索引擎和web爬虫),面临的问题:海量数据存储和计算

  • Big Data大数据,谈的不仅仅是数据量,其实包含了数据量(Volume)、时效性(Velocity)、多样性(Variety)、可疑性(Veracity)
    综上所述,我们可以总结出大数据的4V特征:
    Volume 数据体量庞大 (PB级->EB级->ZB级)
    Velocity 速度要求快 (数据输入输出的速度)
    Varity 数据类型多样 (文本|图像|音视频)
    Veracity 数据价值密度低 (商业价值高)

  • Hadoop是一个开源存储和计算框架,HDFS大规模数据存储服务,MapReduce实现了对海量数据的并行处理和分析。

  • 使用领域:电商推荐、论坛(精装营销)、交通(实时路况)、医疗、电信、金融

一、引言

  • Hadoop是什么?
    一种老牌的大数据解决方案。包括如下两部分:
    HDFS(Hadoop Distribute FileSystem):hadoop分布式文件系统。
    MapReduce:并行计算框架的称呼,源自于该计算模型的实现策略。

  • Hadoop ECO System(hadoop的生态圈)

    HDFS:分布式存储
    MapReduce:并行计算

    HBASE:hadoop的数据库系统,基于HDFS之上的一款NoSQL数据库。面向列存储的NOSQL数据库,使用HDFS作为底层存储服务
    Kafka:分布式消息队列,解决高并发
    Flume:分布式日志采集系统,实现对数据收集、转移以及聚合
    Hive:一款基于SQL的解析引擎,可以将SQL翻译成MapReduce计算,降低程序员使用门槛。一款工具,将用户的SQL翻译成MapReduce任务
    zookeeper:分布协调服务框架
    (了解)
    Mahout: 一个可以扩展的及其学习以及数据挖掘库。
    Spark:一个快速的通用的计算引擎用于计算Hadoop上的数据。基于内存。

  • 分布式计算(拓展自学)
    1、离线的大数据分析系统
    (Hadoop MapReduce,Spark Core)
    2、在线的实时流处理分析
    (Storm,Spark Streaming,Flink)

二、了解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)

三、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/

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

五、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写权限问题?
    ①解决方案一、关闭HDFS权限检查
    修改hdfs-site.xml重启hdfs
<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>

②解决方案二、欺骗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());
        }
    }
}

转载于:https://www.cnblogs.com/gospurs/p/10460694.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值