解压方面
linux解压zip文件,命令:unzip 如果没有该命令,可先安装,命令为:yum -y install unzip
解压
unzip hadoop-2.6.0-cdh5.14.2.zip
解压jdk到/opt/install目录下
[hadoop@hadoop101 software]$ tar -zxvf jdk-8u161-linux-x64.tar.gz -C /opt/install/
创建快捷方式
ln -s hadoop-2.6.0-cdh5.14.2 hadoop
=设置 hadoop用户=
1.添加用户组 dev
groupadd dev
2.创建hodoop用户 并归属dev组
useradd -g dev hadoop
3.给hadoop设置密码
passwd hadoop
5.切换hadoop用户
su hadoo
#启动hadoop
cd /opt/install/hadoop
sbin/start-all.sh
#关闭hadoop
sbin/stop-all.sh
hadoop fs -mkdir /input --在hdfs系统上 根目录下 创建 input文件夹
hadoop fs -ls / --查看某个 目录下的文件
hadoop fs -put /software/hello.txt /input --将虚拟机本地的文件 上传到 hdfs系统的某个目录下
--执行hadoop自带的jar包 运行MapReduce程序
hadoop jar /opt/install/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount /input /output/wordcount1
--进行查看结果
hadoop fs -cat /output/wordcount1/*
--nameNode退出安全模式
hadoop dfsadmin -safemode leave
--运行某个jar文件
hadoop jar /opt/test/dd-1.0-SNAPSHOT.jar com.mapred.WordCount
--启动hbase
cd /opt/install/hbase
bin/start-hbase.sh
--切换hbase的shell语句
hbase shell
--关闭hbase
stop-hbase.sh
hbase shell语句
#查看
list
#创建表
create '表名','列族1','列族2'......
#查看指定表的列族详细信息(描述表)
describe '表名'
#添加数据
put '表名称','行键','列键','值'
#扫描表:scan 能看列族 列的数据
#缺点:不能看一行的数据
scan '表名称',{COLUMNS=>['列族名1','列族名2',……],参数名=>参数值…}
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
scan 'scores'
scan 'scores',{COLUMN=>'course'}
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
scan '表名称',{COLUMN=>['列键1','列键2',……],参数名=>参数值…}
scan 'scores',{COLUMN=>'course:math',LIMIT=>1} # LIMIT 显示的条数
#获取数据:get 获取行的所有单元或者某个指定的单元
#表名和行键必须指定
get '表名称','行键',{COLUMNS=>['列族名1','列族名2'…],参数名=>参数值…}
get '表名称','行键',{COLUMN=>['列键1','列键2'…],参数名=>参数值…}
get 'scores','tom'
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
get 'scores','tom',{COLUMNS=>'course'}
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
get 'scores','tom',{COLUMN=>'course:math'}
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐#查列+列族 2个列
get 'scores','tom',{COLUMN=>['course:math', 'grade:']}
等同于====get 'scores','jason','course: math', 'grade:'
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐#按版本号查
get 'scores','jason',{COLUMN=>'course:math',TIMESTAMP=>1584427964068}
#删除数据
#delete:删除一个列
delete '表名称','行键','列键'
delete 'scores','jason','course:math'
#deleteall:删除一行
deleteall '表名称','行键'
deleteall 'scores','tom'
#修改表:alter 增加或修改表的列族,列族名存在则修改否则增加
alter '表名称',参数名=>参数值,...
alter '表名称',{参数名=>参数值,...}, {参数名=>参数值,...}…
alter 'scores',NAME=>'course',VERSIONS=>'5'
alter 'scores',{NAME=>'grade',VERSIONS=>'5'},{NAME=>'course',
VERSIONS=>'5'}
#删除表:drop
disable '表名' #设置表不可用
drop '表名' #删除
disable 'scores'
drop 'scores'
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
enable '表名' #将表变成可用状态
是指无法在一定时间内常规软件工具对齐内容进行抓取,管理和处理的数据集合
体量巨大
数据类型多样,以非结构化数据为主
价值密度低
产生和要求处理速度快
Hadoop、Spark、Stom等
低成本 高扩展性 高效性 高容错性
分布式存储(HDFS)
分布式计算(MapReduce)
更方便的存储数据(HBase)
在Linux中配置Hadoop运行环境
1.创建用户
2.安装JDK(/usr/java/jdk1.7.0.67)
3.配置SSH免密码登录
客户端主机(拥有自己的私钥、请求方)
服务端主机(拥有别人的公钥、应答方)
解压hadoop-2.6.0.tar.gz到用户HOME目录
cd ~
tar -zxvf hadoop-2.6.0.tar.gz
重命名(创建快捷方式)
mv hadoop-2.6.0 hadoop
配置环境变量:/etc/profile
export HADOOP_HOME=/home/hduser/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
Hadoop完全分布式安装
bin:执行文件目录
etc:Hadoop配置文件都在此目录
include:包含C语言接口开发所需头文件
lib:包含C语言接口开发所需链接库文件
libexec:运行sbin目录中的脚本会调用该目录下的脚本
logs:日志目录,在运行过Hadoop后会生成该目录
sbin:仅超级用户能够执行的脚本,包括启动和停止dfs、yarn等
share:包括doc和hadoop两个目录
doc目录包含大量的Hadoop帮助文档
hadoop目录包含了运行Hadoop所需的所有jar文件,在开发中用到的jar文件也可在该目录找到
启动hadoop
cd /opt/install/hadoop
sbin/start-all.sh --
[类似百度云]
hadoop fs -mkdir /input --在hdfs系统上 根目录下 创建 input文件夹
hadoop fs -ls / --查看某个 目录下的文件
hadoop fs -put /software/hello.txt /input --将虚拟机本地的文件 上传到 hdfs系统的某个目录下
--执行hadoop自带的jar包 运行MapReduce程序
hadoop jar /opt/install/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount /input /output/wordcount1
--进行查看结果
hadoop fs -cat /output/wordcount1/*
HDFS简介
HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上。它所具有的高容错、高可靠性、高可扩展性、高获得性、高吞吐率等特征为海量数据提供了不怕故障的存储,为超大数据集(Large Data Set)的应用处理带来了很多便利
文件块Block
第一代1.x 默认大小64MB
第一代2.x 默认大小128MB
特点:2kb也会占用一个128M,500会占用3个128M,加一个没有满的128M
Hadoop-2.X默认的虎门
NameNode
主要存放元数据文件、版本信息、文件系统的标识符等
元数据:将文件切成了文件块,分布式的存储系统,block1存在什么位置由namenode来分 配并将详细的datanode和路径 与 block1形成映射文件,存放在namenode
负责接收 读写数据的请求,根据请求完成文件块block的分配与映射文件的读取
DataNode
存放文件块block的 数据节点(一台电脑)以及数据的属性信息
block在多个节点上都有备份,好处是 容错性很高
Secondary NameNode节点 备胎
解决了1.x的经典问题—单点故障
备份NameNode,(二级NameNode)处于standby状态,当NameNode出现问题时,会变为 active状态接替NameNode的工作继续运行
1.处理超大文件
能用来存储管理PB级的数据 1PB = 1024TB
2.处理非结构化数据、半结构化数据、结构化数据
流式的访问数据
一次写入、多次读取
3.运行于廉价的商用机器集群上
可运行在低廉的商用硬件集群上
故障时能继续运行且不让用户察觉到明显的中断
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-commonartifactId>
<version>2.6.0version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-hdfsartifactId>
<version>2.6.0version>
dependency>
package com.dd;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
public class App
{
static{
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) {
InputStream in=null;
try {
in=new URL(args[0]).openStream();
org.apache.hadoop.io.IOUtils.copyBytes(in, System.out,4096,false);
} catch (IOException e) {
e.printStackTrace();
}finally{
IOUtils.closeStream(in);
}
}
}
public static void readFile(String filePath){
FSDataInputStream fis = null;
try {
fis = fs.open(new Path(filePath));
IOUtils.copyBytes(fis,System.out,4096,false);
}catch (IOException e){
e.printStackTrace();
} finally {
IOUtils.closeStream(fis);
}
}
public static void createFile(String filePath){
FSDataOutputStream fos=null;
InputStream is =null;
try{
Path path = new Path(filePath);
//通过create方法 获取了输出流
fos= fs.create(path); //hdfs系统是已经有了此文件
//向创建的文件中写入内容
is = new ByteArrayInputStream("Hello Hadoop".getBytes("UTF-8"));
IOUtils.copyBytes(is,fos,4096,true);
System.out.println("---文件创建成功---");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭流
IOUtils.closeStream(fos);
IOUtils.closeStream(is);
}
}
public static void uploadFile(String srcPath,String dstPath){
try{
//把字符串转换为Path路径对象
Path src = new Path(srcPath);
Path dst = new Path(dstPath);
//利用copyFromLocalFile
fs.copyFromLocalFile(src,dst);
System.out.println("上传成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void downloadFile(String srcPath,String dstPath){
try{
//把字符串转换为Path路径对象
Path src = new Path(srcPath);
Path dst = new Path(dstPath);
//利用copyFromLocalFile
//false:不删除源文件
//true:使用本地的文件系统
fs.copyToLocalFile(false,src,dst,true);
System.out.println("下载成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void deleteFile(String filePath){
try{
//指定hdfs
Path path = new Path(filePath);
//true:是否开启递归删除
if(fs.exists(path)){ //判断文件是否存在
fs.delete(path,true);
//fs.deleteOnExit();删除方法二
System.out.println("删除成功!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void rename(String fromPath,String toPath){
try{
Path from = new Path(fromPath);
Path to = new Path(toPath);
fs.rename(from,to);
System.out.println("重命名成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void findFile(String path){
try {
Path filePath = new Path(path);
//获取文件信息
FileStatus fileInfo = fs.getFileStatus(filePath);
//获取文件大小
long size = fileInfo.getLen();
//获取文件路径
String filePath2 = fileInfo.getPath().toString();
//获取文件权限
String permission = fileInfo.getPermission().toString();
//拥有者
String owner = fileInfo.getOwner();
System.out.println("拥有者:"+owner+"\n文件大小:"+size+"\n路 径:"+filePath2+"\n权限:"+permission);
System.out.println("文件查询成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void findFiles(String path){
try {
Path filePath = new Path(path);
FileStatus[] files = fs.listStatus(filePath);
for (FileStatus fileStatus : files) {
//文件大小
long size = fileStatus.getLen();
//文件路径
String filePath2 = fileStatus.getPath().toString();
//文件权限
String permission = fileStatus.getPermission().toString();
//拥有者
String owner = fileStatus.getOwner();
System.out.println("文件大小:" + size);
System.out.println("文件路径:" + filePath2);
System.out.println("文件权限:" + permission);
System.out.println("拥有者:" + owner);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
import org.apache.hadoop.fs.*;
import org.apache.zookeeper.common.IOUtils;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
public class HDFSAPP {
//1.获取配置文件对象
private static Configuration conf =new Configuration();
private static FileSystem fs;
private static String hdfsUrl="hdfs://192.168.119.100:9000";
//静态公共部分
static {
try {
//2.获取FileSystem对象
fs=FileSystem.get(new URI(hdfsUrl),conf,"root");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
//代码块1
//代码块2
//代码块3 ...
//程序入口
public static void main(String[] args) {
//readFile("/input/lianxi.txt");
//createFile("/input/create.txt");
//uploadFile("D:\\111\\lianxi.txt","/input");
//downloadFile("/input/create.txt","D:\\111");
//deleteFile("/input/lianxi.txt");
//rename("/input/create.txt","/input/create11.txt");
//findFile("/input/create11.txt");
findFiles("/input");
}
}
第一种(不带参数): hadoop jar /opt/test/dd-1.0-SNAPSHOT.jar com.dd.App
第二种(带参数):hadoop jar /opt/test/dd-1.0-SNAPSHOT.jar com.dd.App hdfs://192.168.119.100:9000/input/hello.txt
使用FileSystem API编程步骤
实现步骤