设为首页 收藏本站
查看: 2179|回复: 0

[经验分享] big data

[复制链接]

尚未签到

发表于 2017-3-3 08:26:49 | 显示全部楼层 |阅读模式
   禁止转载 我所遇见的世界会更美好
  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。



  • hadoop fs
DSC0000.jpg

DSC0001.jpg

  这些按照功能进行命名的命令的名称与Unix shell命令非常相似。使用help选项可以获得某个具体命令的详细说明。



  • hadoop fs –help ls
DSC0002.png

  这些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
DSC0003.png

  在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的文件信息:
DSC0004.png

  使用Hadoop fs -ls shell命令查询geoway_portal下的文件情况:
DSC0005.png

  以下代码实现将本地文件拷到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
  会了和能做项目是两个层次,完全不同的概念的撒。
DSC0006.png

DSC0007.png

DSC0008.png DSC0009.png

DSC00010.png

DSC00011.png

DSC00012.png

  时间戳可以变成时间表那样??
  slave2:
DSC00013.png

  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同时按下
DSC00014.png

DSC00015.png

DSC00016.png

DSC00017.png

  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是列存储,以列族为存储单位,传统的数据库是按行存储。
  即使行、列相同,得到的值也是不一样的(有时间戳)。
  回收策略:数据的压缩和整理,没用的都会删掉。
DSC00018.png

  HBase 优化需要的源代码
  一个物理机有且仅有一个HRegionServer 、可能含有一个HBase(集群中只有一个物理机含有)
  见图  HRegionServer 、HBase之间的关系相当于虚拟机的master、slave1、slave2....n
DSC00019.png

DSC00020.png

    这个架构也类似于hadoop本身的架构,由master和namenode存储元数据,真正的数据存储在datanode上(会有多个datanode)。
  -        Hmaster负责元数据存储,维护整个hbase集群的状态。
  -        HRegionServer是真正管理数据的增删改查(数据库的功能),用户提交的数据请求都是通过HRegionServer协调处理。
  &sup2;  每一个物理机器节点只能有一个HRegionServer。
  &sup2;  在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 对应一个列族
DSC00021.png

DSC00022.png



  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包的内

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-349445-1-1.html 上篇帖子: 如何运行Spark程序 下篇帖子: Spring Security3实现,权限动态获取
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表