精华内容
下载资源
问答
  • 哪个不是本地模式运行的条件
    千次阅读
    2017-06-01 17:32:55
    import org.apache.spark.{SparkConf, SparkContext}
    
    /**
      * Created by root on 2016/5/16.
      */
    object ForeachDemo {
    
      def main(args: Array[String]) {
        val conf = new SparkConf().setAppName("ForeachDemo").setMaster("local")
        val sc = new SparkContext(conf)
        //
        //
    
        sc.stop()
    
      }
    }

    更多相关内容
  • Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式。 Hadoop官方网站:http://hadoop.apache.org/ 1、本地运行模式 a) 官方Grep案例 其实就是按照给定的条件找到符合条件的单词。 $ mkdir ...

    演示的版本是:2.7.2 官方文档 

    Hadoop运行模式

    Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式。

    Hadoop官方网站:http://hadoop.apache.org/

    1、本地运行模式

    a)  官方Grep案例

    其实就是按照给定的条件找到符合条件的单词

      $ mkdir input      //1、创建在hadoop-2.7.2文件下面创建一个input文件夹 
      $ cp etc/hadoop/*.xml input     //2、将Hadoop的xml配置文件复制到input
      $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'       //3、执行share目录下的MapReduce程序
      $ cat output/*           //4、查看输出结果
    

     官方给的样例就是把 etc/haddop/ 里面所有以 .xml 结尾的文件拷贝到 input 目录里面,然后统计这些文件中 符合条件的单词是那些,这些信息保存在 output 目录里面, output 不能事先存在,不然会报错。

    执行流程:

    [atguigu@hadoop100 hadoop-2.7.2]$ 
    mkdir input
    [atguigu@hadoop100 hadoop-2.7.2]$ cp etc/hadoop/*.xml input
    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'
    19/01/27 05:15:36 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
    19/01/27 05:15:36 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
    19/01/27 05:15:36 INFO input.FileInputFormat: Total input paths to process : 8
    19/01/27 05:15:36 INFO mapreduce.JobSubmitter: number of splits:8
    19/01/27 05:15:36 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local857720284_0001
    19/01/27 05:15:36 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
    19/01/27 05:15:36 INFO mapreduce.Job: Running job: job_local857720284_0001
    19/01/27 05:15:36 INFO mapred.LocalJobRunner: OutputCommitter set in config null
    19/01/27 05:15:36 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:36 INFO mapred.LocalJobRunner: OutputCommitter is org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter
    19/01/27 05:15:36 INFO mapred.LocalJobRunner: Waiting for map tasks
    19/01/27 05:15:36 INFO mapred.LocalJobRunner: Starting task: attempt_local857720284_0001_m_000000_0
    19/01/27 05:15:36 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:36 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
    19/01/27 05:15:36 INFO mapred.MapTask: Processing split: file:/opt/module/hadoop-2.7.2/input/hadoop-policy.xml:0+9683
    19/01/27 05:15:37 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
    19/01/27 05:15:37 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
    19/01/27 05:15:37 INFO mapred.MapTask: soft limit at 83886080
    19/01/27 05:15:37 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
    19/01/27 05:15:37 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
    19/01/27 05:15:37 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: 
    19/01/27 05:15:37 INFO mapred.MapTask: Starting flush of map output
    19/01/27 05:15:37 INFO mapred.MapTask: Spilling map output
    19/01/27 05:15:37 INFO mapred.MapTask: bufstart = 0; bufend = 17; bufvoid = 104857600
    19/01/27 05:15:37 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214396(104857584); length = 1/6553600
    19/01/27 05:15:37 INFO mapred.MapTask: Finished spill 0
    19/01/27 05:15:37 INFO mapred.Task: Task:attempt_local857720284_0001_m_000000_0 is done. And is in the process of committing
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: map
    19/01/27 05:15:37 INFO mapred.Task: Task 'attempt_local857720284_0001_m_000000_0' done.
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Finishing task: attempt_local857720284_0001_m_000000_0
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Starting task: attempt_local857720284_0001_m_000001_0
    19/01/27 05:15:37 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:37 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
    19/01/27 05:15:37 INFO mapred.MapTask: Processing split: file:/opt/module/hadoop-2.7.2/input/kms-site.xml:0+5511
    19/01/27 05:15:37 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
    19/01/27 05:15:37 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
    19/01/27 05:15:37 INFO mapred.MapTask: soft limit at 83886080
    19/01/27 05:15:37 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
    19/01/27 05:15:37 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
    19/01/27 05:15:37 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: 
    19/01/27 05:15:37 INFO mapred.MapTask: Starting flush of map output
    19/01/27 05:15:37 INFO mapred.Task: Task:attempt_local857720284_0001_m_000001_0 is done. And is in the process of committing
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: map
    19/01/27 05:15:37 INFO mapred.Task: Task 'attempt_local857720284_0001_m_000001_0' done.
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Finishing task: attempt_local857720284_0001_m_000001_0
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Starting task: attempt_local857720284_0001_m_000002_0
    19/01/27 05:15:37 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:37 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
    19/01/27 05:15:37 INFO mapred.MapTask: Processing split: file:/opt/module/hadoop-2.7.2/input/capacity-scheduler.xml:0+4436
    19/01/27 05:15:37 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
    19/01/27 05:15:37 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
    19/01/27 05:15:37 INFO mapred.MapTask: soft limit at 83886080
    19/01/27 05:15:37 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
    19/01/27 05:15:37 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
    19/01/27 05:15:37 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: 
    19/01/27 05:15:37 INFO mapred.MapTask: Starting flush of map output
    19/01/27 05:15:37 INFO mapred.Task: Task:attempt_local857720284_0001_m_000002_0 is done. And is in the process of committing
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: map
    19/01/27 05:15:37 INFO mapred.Task: Task 'attempt_local857720284_0001_m_000002_0' done.
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Finishing task: attempt_local857720284_0001_m_000002_0
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Starting task: attempt_local857720284_0001_m_000003_0
    19/01/27 05:15:37 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:37 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
    19/01/27 05:15:37 INFO mapred.MapTask: Processing split: file:/opt/module/hadoop-2.7.2/input/kms-acls.xml:0+3518
    19/01/27 05:15:37 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
    19/01/27 05:15:37 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
    19/01/27 05:15:37 INFO mapred.MapTask: soft limit at 83886080
    19/01/27 05:15:37 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
    19/01/27 05:15:37 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
    19/01/27 05:15:37 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: 
    19/01/27 05:15:37 INFO mapred.MapTask: Starting flush of map output
    19/01/27 05:15:37 INFO mapred.Task: Task:attempt_local857720284_0001_m_000003_0 is done. And is in the process of committing
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: map
    19/01/27 05:15:37 INFO mapred.Task: Task 'attempt_local857720284_0001_m_000003_0' done.
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Finishing task: attempt_local857720284_0001_m_000003_0
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Starting task: attempt_local857720284_0001_m_000004_0
    19/01/27 05:15:37 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:37 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
    19/01/27 05:15:37 INFO mapred.MapTask: Processing split: file:/opt/module/hadoop-2.7.2/input/hdfs-site.xml:0+775
    19/01/27 05:15:37 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
    19/01/27 05:15:37 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
    19/01/27 05:15:37 INFO mapred.MapTask: soft limit at 83886080
    19/01/27 05:15:37 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
    19/01/27 05:15:37 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
    19/01/27 05:15:37 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: 
    19/01/27 05:15:37 INFO mapred.MapTask: Starting flush of map output
    19/01/27 05:15:37 INFO mapred.Task: Task:attempt_local857720284_0001_m_000004_0 is done. And is in the process of committing
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: map
    19/01/27 05:15:37 INFO mapred.Task: Task 'attempt_local857720284_0001_m_000004_0' done.
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Finishing task: attempt_local857720284_0001_m_000004_0
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Starting task: attempt_local857720284_0001_m_000005_0
    19/01/27 05:15:37 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:37 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
    19/01/27 05:15:37 INFO mapred.MapTask: Processing split: file:/opt/module/hadoop-2.7.2/input/core-site.xml:0+774
    19/01/27 05:15:37 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
    19/01/27 05:15:37 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
    19/01/27 05:15:37 INFO mapred.MapTask: soft limit at 83886080
    19/01/27 05:15:37 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
    19/01/27 05:15:37 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
    19/01/27 05:15:37 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: 
    19/01/27 05:15:37 INFO mapred.MapTask: Starting flush of map output
    19/01/27 05:15:37 INFO mapred.Task: Task:attempt_local857720284_0001_m_000005_0 is done. And is in the process of committing
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: map
    19/01/27 05:15:37 INFO mapred.Task: Task 'attempt_local857720284_0001_m_000005_0' done.
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Finishing task: attempt_local857720284_0001_m_000005_0
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Starting task: attempt_local857720284_0001_m_000006_0
    19/01/27 05:15:37 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:37 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
    19/01/27 05:15:37 INFO mapred.MapTask: Processing split: file:/opt/module/hadoop-2.7.2/input/yarn-site.xml:0+690
    19/01/27 05:15:37 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
    19/01/27 05:15:37 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
    19/01/27 05:15:37 INFO mapred.MapTask: soft limit at 83886080
    19/01/27 05:15:37 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
    19/01/27 05:15:37 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
    19/01/27 05:15:37 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: 
    19/01/27 05:15:37 INFO mapred.MapTask: Starting flush of map output
    19/01/27 05:15:37 INFO mapred.Task: Task:attempt_local857720284_0001_m_000006_0 is done. And is in the process of committing
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: map
    19/01/27 05:15:37 INFO mapred.Task: Task 'attempt_local857720284_0001_m_000006_0' done.
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Finishing task: attempt_local857720284_0001_m_000006_0
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Starting task: attempt_local857720284_0001_m_000007_0
    19/01/27 05:15:37 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:37 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
    19/01/27 05:15:37 INFO mapred.MapTask: Processing split: file:/opt/module/hadoop-2.7.2/input/httpfs-site.xml:0+620
    19/01/27 05:15:37 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
    19/01/27 05:15:37 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
    19/01/27 05:15:37 INFO mapred.MapTask: soft limit at 83886080
    19/01/27 05:15:37 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
    19/01/27 05:15:37 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
    19/01/27 05:15:37 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: 
    19/01/27 05:15:37 INFO mapred.MapTask: Starting flush of map output
    19/01/27 05:15:37 INFO mapred.Task: Task:attempt_local857720284_0001_m_000007_0 is done. And is in the process of committing
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: map
    19/01/27 05:15:37 INFO mapred.Task: Task 'attempt_local857720284_0001_m_000007_0' done.
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Finishing task: attempt_local857720284_0001_m_000007_0
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: map task executor complete.
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Waiting for reduce tasks
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Starting task: attempt_local857720284_0001_r_000000_0
    19/01/27 05:15:37 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:37 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
    19/01/27 05:15:37 INFO mapred.ReduceTask: Using ShuffleConsumerPlugin: org.apache.hadoop.mapreduce.task.reduce.Shuffle@6eedaff1
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: MergerManager: memoryLimit=334338464, maxSingleShuffleLimit=83584616, mergeThreshold=220663392, ioSortFactor=10, memToMemMergeOutputsThreshold=10
    19/01/27 05:15:37 INFO reduce.EventFetcher: attempt_local857720284_0001_r_000000_0 Thread started: EventFetcher for fetching Map Completion Events
    19/01/27 05:15:37 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local857720284_0001_m_000005_0 decomp: 2 len: 6 to MEMORY
    19/01/27 05:15:37 INFO reduce.InMemoryMapOutput: Read 2 bytes from map-output for attempt_local857720284_0001_m_000005_0
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 2, inMemoryMapOutputs.size() -> 1, commitMemory -> 0, usedMemory ->2
    19/01/27 05:15:37 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local857720284_0001_m_000001_0 decomp: 2 len: 6 to MEMORY
    19/01/27 05:15:37 INFO reduce.InMemoryMapOutput: Read 2 bytes from map-output for attempt_local857720284_0001_m_000001_0
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 2, inMemoryMapOutputs.size() -> 2, commitMemory -> 2, usedMemory ->4
    19/01/27 05:15:37 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local857720284_0001_m_000004_0 decomp: 2 len: 6 to MEMORY
    19/01/27 05:15:37 INFO reduce.InMemoryMapOutput: Read 2 bytes from map-output for attempt_local857720284_0001_m_000004_0
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 2, inMemoryMapOutputs.size() -> 3, commitMemory -> 4, usedMemory ->6
    19/01/27 05:15:37 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local857720284_0001_m_000007_0 decomp: 2 len: 6 to MEMORY
    19/01/27 05:15:37 INFO reduce.InMemoryMapOutput: Read 2 bytes from map-output for attempt_local857720284_0001_m_000007_0
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 2, inMemoryMapOutputs.size() -> 4, commitMemory -> 6, usedMemory ->8
    19/01/27 05:15:37 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local857720284_0001_m_000000_0 decomp: 21 len: 25 to MEMORY
    19/01/27 05:15:37 INFO reduce.InMemoryMapOutput: Read 21 bytes from map-output for attempt_local857720284_0001_m_000000_0
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 21, inMemoryMapOutputs.size() -> 5, commitMemory -> 8, usedMemory ->29
    19/01/27 05:15:37 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local857720284_0001_m_000003_0 decomp: 2 len: 6 to MEMORY
    19/01/27 05:15:37 INFO reduce.InMemoryMapOutput: Read 2 bytes from map-output for attempt_local857720284_0001_m_000003_0
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 2, inMemoryMapOutputs.size() -> 6, commitMemory -> 29, usedMemory ->31
    19/01/27 05:15:37 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local857720284_0001_m_000006_0 decomp: 2 len: 6 to MEMORY
    19/01/27 05:15:37 WARN io.ReadaheadPool: Failed readahead on ifile
    EBADF: Bad file descriptor
    	at org.apache.hadoop.io.nativeio.NativeIO$POSIX.posix_fadvise(Native Method)
    	at org.apache.hadoop.io.nativeio.NativeIO$POSIX.posixFadviseIfPossible(NativeIO.java:267)
    	at org.apache.hadoop.io.nativeio.NativeIO$POSIX$CacheManipulator.posixFadviseIfPossible(NativeIO.java:146)
    	at org.apache.hadoop.io.ReadaheadPool$ReadaheadRequestImpl.run(ReadaheadPool.java:206)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    	at java.lang.Thread.run(Thread.java:748)
    19/01/27 05:15:37 INFO reduce.InMemoryMapOutput: Read 2 bytes from map-output for attempt_local857720284_0001_m_000006_0
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 2, inMemoryMapOutputs.size() -> 7, commitMemory -> 31, usedMemory ->33
    19/01/27 05:15:37 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local857720284_0001_m_000002_0 decomp: 2 len: 6 to MEMORY
    19/01/27 05:15:37 INFO reduce.InMemoryMapOutput: Read 2 bytes from map-output for attempt_local857720284_0001_m_000002_0
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 2, inMemoryMapOutputs.size() -> 8, commitMemory -> 33, usedMemory ->35
    19/01/27 05:15:37 INFO reduce.EventFetcher: EventFetcher is interrupted.. Returning
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: 8 / 8 copied.
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: finalMerge called with 8 in-memory map-outputs and 0 on-disk map-outputs
    19/01/27 05:15:37 INFO mapred.Merger: Merging 8 sorted segments
    19/01/27 05:15:37 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 10 bytes
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: Merged 8 segments, 35 bytes to disk to satisfy reduce memory limit
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: Merging 1 files, 25 bytes from disk
    19/01/27 05:15:37 INFO reduce.MergeManagerImpl: Merging 0 segments, 0 bytes from memory into reduce
    19/01/27 05:15:37 INFO mapred.Merger: Merging 1 sorted segments
    19/01/27 05:15:37 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 10 bytes
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: 8 / 8 copied.
    19/01/27 05:15:37 INFO Configuration.deprecation: mapred.skip.on is deprecated. Instead, use mapreduce.job.skiprecords
    19/01/27 05:15:37 INFO mapred.Task: Task:attempt_local857720284_0001_r_000000_0 is done. And is in the process of committing
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: 8 / 8 copied.
    19/01/27 05:15:37 INFO mapred.Task: Task attempt_local857720284_0001_r_000000_0 is allowed to commit now
    19/01/27 05:15:37 INFO output.FileOutputCommitter: Saved output of task 'attempt_local857720284_0001_r_000000_0' to file:/opt/module/hadoop-2.7.2/grep-temp-476836355/_temporary/0/task_local857720284_0001_r_000000
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: reduce > reduce
    19/01/27 05:15:37 INFO mapred.Task: Task 'attempt_local857720284_0001_r_000000_0' done.
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: Finishing task: attempt_local857720284_0001_r_000000_0
    19/01/27 05:15:37 INFO mapred.LocalJobRunner: reduce task executor complete.
    19/01/27 05:15:37 INFO mapreduce.Job: Job job_local857720284_0001 running in uber mode : false
    19/01/27 05:15:37 INFO mapreduce.Job:  map 100% reduce 100%
    19/01/27 05:15:37 INFO mapreduce.Job: Job job_local857720284_0001 completed successfully
    19/01/27 05:15:37 INFO mapreduce.Job: Counters: 30
    	File System Counters
    		FILE: Number of bytes read=2693510
    		FILE: Number of bytes written=5030435
    		FILE: Number of read operations=0
    		FILE: Number of large read operations=0
    		FILE: Number of write operations=0
    	Map-Reduce Framework
    		Map input records=745
    		Map output records=1
    		Map output bytes=17
    		Map output materialized bytes=67
    		Input split bytes=925
    		Combine input records=1
    		Combine output records=1
    		Reduce input groups=1
    		Reduce shuffle bytes=67
    		Reduce input records=1
    		Reduce output records=1
    		Spilled Records=2
    		Shuffled Maps =8
    		Failed Shuffles=0
    		Merged Map outputs=8
    		GC time elapsed (ms)=252
    		Total committed heap usage (bytes)=2667053056
    	Shuffle Errors
    		BAD_ID=0
    		CONNECTION=0
    		IO_ERROR=0
    		WRONG_LENGTH=0
    		WRONG_MAP=0
    		WRONG_REDUCE=0
    	File Input Format Counters 
    		Bytes Read=26007
    	File Output Format Counters 
    		Bytes Written=123
    19/01/27 05:15:37 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
    19/01/27 05:15:38 INFO input.FileInputFormat: Total input paths to process : 1
    19/01/27 05:15:38 INFO mapreduce.JobSubmitter: number of splits:1
    19/01/27 05:15:38 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local326049581_0002
    19/01/27 05:15:38 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
    19/01/27 05:15:38 INFO mapreduce.Job: Running job: job_local326049581_0002
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: OutputCommitter set in config null
    19/01/27 05:15:38 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: OutputCommitter is org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: Waiting for map tasks
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: Starting task: attempt_local326049581_0002_m_000000_0
    19/01/27 05:15:38 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:38 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
    19/01/27 05:15:38 INFO mapred.MapTask: Processing split: file:/opt/module/hadoop-2.7.2/grep-temp-476836355/part-r-00000:0+111
    19/01/27 05:15:38 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
    19/01/27 05:15:38 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
    19/01/27 05:15:38 INFO mapred.MapTask: soft limit at 83886080
    19/01/27 05:15:38 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
    19/01/27 05:15:38 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
    19/01/27 05:15:38 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: 
    19/01/27 05:15:38 INFO mapred.MapTask: Starting flush of map output
    19/01/27 05:15:38 INFO mapred.MapTask: Spilling map output
    19/01/27 05:15:38 INFO mapred.MapTask: bufstart = 0; bufend = 17; bufvoid = 104857600
    19/01/27 05:15:38 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214396(104857584); length = 1/6553600
    19/01/27 05:15:38 INFO mapred.MapTask: Finished spill 0
    19/01/27 05:15:38 INFO mapred.Task: Task:attempt_local326049581_0002_m_000000_0 is done. And is in the process of committing
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: map
    19/01/27 05:15:38 INFO mapred.Task: Task 'attempt_local326049581_0002_m_000000_0' done.
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: Finishing task: attempt_local326049581_0002_m_000000_0
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: map task executor complete.
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: Waiting for reduce tasks
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: Starting task: attempt_local326049581_0002_r_000000_0
    19/01/27 05:15:38 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
    19/01/27 05:15:38 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
    19/01/27 05:15:38 INFO mapred.ReduceTask: Using ShuffleConsumerPlugin: org.apache.hadoop.mapreduce.task.reduce.Shuffle@67af1c61
    19/01/27 05:15:38 INFO reduce.MergeManagerImpl: MergerManager: memoryLimit=334338464, maxSingleShuffleLimit=83584616, mergeThreshold=220663392, ioSortFactor=10, memToMemMergeOutputsThreshold=10
    19/01/27 05:15:38 INFO reduce.EventFetcher: attempt_local326049581_0002_r_000000_0 Thread started: EventFetcher for fetching Map Completion Events
    19/01/27 05:15:38 INFO reduce.LocalFetcher: localfetcher#2 about to shuffle output of map attempt_local326049581_0002_m_000000_0 decomp: 21 len: 25 to MEMORY
    19/01/27 05:15:38 INFO reduce.InMemoryMapOutput: Read 21 bytes from map-output for attempt_local326049581_0002_m_000000_0
    19/01/27 05:15:38 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 21, inMemoryMapOutputs.size() -> 1, commitMemory -> 0, usedMemory ->21
    19/01/27 05:15:38 INFO reduce.EventFetcher: EventFetcher is interrupted.. Returning
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: 1 / 1 copied.
    19/01/27 05:15:38 INFO reduce.MergeManagerImpl: finalMerge called with 1 in-memory map-outputs and 0 on-disk map-outputs
    19/01/27 05:15:38 INFO mapred.Merger: Merging 1 sorted segments
    19/01/27 05:15:38 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 11 bytes
    19/01/27 05:15:38 INFO reduce.MergeManagerImpl: Merged 1 segments, 21 bytes to disk to satisfy reduce memory limit
    19/01/27 05:15:38 INFO reduce.MergeManagerImpl: Merging 1 files, 25 bytes from disk
    19/01/27 05:15:38 INFO reduce.MergeManagerImpl: Merging 0 segments, 0 bytes from memory into reduce
    19/01/27 05:15:38 INFO mapred.Merger: Merging 1 sorted segments
    19/01/27 05:15:38 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 11 bytes
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: 1 / 1 copied.
    19/01/27 05:15:38 INFO mapred.Task: Task:attempt_local326049581_0002_r_000000_0 is done. And is in the process of committing
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: 1 / 1 copied.
    19/01/27 05:15:38 INFO mapred.Task: Task attempt_local326049581_0002_r_000000_0 is allowed to commit now
    19/01/27 05:15:38 INFO output.FileOutputCommitter: Saved output of task 'attempt_local326049581_0002_r_000000_0' to file:/opt/module/hadoop-2.7.2/output/_temporary/0/task_local326049581_0002_r_000000
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: reduce > reduce
    19/01/27 05:15:38 INFO mapred.Task: Task 'attempt_local326049581_0002_r_000000_0' done.
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: Finishing task: attempt_local326049581_0002_r_000000_0
    19/01/27 05:15:38 INFO mapred.LocalJobRunner: reduce task executor complete.
    19/01/27 05:15:39 INFO mapreduce.Job: Job job_local326049581_0002 running in uber mode : false
    19/01/27 05:15:39 INFO mapreduce.Job:  map 100% reduce 100%
    19/01/27 05:15:39 INFO mapreduce.Job: Job job_local326049581_0002 completed successfully
    19/01/27 05:15:39 INFO mapreduce.Job: Counters: 30
    	File System Counters
    		FILE: Number of bytes read=1159582
    		FILE: Number of bytes written=2231696
    		FILE: Number of read operations=0
    		FILE: Number of large read operations=0
    		FILE: Number of write operations=0
    	Map-Reduce Framework
    		Map input records=1
    		Map output records=1
    		Map output bytes=17
    		Map output materialized bytes=25
    		Input split bytes=127
    		Combine input records=0
    		Combine output records=0
    		Reduce input groups=1
    		Reduce shuffle bytes=25
    		Reduce input records=1
    		Reduce output records=1
    		Spilled Records=2
    		Shuffled Maps =1
    		Failed Shuffles=0
    		Merged Map outputs=1
    		GC time elapsed (ms)=0
    		Total committed heap usage (bytes)=658505728
    	Shuffle Errors
    		BAD_ID=0
    		CONNECTION=0
    		IO_ERROR=0
    		WRONG_LENGTH=0
    		WRONG_MAP=0
    		WRONG_REDUCE=0
    	File Input Format Counters 
    		Bytes Read=123
    	File Output Format Counters 
    		Bytes Written=23
    [atguigu@hadoop100 hadoop-2.7.2]$ cat output/*
    1	dfsadmin
    [atguigu@hadoop100 hadoop-2.7.2]$ 
    

     通过结果可得到 input 目录中的文件满足条件的就只有一个单词 dfsadmin。

    把正则的 dfs 改为 kms:

    [atguigu@hadoop100 hadoop-2.7.2]$ rm -rf output/
    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'kms[a-z.]+'
    19/01/27 05:20:07 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
                 ...
                   ...
                    ...
    		Bytes Read=1057
    	File Output Format Counters 
    		Bytes Written=715
    [atguigu@hadoop100 hadoop-2.7.2]$ cat output/*
    9	kms.acl.
    2	kms.keytab
    1	kms.key.provider.uri
    1	kms.current.key.cache.timeout.ms
    1	kms.cache.timeout.ms
    1	kms.cache.enable
    1	kms.authentication.type
    1	kms.authentication.signer.secret.provider.zookeeper.path
    1	kms.authentication.signer.secret.provider.zookeeper.kerberos.principal
    1	kms.keystore
    1	kms.authentication.signer.secret.provider.zookeeper.connection.string
    1	kms.authentication.signer.secret.provider.zookeeper.auth.type
    1	kms.authentication.signer.secret.provider
    1	kms.authentication.kerberos.principal
    1	kms.authentication.kerberos.name.rules
    1	kms.authentication.kerberos.keytab
    1	kms.audit.aggregation.window.ms
    1	kms.authentication.signer.secret.provider.zookeeper.kerberos.keytab
    [atguigu@hadoop100 hadoop-2.7.2]$ 
    

     

     

     

    b)  官方WordCount案例

    通过单词意思就知道是统计单词的个数,这个案例很经典很实用,面试经常问

    准备工作:

    1.    创建在hadoop-2.7.2文件下面创建一个wcinput文件夹

    [atguigu@hadoop100 hadoop-2.7.2]$ mkdir wcinput

    2.    在wcinput文件下创建一个wc.input文件 

     [atguigu@hadoop100 hadoop-2.7.2]$ cd wcinput
    [atguigu@hadoop100 wcinput]$ touch wc.input

    3.编辑wc.input文件

     [atguigu@hadoop100 wcinput]$ vi wc.input 

    在文件中输入如下内容
    hadoop yarn
    hadoop mapreduce
    atguigu
    atguigu
    保存退出::wq 

    4.    回到Hadoop目录/opt/module/hadoop-2.7.2 

    下面我们就可以运行官方给我们提供的 WordCount 案例:

    5.    执行程序 

    [atguigu@hadoop100 hadoop-2.7.2]$ hadoop jar  share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput 

    6.    查看结果

    [atguigu@hadoop100 hadoop-2.7.2]$ cat wcoutput/part-r-00000
    atguigu 2
    hadoop  2
    mapreduce       1
    yarn    1

    hadoop jar share/hadoop/mapreduce/mkdir wcinput
    [atguigu@hadoop100 hadoop-2.7.2]$ cd wcinput
    [atguigu@hadoop100 wcinput]$ touch wc.input
    [atguigu@hadoop100 wcinput]$ vi wc.input
    [atguigu@hadoop100 wcinput]$ cd ..
    [atguigu@hadoop100 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput
    19/01/27 05:48:06 INFO Configuration.deprecation: session.id is deprecated. Instead, use 
    ..........................
    		Bytes Written=50
    [atguigu@hadoop100 hadoop-2.7.2]$ cat wcoutput/*
    atguigu	2
    hadoop	2
    mapreduce	1
    yarn	1
    [atguigu@hadoop100 hadoop-2.7.2]$ 
    

     

     

     


    2、伪分布式运行模式

     

    2.1、启动HDFS并运行MapReduce程序

    步骤:

    a)分析

           (1)配置集群

           (2)启动、测试集群增、删、查

           (3)执行WordCount案例

    b)执行步骤

    (1)配置集群

           (a)配置:hadoop-env.sh   sudo vi etc/hadoop/hadoop-env.sh  (注意这里的etc 是Hadoop里面的,不是Linux 里面的 etc)

    Linux系统中获取JDK的安装路径:

    [atguigu@ hadoop100 ~]# echo $JAVA_HOME

    /opt/module/jdk1.8.0_144

    修改JAVA_HOME 路径:vi /etc/profile

    export JAVA_HOME=/opt/module/jdk1.8.0_144

     

     

           (b)配置:core-site.xml  vi etc/hadoop/core-site.xml 

    <!-- 指定HDFS中NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop101:9000</value>
    </property>

    <!-- 指定Hadoop运行时产生文件的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.7.2/data/tmp</value>
    </property>

    !!!!!!!!!!!!!!!!:配置了这个,在去执行上面的本地模式,本地模式不可以用了,默认是本地模式,现在改了。 

     

     如果不指定Hadoop运行时产生文件的存储目录,他默认的目录是  /tmp/hadoop-用户名  (自动创建),在系统的根目录。配置的目录无需提前创建系统自动创建。

    vi etc/hadoop/core-site.xml 
    [atguigu@hadoop100 hadoop-2.7.2]$ sudo vi etc/hadoop/core-site.xml 
    [sudo] password for atguigu: 
    [atguigu@hadoop100 hadoop-2.7.2]$ 

     

           (c)配置:hdfs-site.xml  sudo vi etc/hadoop/hdfs-site.xml (这个配不配置都行)

    <!-- 指定HDFS副本的数量 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property> 

     注:默认个数是3个,也就是在3台机器上存储了同一份数据,任何一个存储数据的节点挂掉,那么还有两份,同时它会在其他服务器上增加一份节点副本,始终保持集群上的副本数是3,副本数的多少取决于集群机器的质量。

    如果只有一台机器就算默认的是3个,也只有一个备份,你后面增加它就会给你备份。

     

    (2)启动集群

           (a)格式化NameNode(第一次启动时格式化,以后就不要总格式化)

    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hdfs namenode  -format

    注意:格式化需要把 Hadoop 里面的数据删除掉(所以说第一次是没有问题,后面就可能有问题)。

           (b)启动NameNode

    [atguigu@hadoop100 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

           (c)启动DataNode

    [atguigu@hadoop100 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode

    (3)查看集群

           (a)查看是否启动成功

    [atguigu@hadoop100 hadoop-2.7.2]$ jps
    5302 DataNode
    5495 Jps
    5449 NameNode

    注意:jpsJDK中的命令,不是Linux命令。不安装JDK不能使用jps 

           (b)web端查看HDFS文件系统   http://hadoop100:50070/dfshealth.html#tab-overview

     

    注意:hadoop100 需要实现在 Windows 或者 Linux 系统里面配置好 (C:\Windows\System32\drivers\etc\hosts),取决于你的游览器是在拿个系统里面。

    如果不能查看,看如下帖子处理     https://blog.csdn.net/qq_40794973/article/details/86663969

     

    在 sdfs 的根目录下创建多级目录

    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -mkdir -p /usr/atguigu/input
    [atguigu@hadoop100 hadoop-2.7.2]$ 
    

    dfs 用来定义路径的 

     bin/hdfs dfs 后面跟要执行的命令

    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -ls /
    Found 1 items
    drwxr-xr-x   - atguigu supergroup          0 2019-01-27 19:00 /usr
    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -lsr /
    lsr: DEPRECATED: Please use 'ls -R' instead.
    drwxr-xr-x   - atguigu supergroup          0 2019-01-27 19:00 /usr
    drwxr-xr-x   - atguigu supergroup          0 2019-01-27 19:00 /usr/atguigu
    drwxr-xr-x   - atguigu supergroup          0 2019-01-27 19:00 /usr/atguigu/input
    [atguigu@hadoop100 hadoop-2.7.2]$ 
    

     

     

    把本地的文件上传到 hdfs上面,上传到刚刚创建的多级目录 input 里面     bin/hdfs dfs -put wcinput/wc.input /usr/atguigu/input

     

     

     在 hdfs 上面跑一个 WordCount 案例 (输入文件上面已经上传到了 /usr/atguigu/input 目录里面)

    [atguigu@hadoop100 hadoop-2.7.2]$ jps
    3269 DataNode
    3205 NameNode
    4622 Jps
    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /usr/atguigu/input/wc.input  /usr/atguigu/output
    

    成功

     

           (c)查看产生的Log日志

    说明:在企业中遇到Bug时,经常根据日志提示信息去分析问题、解决Bug

    当前目录:/opt/module/hadoop-2.7.2/logs

    [atguigu@hadoop100 logs]$ ls
    hadoop-atguigu-datanode-hadoop100.log  hadoop-atguigu-namenode-hadoop100.out
    hadoop-atguigu-datanode-hadoop100.out  SecurityAuth-atguigu.audit
    hadoop-atguigu-namenode-hadoop100.log
    [atguigu@hadoop100 logs]$ cat hadoop-atguigu-datanode-hadoop100.log

    d)思考:为什么不能一直格式化NameNode,格式化NameNode,要注意什么?

    [atguigu@hadoop100 hadoop-2.7.2]$ cat data/tmp/dfs/name/current/VERSION 
    #Sun Jan 27 18:18:10 CST 2019
    namespaceID=64968429
    clusterID=CID-a4ad884d-998c-47df-b315-ae4e0a8e874d
    cTime=0
    storageType=NAME_NODE
    blockpoolID=BP-244670385-192.168.19.100-1548584290557
    layoutVersion=-63
    [atguigu@hadoop100 hadoop-2.7.2]$ cat  data/tmp/dfs/data/current/VERSION 
    #Sun Jan 27 18:18:34 CST 2019
    storageID=DS-fdc0a442-60e5-42ea-98b8-a0b90a5954ac
    clusterID=CID-a4ad884d-998c-47df-b315-ae4e0a8e874d
    cTime=0
    datanodeUuid=022f01d6-9a59-4fe5-8e9a-a86251f0afcd
    storageType=DATA_NODE
    layoutVersion=-56
    [atguigu@hadoop100 hadoop-2.7.2]$ 

     

    [atguigu@hadoop100 hadoop-2.7.2]$ cd data/tmp/dfs/
    [atguigu@hadoop100 dfs]$ tree
    .
    ├── data
    │   ├── current
    │   │   ├── BP-244670385-192.168.19.100-1548584290557
    │   │   │   ├── current
    │   │   │   │   ├── finalized
    │   │   │   │   │   └── subdir0
    │   │   │   │   │       └── subdir0
    │   │   │   │   │           ├── blk_1073741825
    │   │   │   │   │           ├── blk_1073741825_1001.meta
    │   │   │   │   │           ├── blk_1073741826
    │   │   │   │   │           └── blk_1073741826_1002.meta
    │   │   │   │   ├── rbw
    │   │   │   │   └── VERSION
    │   │   │   ├── scanner.cursor
    │   │   │   └── tmp
    │   │   └── VERSION
    │   └── in_use.lock
    └── name
        ├── current
        │   ├── edits_inprogress_0000000000000000001
        │   ├── fsimage_0000000000000000000
        │   ├── fsimage_0000000000000000000.md5
        │   ├── seen_txid
        │   └── VERSION
        └── in_use.lock
    
    11 directories, 14 files
    

    注意:格式化NameNode,会产生新的集群id,导致NameNodeDataNode的集群id不一致,集群找不到已往数据。所以,格式NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode 

           (4)操作集群

    (a)在HDFS文件系统上创建一个input文件夹

    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -mkdir -p /user/atguigu/input

    (b)将测试文件内容上传到文件系统上

    [atguigu@hadoop100 hadoop-2.7.2]$bin/hdfs dfs -put wcinput/wc.input  /user/atguigu/input/

    (c)查看上传的文件是否正确

    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -ls  /user/atguigu/input/

    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -cat  /user/atguigu/ input/wc.input

    (d)运行MapReduce程序

    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hadoop  jar  share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount  /user/atguigu/input/   /user/atguigu/output

    (e)查看输出结果

    命令行查看:
    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/atguigu/output/*

    浏览器查看output文件,如图2-34所示


     
    (f)将测试文件内容下载到本地

    [atguigu@hadoop100 hadoop-2.7.2]$hdfs dfs -get /user/atguigu/output/part-r-00000  ./wcoutput/

    (g)删除输出结果

    [atguigu@hadoop100 hadoop-2.7.2]$ hdfs dfs -rm -r  /user/atguigu/output
     

     

    2.2、启动YARN并运行MapReduce程序

    a)分析

           (1)配置集群在YARN上运行MR

           (2)启动、测试集群增、删、查

           (3)在YARN上执行WordCount案例

    b) 执行步骤       

           (1)配置集群

    (a)配置 yarn-env.sh   vi etc/hadoop/yarn-env.sh   配置一下JAVA_HOME

    export JAVA_HOME=/opt/module/jdk1.8.0_144

    (b)配置 yarn-site.xml     vi etc/hadoop/yarn-site.xml

     <!-- Reducer获取数据的方式 --> 
    <property>
             <name>yarn.nodemanager.aux-services</name>
             <value>mapreduce_shuffle</value>
    </property>

    <!-- 指定YARN的ResourceManager的地址 -->
    <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>hadoop100</value>
    </property>

    (c)配置:mapred-env.sh  vi etc/hadoop/mapred-env.sh  配置一下JAVA_HOME

    export JAVA_HOME=/opt/module/jdk1.8.0_144

    (d)配置: (对mapred-site.xml.template重新命名为) mapred-site.xml

    [atguigu@hadoop100 hadoop-2.7.2]$ cd etc/hadoop
    [atguigu@hadoop100 hadoop]$ mv mapred-site.xml.template mapred-site.xml
    [atguigu@hadoop100 hadoop]$ vi mapred-site.xml

     <!-- 指定MR运行在YARN上 -->
    <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
    </property>

    注:默认是本地运行。

     

            (2)启动集群

    (a)启动前必须保证 NameNode 和 DataNode 已经启动

    [atguigu@hadoop100 hadoop-2.7.2]$ jps
    3269 DataNode
    3205 NameNode
    5948 Jps

    (b)启动ResourceManager

    [atguigu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager

    (c)启动NodeManager

    [atguigu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager

     [atguigu@hadoop100 hadoop-2.7.2]$ jps
    3269 DataNode
    3205 NameNode
    5991 ResourceManager
    6348 Jps
    6271 NodeManager

            (3)集群操作

    (a)YARN的浏览器页面查看,如下图所示   http://hadoop100:8088/cluster

    (b)删除文件系统上的output文件

    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -rm -r  /user/atguigu/output

    (c)执行MapReduce程序 

    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hadoop jar  share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input  /user/atguigu/output

    (d)查看运行结果

    [atguigu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/atguigu/output/*  

     

     

     2.3、配置历史服务器

    为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:

    (1)、配置 mapred-site.xml

    [atguigu@hadoop100 hadoop-2.7.2]$ cd etc/hadoop/
    [atguigu@hadoop100 hadoop]$ vi mapred-site.xml

    在该文件里面增加如下配置:

    <!-- 历史服务器端地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop100:10020</value>
    </property>
    <!-- 历史服务器web端地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop100:19888</value>
    </property>

    (2)、  启动历史服务器

    [atguigu@hadoop100 hadoop]$ cd ../..
    [atguigu@hadoop100 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver

    (3)、 查看历史服务器是否启动

    [atguigu@hadoop100 hadoop-2.7.2]$ jps
    7076 Jps
    3269 DataNode
    3205 NameNode
    5991 ResourceManager
    7033 JobHistoryServer
    6271 NodeManager

    (4)、查看JobHistory    http://hadoop100:19888/jobhistory

     

    2.4、配置日志的聚集

    日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
    日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
    注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
    开启日志聚集功能具体步骤如下:

    (1)、配置 yarn-site.xml

    [atguigu@hadoop100 hadoop-2.7.2]$ cd etc/hadoop/
    [atguigu@hadoop100 hadoop]$ vi yarn-site.xml

    在该文件里面增加如下配置:

    <!-- 日志聚集功能使能 -->
    <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
    </property>

    <!-- 日志保留时间设置7天  秒为单位 -->
    <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
    </property> 

    (2)、关闭NodeManager 、ResourceManager和HistoryManager

    [atguigu@hadoop100 hadoop]$ cd ../..
    [atguigu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop resourcemanager
    [atguigu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager
    [atguigu@hadoop100 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh stop historyserver

    (3)、启动NodeManager 、ResourceManager和HistoryManager

    [atguigu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager

    [atguigu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager

    [atguigu@hadoop100 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver

    [atguigu@hadoop100 hadoop-2.7.2]$ jps
    8389 Jps
    3269 DataNode
    3205 NameNode
    7401 ResourceManager
    7801 JobHistoryServer
    7674 NodeManager 

    (4)、删除HDFS上已经存在的输出文件

    [atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -rm -r /user/atguigu/output

    (5)、执行WordCount程序

    [atguigu@hadoop101 hadoop-2.7.2]$ hadoop jar  share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount  /user/atguigu/input  /user/atguigu/output

    (6)、查看日志    http://hadoop100:19888/jobhistory

     

     

    2.5、配置文件说明 

    Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。

    (1)默认配置文件:

    要获取的默认文件

    文件存放在Hadoop的jar包中的位置

    [core-default.xml]

    hadoop-common-2.7.2.jar/ core-default.xml

    [hdfs-default.xml]

    hadoop-hdfs-2.7.2.jar/ hdfs-default.xml

    [yarn-default.xml]

    hadoop-yarn-common-2.7.2.jar/ yarn-default.xml

    [mapred-default.xml]

    hadoop-mapreduce-client-core-2.7.2.jar/ mapred-default.xml

     

     

     

     

     

     

    (2)自定义配置文件:

           core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。

     

    展开全文
  • 在hive中运行的sql有很多是比较小的sql,数据量小,计算量小 ,这些比较小的sql如果也采用分布式的方式来执行,那么是得不偿失的.因为sql真正执行的时间可能只有10秒,但是分布式任务的生成的其他过程的执行可能要1分钟....

    本地模式

    0.7版本后Hive开始支持任务执行选择本地模式(local mode)大多数的Hadoop job是需要hadoop提供的完整的可扩展性来处理大数据的。

    在hive中运行的sql有很多是比较小的sql,数据量小,计算量小 ,这些比较小的sql如果也采用分布式的方式来执行,那么是得不偿失的.因为sql真正执行的时间可能只有10秒,但是分布式任务的生成的其他过程的执行可能要1分钟.这样的小任务更适合采用lcoal mr的方式来执行,就是在本地来执行,通过把输入数据拉回客户端来执行.

    启用方式

    • set hive.exec.mode.local.auto=true;(默认为false)

    当一个job满足如下条件才能真正使用本地模式

    1. job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
    2. job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)
    3. job的reduce数必须为0或者1

    例子

    我这里有一张表,其实就是我们在前面教程hive streaming中演示用到的,我先在不开启本地模式下执行一下

    select weekday,count
    展开全文
  • Java常见设计模式总结

    万次阅读 多人点赞 2021-09-18 17:18:54
    设计模式是一套经过反复使用的代码设计经验,目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式于己于人于系统都是多赢的,它使得代码编写真正工程化,它是软件工程的基石,如同大厦的一块块...

     一、设计模式总述:

    1、什么是设计模式:

            设计模式是一套经过反复使用的代码设计经验,目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 设计模式于己于人于系统都是多赢的,它使得代码编写真正工程化,它是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。总体来说,设计模式分为三大类:

    • 创建型模式:共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
    • 结构型模式:共7种:适配器模式、装饰器模式、代理模式、桥接模式、外观模式、组合模式、享元模式
    • 行为型模式:共11种:策略模式、模板方法模式、观察者模式、责任链模式、访问者模式、中介者模式、迭代器模式、命令模式、状态模式、备忘录模式、解释器模式

    其实还有两类:并发型模式和线程池模式,用一个图片来整体描述一下:

    2、设计模式的六大原则:

    (1)开闭原则 (Open Close Principle) :

            开闭原则指的是对扩展开放,对修改关闭。在对程序进行扩展的时候,不能去修改原有的代码,想要达到这样的效果,我们就需要使用接口或者抽象类

    (2)依赖倒转原则 (Dependence Inversion Principle):

            依赖倒置原则是开闭原则的基础,指的是针对接口编程,依赖于抽象而不依赖于具体

    (3)里氏替换原则 (Liskov Substitution Principle) :

            里氏替换原则是继承与复用的基石,只有当子类可以替换掉基类,且系统的功能不受影响时,基类才能被复用,而子类也能够在基础类上增加新的行为。所以里氏替换原则指的是任何基类可以出现的地方,子类一定可以出现。

            里氏替换原则是对 “开闭原则” 的补充,实现 “开闭原则” 的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏替换原则是对实现抽象化的具体步骤的规范。

    (4)接口隔离原则 (Interface Segregation Principle):

            使用多个隔离的接口,比使用单个接口要好,降低接口之间的耦合度与依赖,方便升级和维护方便

    (5)迪米特原则 (Demeter Principle):

            迪米特原则,也叫最少知道原则,指的是一个类应当尽量减少与其他实体进行相互作用,使得系统功能模块相对独立,降低耦合关系。该原则的初衷是降低类的耦合,虽然可以避免与非直接的类通信,但是要通信,就必然会通过一个“中介”来发生关系,过分的使用迪米特原则,会产生大量的中介和传递类,导致系统复杂度变大,所以采用迪米特法则时要反复权衡,既要做到结构清晰,又要高内聚低耦合。

    (6)合成复用原则 (Composite Reuse Principle):

            尽量使用组合/聚合的方式,而不是使用继承。

    二、Java的23种设计模式:

            接下来我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析

    1、创建型-工厂方法模式:

    工厂方法模式分为三种:

    (1)简单工厂模式:

    建立一个工厂类,并定义一个接口对实现了同一接口的产品类进行创建。首先看下关系图:

    (2)工厂方法模式:

    工厂方法模式是对简单工厂模式的改进,简单工厂的缺陷在于不符合“开闭原则”,每次添加新产品类就需要修改工厂类,不利于系统的扩展维护。而工厂方法将工厂抽象化,并定义一个创建对象的接口。每增加新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,这样工厂的设计就符合“开闭原则”了,扩展时不必去修改原来的代码。UML关系图如下:

     (3)静态工厂方法模式:

    静态工厂模式是将工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

    工厂方法模式详情文章:Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)

    2、创建型-抽象工厂模式:

            抽象工厂模式主要用于创建相关对象的家族。当一个产品族中需要被设计在一起工作时,通过抽象工厂模式,能够保证客户端始终只使用同一个产品族中的对象;并且通过隔离具体类的生成,使得客户端不需要明确指定具体生成类;所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

            但该模式的缺点在于添加新的行为时比较麻烦,如果需要添加一个新产品族对象时,需要更改接口及其下所有子类,这必然会带来很大的麻烦。

            UML结构图如下:

    抽象工厂模式详情:Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)

    3、创建型-建造者模式:

             建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程;通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来,使得同样的构建过程可以创建不同的对象;并且每个具体建造者都相互独立,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。UML结构图如下:

     建造者模式详情:Java设计模式之创建型:建造者模式

    4、创建型-单例模式:

            单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例。单例模式的优点在于:

    • 系统中只存在一个共用的实例对象,无需频繁创建和销毁对象,节约了系统资源,提高系统的性能
    • 可以严格控制客户怎么样以及何时访问单例对象。

    单例模式的写法有好几种,主要有三种:懒汉式单例、饿汉式单例、登记式单例。

    单例模式详情:Java设计模式之创建型:单例模式

    5、创建型-原型模式:

            原型模式也是用于对象的创建,通过将一个对象作为原型,对其进行复制克隆,产生一个与源对象类似的新对象。UML类图如下:

     在 Java 中,原型模式的核心是就是原型类 Prototype,Prototype 类需要具备以下两个条件:

    • 实现 Cloneable 接口:
    • 重写 Object 类中的 clone() 方法,用于返回对象的拷贝;

    Object 类中的 clone() 方法默认是浅拷贝,如果想要深拷贝对象,则需要在 clone() 方法中自定义自己的复制逻辑。

    • 浅复制:将一个对象复制后,基本数据类型的变量会重新创建,而引用类型指向的还是原对象所指向的内存地址。
    • 深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。

            使用原型模式进行创建对象不仅简化对象的创建步骤,还比 new 方式创建对象的性能要好的多,因为 Object 类的 clone() 方法是一个本地方法,直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显;

    原型模式详情:Java设计模式之创建型:原型模式

            

            上面我们介绍了5种创建型模式,下面我们就开始介绍下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,如下图:

    6、结构型-适配器模式:

            适配器模式主要用于将一个类或者接口转化成客户端希望的格式,使得原本不兼容的类可以在一起工作,将目标类和适配者类解耦;同时也符合“开闭原则”,可以在不修改原代码的基础上增加新的适配器类;将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性,但是缺点在于更换适配器的实现过程比较复杂。

            所以,适配器模式比较适合以下场景:

    • (1)系统需要使用现有的类,而这些类的接口不符合系统的接口。
    • (2)使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

    下面有个非常形象的例子很好地说明了什么是适配器模式:

    适配器模式的主要实现有三种:类的适配器模式、对象的适配器模式、接口的适配器模式。三者的使用场景如下:

    • 类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
    • 对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。
    • 接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

    适配器模式详情:Java设计模式之结构型:适配器模式

    7、结构型-装饰器模式:

            装饰器模式可以动态给对象添加一些额外的职责从而实现功能的拓展,在运行时选择不同的装饰器,从而实现不同的行为;比使用继承更加灵活,通过对不同的装饰类进行排列组合,创造出很多不同行为,得到功能更为强大的对象;符合“开闭原则”,被装饰类与装饰类独立变化,用户可以根据需要增加新的装饰类和被装饰类,在使用时再对其进行组合,原有代码无须改变。装饰器模式的UML结构图如下:

            但是装饰器模式也存在缺点,首先会产生很多的小对象,增加了系统的复杂性,第二是排错比较困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

    装饰器模式详情:Java设计模式之结构型:装饰器模式

    8、结构型-代理模式:

            代理模式的设计动机是通过代理对象来访问真实对象,通过建立一个对象代理类,由代理对象控制原对象的引用,从而实现对真实对象的操作。在代理模式中,代理对象主要起到一个中介的作用,用于协调与连接调用者(即客户端)和被调用者(即目标对象),在一定程度上降低了系统的耦合度,同时也保护了目标对象。但缺点是在调用者与被调用者之间增加了代理对象,可能会造成请求的处理速度变慢。UML结构图如下:

    代理模式详情:Java设计模式之结构型:代理模式

    9、结构型-桥接模式:

            桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独立的变化。为了达到让抽象部分和实现部分独立变化的目的,桥接模式使用组合关系来代替继承关系,抽象部分拥有实现部分的接口对象,从而能够通过这个接口对象来调用具体实现部分的功能。也就是说,桥接模式中的桥接是一个单方向的关系,只能够抽象部分去使用实现部分的对象,而不能反过来。 

            桥接模式符合“开闭原则”,提高了系统的可拓展性,在两个变化维度中任意扩展一个维度,都不需要修改原来的系统;并且实现细节对客户不透明,可以隐藏实现细节。但是由于聚合关系建立在抽象层,要求开发者针对抽象进行编程,这增加系统的理解和设计难度。桥接模式的UML结构图如下:

            就像在Java中我们使用 JDBC 连接数据库时,在各个数据库之间进行切换,基本不需要动太多的代码,原因就是使用了桥接模式,JDBC 提供统一接口,每个数据库提供各自的实现,然后由桥接类创建一个连接数据库的驱动,使用某一个数据库的时候只需要切换一下就行。JDBC 的结构图如下:

             在 JDBC 中,桥接模式的实现化角色 (Implementor) 为的 Driver 接口,具体实现化 (Concrete Implementor) 角色对应 MysqlDriver、OracleDriver 和 MariadbDriver,扩展抽象化 (Refined Abstraction) 角色对应 DriverManager,不具有抽象化 (Abstraction) 角色作为扩展抽象化角色的父类。

    桥接模式详情:Java设计模式之结构型:桥接模式

    10、结构型-外观模式:

            外观模式通过对客户端提供一个统一的接口,用于访问子系统中的一群接口。使用外观模式有以下几点好处:

    (1)更加易用:使得子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观类交互就可以了;

    (2)松散耦合:将客户端与子系统解耦,让子系统内部的模块能更容易扩展和维护。

    (3)更好的划分访问层次:通过合理使用 Facade,可以更好地划分访问的层次,有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。

            但是如果外观模式对子系统类做太多的限制则减少了可变性和灵活性,所以外观模式适用于为复杂子系统提供一个简单接口,提高系统的易用性场景 以及 引入外观模式将子系统与客户端进行解耦,提高子系统的独立性和可移植性。

            外观模式的UML结构图如下:

    外观模式详情: Java设计模式之结构型:外观模式

    11、结构型-组合模式:

            组合模式将叶子对象和容器对象进行递归组合,形成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性,能够像处理叶子对象一样来处理组合对象,无需进行区分,从而使用户程序能够与复杂元素的内部结构进行解耦。

            组合模式最关键的地方是叶子对象和组合对象实现了相同的抽象构建类,它既可表示叶子对象,也可表示容器对象,客户仅仅需要针对这个抽象构建类进行编程,这就是组合模式能够将叶子节点和对象节点进行一致处理的原因。组合模式的UML结构图如下:

    组合模式详情: Java设计模式之结构型:组合模式

    12、结构型-享元模式:

            享元模式通过共享技术有效地支持细粒度、状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量,从而节省资源。

            享元模式的核心是享元工厂类,享元工厂类维护了一个对象存储池,当客户端需要对象时,首先从享元池中获取,如果享元池中存在对象实例则直接返回,如果享元池中不存在,则创建一个新的享元对象实例返回给用户,并在享元池中保存该新增对象,这点有些单例的意思。

            工厂类通常会使用集合类型来保存对象,如 HashMap、Hashtable、Vector 等等,在 Java 中,数据库连接池、线程池等都是用享元模式的应用。

            享元模式的UML结构图如下:

             Java 中,String 类型就是使用享元模式,String 对象是 final 类型,对象一旦创建就不可改变。而 Java 的字符串常量都是存在字符串常量池中的,JVM 会确保一个字符串常量在常量池中只有一个拷贝。

            而且提到共享池,我们也很容易联想到 Java 里面的JDBC连接池,通过连接池的管理,实现了数据库连接的共享,不需要每一次都重新创建连接,节省了数据库重新创建的开销,提升了系统的性能!

    享元模式详情:Java设计模式之结构型:享元模式

            前面我们介绍了7种结构型设计模式,接下来我们介绍一下11种行为型设计模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。先来张图,看看这11中模式的关系:

     13、行为型-策略模式:

            将类中经常改变或者可能改变的部分提取为作为一个抽象策略接口类,然后在类中包含这个对象的实例,这样类实例在运行时就可以随意调用实现了这个接口的类的行为。

            比如定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换,使得算法可独立于使用它的客户而变化,这就是策略模式。UML结构图如下:

            策略模式的优点在于可以动态改变对象的行为;但缺点是会产生很多策略类,并且策略模式的决定权在用户,系统只是提供不同算法的实现,所以客户端必须知道所有的策略类,并自行决定使用哪一个策略类; 

            策略模式适用用于以下几种场景:

    • (1)应用程序需要实现特定的功能服务,而该程序有多种实现方式使用,所以需要动态地在几种算法中选择一种
    • (2)一个类定义了多种行为算法,并且这些行为在类的操作中以多个条件语句的形式出现,就可以将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

    策略模式详情:Java设计模式之行为型:策略模式

    14、行为型-模板方法:

            模板方法是基于继承实现的,在抽象父类中声明一个模板方法,并在模板方法中定义算法的执行步骤(即算法骨架)。在模板方法模式中,可以将子类共性的部分放在父类中实现,而特性的部分延迟到子类中实现,只需将特性部分在父类中声明成抽象方法即可,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤,不同的子类可以以不同的方式来实现这些逻辑。

            模板方法模式的优点在于符合“开闭原则”,也能够实现代码复用,将不变的行为转移到父类,去除子类中的重复代码。但是缺点是不同的实现都需要定义一个子类,导致类的个数的增加使得系统更加庞大,设计更加抽象。模板方法模式的UML图如下:

    模板方法详情:Java设计模式之行为型:模板方法模式

    15、行为型-责任链模式:

            职责链可以将请求的处理者组织成一条链,并将请求沿着链传递,如果某个处理者能够处理请求则处理,否则将该请求交由上级处理。客户端只需将请求发送到职责链上,无须关注请求的处理细节,通过职责链将请求的发送者和处理者解耦了,这也是职责链的设计动机。        

           职责链模式可以简化对象间的相互连接,因为客户端和处理者都没有对方明确的信息,同时处理者也不知道职责链中的结构,处理者只需保存一个指向后续者的引用,而不需要保存所有候选者的引用。

            另外职责链模式增加了系统的灵活性,我们可以任意增加或更改处理者,甚至更改处理者的顺序,不过有可能会导致一个请求无论如何也得不到处理,因为它可能被放置在链末端。

    所以责任链模式有以下几个优点:

    • (1)降低耦合度,将请求的发送者和接收者解耦。反映在代码上就是不需要在类中写很多丑陋的 if….else 语句,如果用了职责链,相当于我们面对一个黑箱,只需将请求递交给其中一个处理者,然后让黑箱内部去负责传递就可以了。
    • (2)简化了对象,使得对象不需要链的结构。
    • (3)增加系统的灵活性,通过改变链内的成员或者调动他们的次序,允许动态地新增或者删除处理者
    • (4)增加新的请求处理类很方便。

    但是责任链模式也存在一些缺点:

    • (1)不能保证请求一定被成功处理
    • (2)系统性能将受到一定影响,并且可能会造成循环调用。
    • (3)可能不容易观察运行时的特征,而且在进行代码调试时不太方便,有碍于除错。

            责任链模式的UML结构图如下:

    责任链模式详情:Java设计模式之行为型:责任链模式

    16、行为型-观察者模式:

            观察者模式又称为 发布-订阅模式,定义了对象之间一对多依赖关系,当目标对象(被观察者)的状态发生改变时,它的所有依赖者(观察者)都会收到通知。一个观察目标可以对应多个观察者,而这些观察者之间没有相互联系,所以能够根据需要增加和删除观察者,使得系统更易于扩展,符合开闭原则;并且观察者模式让目标对象和观察者松耦合,虽然彼此不清楚对方的细节,但依然可以交互,目标对象只知道一个具体的观察者列表,但并不认识任何一个具体的观察者,它只知道他们都有一个共同的接口。

            但观察者模式的缺点在于如果存在很多个被观察者的话,那么将需要花费一定时间通知所有的观察者,如果观察者与被观察者之间存在循环依赖的话,那么可能导致系统崩溃,并且观察者模式没有相应的机制让观察者知道被观察对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。观察者模式的UML结构图如下:

     观察者模式详情:Java设计模式之行为型:观察者模式

    17、行为型-访问者模式:

            访问者模式就是一种分离对象数据结构与行为 (基于数据结构的操作) 的方法,通过这种分离,达到为一个被访问者动态添加新的操作而无需做其它修改的效果,使得添加作用于这些数据结构的新操作变得简单,并且不需要改变各数据结构,为不同类型的数据结构提供多种访问操作方式,这样是访问者模式的设计动机。

            除了使新增访问操作变得更加简单,也能够在不修改现有类的层次结构下,定义该类层次结构的操作,并将有关元素对象的访问行为集中到一个访问者对象中,而不是分散搞一个个的元素类中。

           但访问者模式的缺点在于让增加新的元素类变得困难,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,违背了“开闭原则”的要求;

            所以访问者模式适用于对象结构中很少改变,但经常需要在此对象结构上定义新的操作的系统,使得算法操作的增加变得简单;或者需要对一个对象结构中进行很多不同并且不相关的操作,并且需要避免让这些操作污染这些对象,也不希望在增加新操作时修改这些类的场景。

            访问者模式的UML结构图如下:

            从上面的 UML 结构图中我们可以看出,访问者模式主要分为两个层次结构,一个是访问者层次结构,提供了抽象访问者和具体访问者,主要用于声明一些操作;一个是元素层次结构,提供了抽象元素和具体元素,主要用于声明 accept 操作;而对象结构 ObjectStructure 作为两者的桥梁,存储了不同类型的对象,以便不同的访问者来访问,相同访问者可以以不同的方式访问不同的元素,所以在访问者模式中增加新的访问者无需修改现有代码,可扩展行强。

            在访问者模式使用了双分派技术,所谓双分派技术就是在选择方法的时候,不仅仅要根据消息接收者的运行时区别,还要根据参数的运行时区别。在访问者模式中,客户端将具体状态当做参数传递给具体访问者,这里完成第一次分派,然后具体访问者作为参数的“具体状态”中的方法,同时也将自己this作为参数传递进去,这里就完成了第二次分派。双分派意味着得到的执行操作决定于请求的种类和接受者的类型。

     访问者模式详情:Java设计模式之行为型:访问者模式

    18、行为型-中介者模式:

             中介者模式通过中介者对象来封装一系列的对象交互,将对象间复杂的关系网状结构变成结构简单的以中介者为核心的星形结构,对象间一对多的关联转变为一对一的关联,简化对象间的关系,便于理解;各个对象之间的关系被解耦,每个对象不再和它关联的对象直接发生相互作用,而是通过中介者对象来与关联的对象进行通讯,使得对象可以相对独立地使用,提高了对象的可复用和系统的可扩展性。

            在中介者模式中,中介者类处于核心地位,它封装了系统中所有对象类之间的关系,除了简化对象间的关系,还可以对对象间的交互进行进一步的控制。中介者模式的UML结构图如下:

            但是,中介者对象封装了对象之间的关联关系,导致中介者对象变得比较庞大复杂,所承担的责任也比较多,维护起来也比较困难,它需要知道每个对象和他们之间的交互细节,如果它出问题,将会导致整个系统都会出问题。

    中介者模式详情:Java设计模式之行为型:中介者模式

    19、行为型-命令模式:

            命令模式的本质是将请求封装成对象,将发出命令与执行命令的责任分开,命令的发送者和接收者完全解耦,发送者只需知道如何发送命令,不需要关心命令是如何实现的,甚至是否执行成功都不需要理会。命令模式的关键在于引入了抽象命令接口,发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。

            使用命令模式的优势在于降低了系统的耦合度,而且新命令可以很方便添加到系统中,也容易设计一个组合命令。但缺点在于会导致某些系统有过多的具体命令类,因为针对每一个命令都需要设计一个具体命令类。

            命令模式的UML结构图如下:

    命令模式详情: Java设计模式之行为型:命令模式

    20、行为型-状态模式:

            状态模式,就是允许对象在内部状态发生改变时改变它的行为,对象看起来就好像修改了它的类,也就是说以状态为原子来改变它的行为,而不是通过行为来改变状态。

            当对象的行为取决于它的属性时,我们称这些属性为状态,那该对象就称为状态对象。对于状态对象而言,它的行为依赖于它的状态,比如要预订房间,只有当该房间空闲时才能预订,想入住该房间也只有当你预订了该房间或者该房间为空闲时。对于这样的一个对象,当它的外部事件产生互动的时候,其内部状态就会发生变化,从而使得他的行为也随之发生变化。

            状态模式的UML结构图如下:

     从上面的UML结构图我们可以看出状态模式的优点在于:

    (1)封装了转换规则,允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块

    (2)将所有与状态有关的行为放到一个类中,可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 

    但是状态模式的缺点在于:

    (1)需要在枚举状态之前需要确定状态种类

    (2)会导致增加系统类和对象的个数。

    (3)对 “开闭原则” 的支持并不友好,新增状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。

    所以状态模式适用于:代码中包含大量与对象状态有关的条件语句,以及对象的行为依赖于它的状态,并且可以根据它的状态改变而改变它的相关行为。

    状态模式详情:Java设计模式之行为型:状态模式

    21、行为型-备忘录模式:

            备忘录模式提供了一种恢复状态的机制,在不破坏封装的前提下,捕获对象的某个时刻内部状态,并保存在该对象之外,保证该对象能够恢复到某个历史状态;备忘录模式将保存的细节封装在备忘录中,除了创建它的创建者之外其他对象都不能访问它,并且实现了即使要改变保存的细节也不影响客户端。但是备忘录模式都是多状态和多备份的,会早用较多的内存,消耗资源。备忘录模式的额UML结构图如下:

             备忘录模式的核心就是备忘录 Memento,在备忘录中存储的就是原发器 Originator 的部分或者所有的状态信息,而这些状态信息是不能够被其他对象所访问的,也就是说我们是不能使用备忘录之外的对象来存储这些状态信息,如果暴漏了内部状态信息就违反了封装的原则,故备忘录除了原发器外其他对象都不可以访问。所以为了实现备忘录模式的封装,我们需要对备忘录的访问做些控制:

    (1)对原发器:可以访问备忘录里的所有信息。

    (2)对负责人 caretaker:不可以访问备忘录里面的数据,但是他可以保存备忘录并且可以将备忘录传递给其他对象。

    (3)其他对象:不可访问也不可以保存,它只负责接收从负责人那里传递过来的备忘录同时恢复原发器的状态。

    备忘录模式详情:Java设计模式之行为型:备忘录模式

    22、行为型-迭代器模式:

            迭代器模式提供一种访问集合中的各个元素,而不暴露其内部表示的方法。将在元素之间游走的职责交给迭代器,而不是集合对象,从而简化集合容器的实现,让集合容器专注于在它所应该专注的事情上,更加符合单一职责原则,避免在集合容器的抽象接口层中充斥着各种不同的遍历操作。迭代器模式的UML结构图如下:

    迭代器模式详情:Java设计模式之行为型:迭代器模式

    23、行为型-解释器模式:

            解释器模式,就是定义语言的文法,并建立一个解释器来解释该语言中的句子,通过构建解释器,解决某一频繁发生的特定类型问题实例。

            解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中,它描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。    

            解释器模式中除了能够使用文法规则来定义一个语言,还能通过使用抽象语法树来更加直观表示、更好地地表示一个语言的构成,每一颗抽象语法树对应一个语言实例。抽象语法树描述了如何构成一个复杂的句子,通过对抽象语法树的分析,可以识别出语言中的终结符和非终结符类。 在解释器模式中由于每一种终结符表达式、非终结符表达式都会有一个具体的实例与之相对应,所以系统的扩展性比较好。

            解释器模式的UML如下:

     解释器模式详情:Java设计模式之行为型:解释器模式


    相关推荐阅读:

    Spring常见面试题总结

    SpringMVC常见面试题总结

    Mybatis常见面试题总结

    MySQL常见面试题总结

    Redis常见面试题总结

    RabbitMQ消息队列常见面试题总结

    ElasticSearch搜索引擎常见面试题总结

    计算机网络常见面试题总结

    操作系统常见面试题总结

    Java基础、集合、多线程常见面试题总结

    Java虚拟机常见面试题总结

    Java常见设计模式总结

    海量数据处理的方法总结


    参考文章:

    Java之美[从菜鸟到高手演变]之设计模式

    Java之美[从菜鸟到高手演变]之设计模式二

    Java之美[从菜鸟到高手演变]之设计模式三

    Java之美[从菜鸟到高手演变]之设计模式四

    展开全文
  • Hive本地模式

    千次阅读 2017-06-09 15:45:13
    一、原理本地运行map-reduce作业。这对于在小型数据集上运行查询非常有用 - 在这种情况下,本地模式的执行通常比向大型集群提交​​作业要快...对于所有mapreduce任务都以本地模式运行,要启用此功能,用户可以启用以下
  • 开启Hive的本地模式

    千次阅读 2017-12-19 20:19:37
    但是你会发现job确实是以本地模式运行了(看job名字就能看出来,中间有local字样),但是还是会报错,各种找不到jar包。 这里还要运行一个语句:set fs.defaultFS=file:/// 然后你再去执行前面的那条语句,...
  • 将Spark应用以多线程的方式直接运行在本地,一般都是为了方便调试,本地模式分三类 · local:只启动一个executor · local[k]:启动k个executor · local:启动跟cpu数目相同的 executor 2)standalone模式 分布式...
  • 快速梳理23种常用的设计模式

    千次阅读 多人点赞 2018-11-17 22:54:34
    本文旨在快速梳理常用的设计模式,了解每个模式主要针对的是哪些情况以及其基础特征,每个模式前都有列举出一个或多个可以深入阅读的参考网页,以供读者详细了解其实现。 快速回忆 一、创建型 单例(Singleton...
  • hive开启本地模式执行

    万次阅读 2015-01-06 17:32:08
    但是你会发现job确实是以本地模式运行了(看job名字就能看出来,中间有local字样),但是还是会报错,各种找不到jar包。 这里还要运行一个语句:set fs.defaultFS=file:/// 然后你再去执行前面的那条语句,可以...
  • spark题目

    千次阅读 2019-03-13 16:26:35
    1. Spark 的四大组件下面哪个不是 (D ) A.Spark Streaming B Mlib C Graphx D Spark R Spark SQL 2.下面哪个端口不是 spark 自带服务的端口 (C ) A.8080 B.4040 C.8090 D.18080 4040:单机调试窗口; ...
  • java 24种设计模式

    千次阅读 2021-02-05 12:30:34
    设计模式的七大原则 开闭原则:对扩展开放、对修改关闭。 单一指责原则:一个类只做一件事。 依赖倒转原则:类似于ioc,采用接口编程。 迪米特原则:高内聚,低耦合。 接口隔离原则:应该使用多个接口,而...
  • Hadoop2.6.0运行mapreduce之Uber模式验证

    万次阅读 2016-05-05 14:55:38
    在有些情况下,运行于Hadoop集群上的一些mapreduce作业本身的数据量并不是很大,如果此时的任务分片很多,那么为每个map任务或者reduce任务频繁创建Container,势必会增加Hadoop集群的资源消耗,并且因为创建分配...
  • 前端开发中常用的几种设计模式

    万次阅读 多人点赞 2021-08-17 15:05:54
    设计模式更多的是指导思想和方法论,而不是现成的代码,当然每种设计模式都有每种语言中的具体实现方式。学习设计模式更多的是理解各种模式的内在思想和解决的问题,毕竟这是前人无数经验总结成的最佳实践,而代码...
  • 这个问题我问过的面试者不下于数十次,回答五花八门,在我看来,模式就是经验,设计模式就是设计经验,有了这些经验,我们就能在特定情况下使用特定的设计、组合设计,这样可以大大节省我们的设计时间,提..
  • FANUC机器人通过PNS功能实现自动运行

    千次阅读 2022-02-28 09:40:43
    FANUC机器人通过PNS功能实现自动运行
  • 常用的几种设计模式详解

    千次阅读 2021-04-09 15:01:27
    设计模式的概述 设计模式分类 创建型模式 特点是将对象的创建与使用分离(解耦),有 单例、原型、工厂方法、抽象工厂、建造者等5种。 结构型模式 用于描述如何将类或对象按某种布局组成更大的结构,代理、...
  • 发现他的几个特点,1、题目不难(相对于ACM来说,我被ACM虐到至今无力),评判没那么苛刻,2、十分基础,从链表、树到动态规划等,都是非常基本非常经典的内容,相当的靠基本功,3、没有本地调试环境,直接在网站上...
  • Spring中所使用的设计模式

    万次阅读 多人点赞 2021-01-14 02:51:09
    Spring是一个非常优秀的开源框架,项目源码中所使用的设计模式随处可见,这篇文章主要记录一下Spring中常见的设计模式: (1)工厂模式:Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象 (2...
  • Java代码是怎么运行的?

    万次阅读 2018-11-06 00:52:56
    极客时间《深入拆解Java虚拟机》...Java 代码有很多种不同的运行方式,比如在开发工具中运行、双击执行 jar 文件运行、在命令行中运行,甚至可以在网页中运行。 Java 的运行离不开 JRE(Java 运行时环境), JRE ...
  • 转自浅墨毛星云:http://blog.csdn.net/poem_qianmo/article/details/53240330...我们知道,游戏行业其实一直很缺一本系统介绍游戏编程进阶技巧的书籍,而《游戏编程模式》的出现,正好弥补了这一点。之前已经有提到过
  • 微信小程序如何本地调试

    千次阅读 2021-08-23 17:30:11
    通过内网穿透工具可以直接将请求转发到本地,同时解决ssl证书问题,目前市面上符合以上条件的内网穿透工具推荐小蝴蝶内网穿透 使用方法 首先创建域名类型实例,填写好内网IP端口即可 右侧下载客户端双击运行...
  • JAVA设计模式--原型模式

    万次阅读 2016-05-23 19:48:46
    目录 ...原型(Prototype)模式是一种对象创建型模式,它通过原型实例指定创建对象的种类,并采用拷贝原型实例的方法来创建新的对象。所以,使用原型模式创建的实例,具有与原型实例一样的数据。 ...
  • 前言 前面的博文我们已经分别讲述了代理模式,策略模式和委派模式各自的使用及案例实现。 但是三者都写完了,我发现其实我自己都有些混淆了,... 2、避免使用多重条件判断。 3、扩展性良好。 缺点: 1、策略类...
  • 一、哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各...
  • 备注 11 Internet Explorer 11 桌面应用程序将于 2022 年 6 月 ... 现在使用的 IE11 应用和网站可以在 Microsoft Edge 的 Internet Explorer 模式下打开。 若要了解更多信息,请参阅 Internet Exploreron Windows ...
  • java 23种设计模式详解

    万次阅读 多人点赞 2016-07-01 14:45:14
    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。其实还有两类:并发型模式和线程池模式
  • seata的AT模式

    千次阅读 2021-12-01 10:37:48
    Seata 是阿里开源的分布式事务框架,属于二阶段提交模式。 目前github上已经有 12267 颗星了,也很活跃,最新的提交时间很多都是几天前。 首先我们回顾一下在单体应用中,例如一个业务调用了3个模块,他们都使用同...
  • 文章目录概述Hotspot 虚拟机内的即时编译器解释器与编译器编译对象与触发条件方法调用计数器回边计数器编译过程Client CompilerServer Compiler编译优化技术优化技术概览公共子表达式消除数组边界检查消除方法内联...
  • 编译时多态:体现在重载(方法名相同而参数不同),在编译时期就根据传入的参数确定好调用哪个方法; 2.运行时多态:体现在方法的重写。在运行时期判断引用类型的实际类型根据实际的类型调用其相应的方法; 当父类...
  • 设计模式 考试题+答案

    万次阅读 多人点赞 2020-03-13 13:43:49
    一、选择题 1.( A )模式的关键是将一个对象定义为...2.下面的类图表示的是哪个设计模式?(B ) A装饰模式(Decorator) B策略模式(Strategy) C桥接模式(Bridge) D观察者模式(Observer) 转存失败重...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 217,812
精华内容 87,124
热门标签
关键字:

哪个不是本地模式运行的条件