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环境搭建(伪分布式,单机跨进程)
- 安装好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)
- 关闭防火墙
[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
- 软件需求
CentOS-6.5-x86_64-minimal.iso
jdk-8u171-linux-x64.rpm
- 建议,修改主机名
[root@CentOS ~]# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=CentOS
[root@CentOS ~]# reboot # 重启虚拟机
- 配置主机名和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通,表示正常
- 安装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 #卸载
- SSH 免密码认证(本机免密码登录自己)
ssh-keygen -t rsa #加密算法加密
ssh-copy-id CentOS #第一次
- 安装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
- 配置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
- 启动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
- Windows测试HDFS API 注意事项
- 解压hadoop安装包并在Windows 配置
HADOOP_HOME
环境变量 - 将
hadoop_dll2.6.0_64bit.zip
中的winutils.exe
、hadoop.dll
文件拷贝到Hadoop的bin目录下 - 在Win7 上配置CentOS和IP的映射关系
C:\Windows\System32\drivers\etc
下hosts文件追加
192.168.153.137 CentOS
- 重启IDEA 确保开发编辑器可以识别
HADOOP_HOME
- 导入依赖
<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>
- 测试
- 解决HADOOP写权限问题?
①解决方案一、关闭HDFS权限检查
修改hdfs-site.xml
重启hdfs
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
②解决方案二、欺骗hadoop,让程序认为是root用户在写数据(修改java启动虚拟机参数),如下图
- 代码示例
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());
}
}
}