|
禁止转载 我所遇见的世界会更美好
HBase shell 、写和读HDFS、HBase建表、编程、开启debug模式
使用Hadoop shell命令导入和导出数据到HDFS
1.2 使用Hadoop shell命令导入和导出数据到HDFS(1)
HDFS提供了许多shell命令来实现访问文件系统的功能,这些命令都是构建在HDFS FileSystem API之上的。Hadoop自带的shell脚本是通过命令行来执行所有操作的。这个脚本的名称叫做hadoop,通常安装在$HADOOP_BIN目录下,其中$HADOOP_BIN是Hadoopbin文件完整的安装目录,同时有必要将$HADOOP_BIN配置到$PATH环境变量中,这样所有的命令都可以通过hadoop fs -command这样的形式来执行。
如果需要获取文件系统的所有命令,可以运行hadoop命令传递不带参数的选项fs。
这些按照功能进行命名的命令的名称与Unix shell命令非常相似。使用help选项可以获得某个具体命令的详细说明。
这些shell命令和其简要的参数描述可在官方在线文档http://hadoop.apache.org/docs/r1.0.4/file_system_shell.html中进行查阅。
在这一节中,我们将使用Hadoop shell命令将数据导入HDFS中,以及将数据从HDFS中导出。这些命令更多地用于加载数据,下载处理过的数据,管理文件系统,以及预览相关数据。掌握这些命令是高效使用HDFS的前提。
准备工作
你需要在http://www.packtpub.com/support这个网站上下载数据集weblog_ entries.txt。
操作步骤
完成以下步骤,实现将weblog_entries.txt文件从本地文件系统复制到HDFS上的一个指定文件夹下。 在HDFS中创建一个新文件夹,用于保存weblog_entries.txt文件:
- hadoop fs -mkdir /data/weblogs
将weblog_entries.txt文件从本地文件系统复制到HDFS刚创建的新文件夹下:
- hadoop fs -copyFromLocal weblog_entries.txt /data/weblogs
列出HDFS上weblog_entries.txt文件的信息:
- hadoop fs –ls /data/weblogs/weblog_entries.txt
在Hadoop处理的一些结果数据可能会直接被外部系统使用,可能需要其他系统做更进一步的处理,或者MapReduce处理框架根本就不符合该场景,任何类似的情况下都需要从HDFS上导出数据。下载数据最简单的办法就是使用Hadoop shell。
//将本地文件上传到hdfs。
String target="hdfs://localhost:9000/user/Administrator/geoway_portal/tes2.dmp";
FileInputStream fis=new FileInputStream(new File("C:\\tes2.dmp"));//读取本地文件
Configuration config=new Configuration();
FileSystem fs=FileSystem.get(URI.create(target), config);
OutputStream os=fs.create(new Path(target));
//copy
IOUtils.copyBytes(fis, os, 4096, true);
System.out.println("拷贝完成...");
查看上传的hdfs的文件信息:
使用Hadoop fs -ls shell命令查询geoway_portal下的文件情况:
以下代码实现将本地文件拷到HDFS集群中
package com.njupt.Hadoop;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class CopyToHDFS {
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Path source = new Path("/home/hadoop/word.txt");
Path dst = new Path("/user/root/njupt/");
fs.copyFromLocalFile(source,dst);
}
}
使用HDFS java api 下载文件到本地的代码如下:
String file="hdfs://localhost:9000/user/Administrator/fooo/j-spatial.zip";//hdfs文件 地址
Configuration config=new Configuration();
FileSystem fs=FileSystem.get(URI.create(file),config);//构建FileSystem
InputStream is=fs.open(new Path(file));//读取文件
IOUtils.copyBytes(is, new FileOutputStream(new File("c:\\likehua.zip")),2048, true);//保存到本地 最后 关闭输入输出流
./start
关于配置环境变量
./hbase shell
会了和能做项目是两个层次,完全不同的概念的撒。
时间戳可以变成时间表那样??
slave2:
slave1:
[iyunv@slave1 ~]# ll
总用量 52
-rw-------. 1 root root 950 10月 14 16:02 anaconda-ks.cfg
-rw-r--r--. 1 root root 12081 5月 22 21:31 post-install
-rw-r--r--. 1 root root 552 5月 22 21:31 post-install.log
drwxr-xr-x. 2 root root 4096 10月 22 17:43 公共的
drwxr-xr-x. 2 root root 4096 10月 22 17:43 模板
drwxr-xr-x. 2 root root 4096 10月 22 17:43 视频
drwxr-xr-x. 2 root root 4096 10月 22 17:43 图片
drwxr-xr-x. 2 root root 4096 10月 22 17:43 文档
drwxr-xr-x. 2 root root 4096 10月 22 17:43 下载
drwxr-xr-x. 2 root root 4096 10月 22 17:43 音乐
drwxr-xr-x. 2 root root 4096 10月 22 17:43 桌面
[iyunv@slave1 ~]# cd /etc/sysconfig/network-scripts/
如何从master面板快速切换到slave2? shift+tab
[iyunv@slave1 network-scripts]# cat ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=eth0
UUID=16a631ff-0a3b-4915-9d6d-99743e5b0b56
ONBOOT=yes
HWADDR=00:0C:29:66:10:7b
IPADDR=192.168.150.4
PREFIX=24
GATEWAY=192.168.150.2
DNS1=192.168.150.2
LAST_CONNECT=1477239855
[iyunv@slave1 network-scripts]# su hadoop
[hadoop@slave1 network-scripts]$ cd
[hadoop@slave1 ~]$ ll
总用量 68
drwxrwxr-x 5 hadoop hadoop 4096 11月 8 20:31 soft
-rw-rw-r-- 1 hadoop hadoop 60181 11月 9 11:44 zookeeper.out
[hadoop@slave1 ~]$ zkServer.sh start
JMX enabled by default
Using config: /home/hadoop/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@slave1 ~]$ zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
[hadoop@slave1 ~]$ jps
2971 Jps
2787 QuorumPeerMain
2907 HRegionServer
2588 NodeManager
2517 DataNode
slave2:
[iyunv@slave2 ~]# ifconfig
[iyunv@slave2 ~]# su hadoop
[hadoop@slave2 ~]$ zkServer.
zkServer.cmd zkServer.sh
[hadoop@slave2 ~]$ zkServer.sh start
JMX enabled by default
Using config: /home/hadoop/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@slave2 ~]$ jps
2609 NodeManager
2797 QuorumPeerMain
2534 DataNode
2824 Jps
[hadoop@slave2 ~]$
master:
[iyunv@master ~]# su hadoop
[hadoop@master ~]$ start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
16/11/19 10:55:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [master]
master: starting namenode, logging to /home/hadoop/soft/hadoop-2.6.4/logs/hadoop-hadoop-namenode-master.out
slave2: starting datanode, logging to /home/hadoop/soft/hadoop-2.6.4/logs/hadoop-hadoop-datanode-slave2.out
slave1: starting datanode, logging to /home/hadoop/soft/hadoop-2.6.4/logs/hadoop-hadoop-datanode-slave1.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /home/hadoop/soft/hadoop-2.6.4/logs/hadoop-hadoop-secondarynamenode-master.out
16/11/19 10:55:40 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/soft/hadoop-2.6.4/logs/yarn-hadoop-resourcemanager-master.out
slave2: starting nodemanager, logging to /home/hadoop/soft/hadoop-2.6.4/logs/yarn-hadoop-nodemanager-slave2.out
slave1: starting nodemanager, logging to /home/hadoop/soft/hadoop-2.6.4/logs/yarn-hadoop-nodemanager-slave1.out
[hadoop@master ~]$ jps
5623 SecondaryNameNode
5466 NameNode
6050 Jps
5793 ResourceManager
[hadoop@master ~]$ zkServer.sh start
JMX enabled by default
Using config: /home/hadoop/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@master ~]$ zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[hadoop@master ~]$ jps
5623 SecondaryNameNode
5466 NameNode
6117 QuorumPeerMain
5793 ResourceManager
6174 Jps
[hadoop@master ~]$ start-hbase.sh
starting master, logging to /home/hadoop/soft/hbase-1.2.4/logs/hbase-hadoop-master-master.out
192.168.150.3: starting regionserver, logging to /home/hadoop/soft/hbase-1.2.4/logs/hbase-hadoop-regionserver-master.out
192.168.150.5: starting regionserver, logging to /home/hadoop/soft/hbase-1.2.4/logs/hbase-hadoop-regionserver-slave2.out
192.168.150.4: starting regionserver, logging to /home/hadoop/soft/hbase-1.2.4/logs/hbase-hadoop-regionserver-slave1.out
[hadoop@master ~]$ jps
jps^H^H5623 SecondaryNameNode
6437 HRegionServer
5466 NameNode
6117 QuorumPeerMain
5793 ResourceManager
6547 Jps
6304 HMaster
[hadoop@master ~]$ hdfs dfs -ls /
16/11/19 11:01:23 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your pla
Found 3 items
drwxr-xr-x - hadoop supergroup 0 2016-11-19 10:59 /hbase
drwxr-xr-x - hadoop supergroup 0 2016-10-25 20:40 /tmp
drwxr-xr-x - hadoop supergroup 0 2016-10-25 19:43 /user
[hadoop@master ~]$ free
total used free shared buffers cached
Mem: 1012076 899848 112228 8 872 36104
-/+ buffers/cache: 862872 149204
Swap: 2031612 152652 1878960
[hadoop@master ~]$ free -m
total used free shared buffers cached
Mem: 988 880 107 0 0 35
-/+ buffers/cache: 844 144
Swap: 1983 148 1835
[hadoop@master ~]$ hbase shell
2016-11-19 11:02:55,144 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop librar
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hadoop/soft/hbase-1.2.4/lib/slf4j-log4j12-1.7.5.jar!/or
SLF4J: Found binding in [jar:file:/home/hadoop/soft/hadoop-2.6.4/share/hadoop/common/lib/slf4j-
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.4, r67592f3d062743907f8c5ae00dbbe1ae4f69e5af, Tue Oct 25 18:10:20 CDT 2016
hbase(main):001:0> helo
NameError: undefined local variable or method `helo' for #<Object:0x45b4d4a>
hbase(main):002:0> list
TABLE
0 row(s) in 2.3030 seconds
=> []
hbase(main):003:0> creard
NameError: undefined local variable or method `creard' for #<Object:0x45b4d4a>
hbase(main):004:0> put "''
hbase(main):005:0" put
hbase(main):006:0" [hadoop@master ~]$
[hadoop@master ~]$
[hadoop@master ~]$ hbase shell
2016-11-19 11:12:23,455 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hadoop/soft/hbase-1.2.4/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hadoop/soft/hadoop-2.6.4/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.4, r67592f3d062743907f8c5ae00dbbe1ae4f69e5af, Tue Oct 25 18:10:20 CDT 2016
hbase(main):001:0> list
TABLE
0 row(s) in 1.0970 seconds
=> []
hbase(main):002:0>
hbase删除输入错误:
执行删除操作时,需要使用组合键:Ctrl+Back Space同时按下
HBase: 灵活的,如果网页更改,适用于结构化、半结构化;只需要更改列和限定符就行。 以列的方法存储 ,
非稀疏,容易形成数据块。
传统的数据库:稀疏的(就是有空格,有空缺的元素留空白)
逻辑结构 --> 物理结构
第一个表格中每一个时间戳的增加,会可能带来三个新元素,然后找到第二个表的相对应行增加相应行的子行
hbasecontents:html = "<html>..."_百度搜索
https://www.baidu.com/s?wd=hbasecontents%3Ahtml%20%3D%20%22%3Chtml%3E...%22&rsv_spt=1&rsv_iqid=0xe281c553000aa0bf&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=site888_3_pg&rsv_enter=1&oq=contents%3Ahtml%20%3D%20%26quot%3B%26lt%3Bhtml%26gt%3B...%26quot%3B&inputT=2068&rsv_t=0cfeUlBQhS2%2B9h%2BkqlPLaajeoQzElnvneQ8%2BdFYDgKQeMeNR3FouOAsDE6nbEiGcSW1s&rsv_sug3=4&rsv_pq=f0944adf000e0101&rsv_sug2=0&prefixsug=hbasecontents%3Ahtml%20%3D%20%22%3Chtml%3E...%22&rsp=6&rsv_sug9=es_0_1&rsv_sug4=3285&rsv_sug=9
HBase使用教程 - 小码哥BASE64 - ITeye技术网站
http://coderbase64.iteye.com/blog/2074601
hbase(main):后面的>变成‘’_百度搜索
https://www.baidu.com/s?wd=hbase(main)%3A%E5%90%8E%E9%9D%A2%E7%9A%84%3E%E5%8F%98%E6%88%90%E2%80%98%E2%80%99&rsv_spt=1&rsv_iqid=0xf52382ec000cdcb3&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=site888_3_pg&rsv_enter=1&rsv_t=9ecfwiGV7s4Gk1e0lIpu67VyNgGsC%2BiNO1tA%2FuEb4dWNkbY3Y6CqoOSE838ePQLnjfLO&oq=hbase(main)%3A005%3A0%26quot%3Bhbase(main)%3A005%3A0%26quot%3B&rsv_sug3=32&rsv_pq=8550b5d3000a62b9&rsv_sug2=0&prefixsug=hbase(main)%3A%E5%90%8E%E9%9D%A2%E7%9A%84%3E%E5%8F%98%E6%88%90%E2%80%98%E2%80%99&rsp=7&rsv_sug9=es_0_1&inputT=49183&rsv_sug4=49743&rsv_sug=9
HBase是按列存储的,稀疏(列族少,数据吸收)矩阵。
HBase是列存储,以列族为存储单位,传统的数据库是按行存储。
即使行、列相同,得到的值也是不一样的(有时间戳)。
回收策略:数据的压缩和整理,没用的都会删掉。
HBase 优化需要的源代码
一个物理机有且仅有一个HRegionServer 、可能含有一个HBase(集群中只有一个物理机含有)
见图 HRegionServer 、HBase之间的关系相当于虚拟机的master、slave1、slave2....n
这个架构也类似于hadoop本身的架构,由master和namenode存储元数据,真正的数据存储在datanode上(会有多个datanode)。
- Hmaster负责元数据存储,维护整个hbase集群的状态。
- HRegionServer是真正管理数据的增删改查(数据库的功能),用户提交的数据请求都是通过HRegionServer协调处理。
² 每一个物理机器节点只能有一个HRegionServer。
² 在HRegionServer下管理HRegion。
HRegion中存放的真正存储单元。
HRegion就是我们创建表的时候创建的,在默认情况下建立的表都有一个HRegion(最基本的存储单元,个数由列族决定),region根据行键划分,对应部分范围放到一起。
HRegion到底交个哪个HRegionServer管理,是由Hmaster管理,它会考虑负载均衡和资源管理。
HRegion中有一系列的结构。
HLog (hbase log)日志记录文件。相当于oracle中的重做日志文件;Redo log记录增删改查的每一笔记录。
Store单元存放真实的数据放。
数据以列族为单位存放,列族就存放在store中。
Store又分为两个部分:MemStore内存存储;StoreFile 存储文件,是以HFile存在的,存在于hdfs系统中datanode上。
在HRegionServer中 HRegion会有多个,随着数据不断增加就会产生新的HRegion,hlog只有一个。
在hadoop中,存储是均匀的,hbase的hfile就会分布在datanode上。整体上数据进行了两次分布。在hbase和hadoop上进行两次分布。
第一次分布:HBase --》HRegionServicer
第二次分布: storefile --》 HDFS
一次一个块读取效率高,所以会有memstore(内存缓存区);memstore多了在以数据块的方式存在
最终落实在磁盘上时是HDFS
一个数据块64
memstore -》 storefile以Hfile的形式才能发给 -》HDFS
这里HBase是虚的,不干具体的实事,找到一个空闲即负载均衡的HRegionServicer去做具体的工作,
HRegionServicer相当于数据库服务器 数据管理单位HRegion
Store真正数据存放的地方,以文件多个HFile的方式持久化存储,MemStore用来存放零碎的,存到一定的数量再存放到StoreFile
再经过客户端存、取
HLog用日志来数据持久化
HBase的访问方式 见1.4文档详细内容
thrift 序列化技术
每一个store 对应一个列族
2个映像是为了备份HDFS中的文件都要备份? 其他的地方不需要备份吗?
阻抗失谐
Redis 教程 | 菜鸟教程
http://www.runoob.com/redis/redis-tutorial.html
针对快照:
拷贝给别人会生成一份日志,要删掉;从别人那里拷贝过来要调网络配置
现在安装的 密码是root
老师的是打开的 是fdq , 进去是111111
跟教授稀里糊涂的学的一塌糊涂
Hadoop、hbase、Mapreduce
hadoop的安装 - [ hadoop学习 ]
http://www.kancloud.cn/zizhilong/hadoop/224101
虾皮工作室 - 赠人玫瑰,手留余香。
http://www.xiapistudio.com/
hadoop中典型Writable类详解 - wuyudong - 博客园
http://www.cnblogs.com/wuyudong/p/hadoop-writable.html
Hadoop学习笔记(1):WordCount程序的实现与总结 - JD_Beatles - 博客园
http://www.cnblogs.com/pengyingzhi/p/5361008.html#3401994
Hadoop示例程序WordCount详解及实例 - xwdreamer - 博客园
http://www.cnblogs.com/xwdreamer/archive/2011/01/04/2297049.html
Hadoop WordCount解读 - 犀利的代码总是很精炼 - ITeye技术网站
http://a123159521.iteye.com/blog/1226924
import java.io.IOException;
import java.net.URI;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
/**
*
*
* 小结:Hadoop程序处理流程
*
* 1. 分析输入文件
* 2. 文件里面的每一行都会执行一次 TokenizerMapper.map() 分割成单词
* 3. 每一个单词都会被送到 KeyCombiner.reduce() 进行处理,统计次数
* 4. 当所有的单词都统计完成以后,会合并到一起然后送到 IntSumReducer.reduce() 进行最后的处理
*
*/
public class WordCount {
private static Configuration conf;
private static String hdfsPath = "hdfs://192.168.150.3:9000"; //hdfs 主机
private static Path inputPath = new Path(hdfsPath + "/tmp/wordcount/in"); //hdfs完整输入路径
private static String outPathStr = "/tmp/wordcount/out"; //hdfs输出路径
private static Path outPath = new Path(hdfsPath + outPathStr); //hdfs完整输出路径
/**
* Mapper 处理
*
* 四个参数的含义,前两个是输入的值 Key/Value的类型,后两个是输出的值Key/Value的类型 , 此处的输出类型需要KeyCombiner的输入参数保持一致
*/
public static class TokenizerMapper extends Mapper<Object,Text,Text,IntWritable>{
/**
* one 词的个数,刚开始都为1,也可以不定义,直接context.write(keytext, 1);
*/
private final static IntWritable one=new IntWritable(1);
/**
* word 用于临时保存分隔 出 的 单词
*/
private Text word =new Text();
/**
* @param key即行偏移量,作用不大
* @param value 匹配到的当前行的内容
* @param context
*/
public void map(Object key,Text value,Context context) throws IOException,InterruptedException{
System.out.println("mapper --- 行内容:"+value);
StringTokenizer itr=new StringTokenizer(value.toString()); //把内容行按空格进行分隔
while (itr.hasMoreTokens()) { //返回是否还有分隔符。
word.set(itr.nextToken()); //返回从当前位置到下一个分隔符的字符串。
//System.out.println("mapper --- 分割成单词:"+word);
//以key/value的形式发送给reduce
context.write(word, one);
}
}
}
/**
* Reducer 处理
*
* 四个参数的含义,前两个是输入的值 Key/Value的类型,后两个是输出的值Key/Value的类型
*
* 此处的【输入参数类型】需要和 KeyCombiner 的【输出参数类型】保持一致
*
*/
public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
/**
* result 用于记录单词的出现数量
*/
private IntWritable result = new IntWritable();
/**
* @param key单词名称
* @param values单词对应的值的集合
* @param context
*/
public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) { //遍历值集合
int getval = val.get(); //得到值
sum += getval;//累加数量
//System.out.println("reduce --- getval:"+getval);
}
System.out.println("reduce --- key:"+key +",sum:"+sum);
result.set(sum); //保存累加的数值
context.write(key, result); //将累加后的数值
}
}
/**
* Combiner 处理
*
* 四个参数的含义,前两个是输入的值 Key/Value的类型,后两个是输出的值Key/Value的类型
*
* 此处的【输入参数类型】需要和 TokenizerMapper 的【输出参数类型】保持一致
*
* 此处的【输出参数类型】需要和 IntSumReducer 的【输入参数类型】保持一致
*
*/
public static class KeyCombiner extends Reducer<Text,IntWritable,Text,IntWritable> {
/**
* result 用于记录单词的出现数量
*/
private IntWritable result = new IntWritable();
/**
* @param key单词名称
* @param values单词对应的值的集合
* @param context
*/
public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) { //遍历值集合
int getval = val.get(); //得到值
sum += getval;//累加数量
//System.out.println("reduce --- getval:"+getval);
}
System.out.println("combiner --- key:"+key+",sum:"+sum);
result.set(sum); //保存累加的数值
context.write(key, result); //将结果传递给 IntSumReducer
}
}
/**
*
* 执行流程
*
* 输入文件 -> TokenizerMapper -> KeyCombiner -> IntSumReducer -> 输出到文件
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
System.setProperty("hadoop.home.dir", "D:\\soft\\hadoop-2.6.4");
//删除临时输出目录
WordCount.deleteDir();
conf = new Configuration();
Job job = Job.getInstance(); //得到 job的实例
job.setJobName("word count"); //设置任务名称
job.setJarByClass(WordCount.class);//设置类名
job.setMapperClass(TokenizerMapper.class);//设置用于处理maper的类
job.setCombinerClass(KeyCombiner.class); //用于合并处理的类
job.setReducerClass(IntSumReducer.class); //设置用于处理reduce的类
job.setOutputKeyClass(Text.class); //设置输出KEY的类
job.setOutputValueClass(IntWritable.class); //设置用于输出VALUE的类
FileInputFormat.addInputPath(job, inputPath); //设置输入参数路径
FileOutputFormat.setOutputPath(job, outPath); //设置持久化输出位置
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
/**
* 删除临时输出目录
*/
private static void deleteDir(){
Configuration conf = new Configuration();
FileSystem fs;
try {
fs = FileSystem.get(URI.create(hdfsPath),conf);
Path p=new Path(outPathStr);
boolean a=fs.delete(p,true);
System.out.println(a);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("delete Dir faild!");
}
}
}
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
tar jxvf 是解压指今
解压以bzip2压缩的文件
-j 解压命令(*.bz)
-x 释放
-v 释放时的信息
-f 指定解压文件
看看下面这些
tar -cvf a.tar a 创建文件a的tar包
tar -tvf a.tar 查看tar包包含的文件
tar -xvf a.tar 释放tar包文件
tar -rvf a.tar b 追加文件b到tar包a.tar
tar -Avf a.tar c.tar 追加c.tar包到a.tar包
tar -zcvf a.tar.gz a 创建文件a的gzip压缩的tar包
tar -ztvf a.tar.gz 查看文件a的tar压缩包内容
tar -zxvf aa.tar.gz 释放aa.tar.gz包的内容
tar -jcvf aa.tar.bz2 aa 创建文件a的bzip压缩的tar包
tar -jtvf aa.tar.bz2 查看文件a的tar压缩包内容
tar -jxvf aa.tar.bz2 释放aa.tar.bz2包的内 |
|