Bigdata

FSDataInputStream seek

Submitted by Lizhe on Tue, 04/11/2017 - 22:13

 

package hadoop.cat;

import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

使用 FileSystem 读取文件

Submitted by Lizhe on Tue, 04/11/2017 - 16:35

不能使用URLStreamHandlerFactory时,可以通过FileSystem来读取文件的输入流

public static FileSystem get(Configuration conf) throws IOException 
public static FileSystem get(URI uri, Configuration conf) throws IOException 
public static FileSystem get(URI uri, Configuration conf, String user) throws IOException

conf对象用于封装服务器或者客户端信息,它需要使用 core-site.xml来指定

如果没有指定相关的配置,默认会使用本地文件系统, 下面是我本地的配置

 

$ vim ~/hadoop/etc/hadoop/core-site.xml

使用Java Hadoop URL 接口读取数据

Submitted by Lizhe on Tue, 04/11/2017 - 11:21

 

要从Hadoop文件系统读取文件,最简单的方法是使用java.net.URL对象打开数据流

不过使用这种方式需要先让虚拟机识别hadoop的URL数据流, 通过以下静态块实现

不过这种方式也有局限性, 每个java虚拟机只能调用一次这个方法, 因此通常在静态方法中调用

如果你醒目中的其他模块也需要使用这一方法,这种方式可能并不可取

package hadoop.cat;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;

public class Cat {

Hadoop hdfs 文件系统

Submitted by Lizhe on Sun, 04/09/2017 - 15:06

Hadoop在50070端口上提供了一个web页面

15

创建文件夹

[root@lzvm bin]# ./hadoop fs -mkdir /books
[root@lzvm bin]# ./hadoop fs -ls /

14

拷贝本地文件到hdfs

这里要使用name node的端口,我配置的是9000,有的博客里写的是8020, 其实默认也是8020如果你不明确写端口的话

Combiner 函数

Submitted by Lizhe on Sat, 04/08/2017 - 16:01

在讨论Combiner函数之前我们先了解一下Mapreduce的数据流

每个作业(Job) 由两个task构成, 一个是map一个是reduce

Hadoop会为每个分片构建一个map任务 (一般分片大小为64M)

map任务将其输出写入本地硬盘,而不是HDFS

数据在reduce端合并, 也就是说,当Mapreduce运行时,一般情况你会拥有若干个map任务和一个reduce任务

这个reduce任务的输入为所有map任务的输出

reduce任务的数量并非由输入数据的大小决定(map是这样的), 而事实上是独立指定的.

如果有多个reduce任务,每个map任务就会针对输出进行分区(partition)

即为每个reduce任务创建一个分区

每个分区有许多个key和其对应的值 ( 一个key和多个value,在一个分区内)

分区由用户定义的partition函数控制,默认是哈希函数

在第二个例子里, eclipse环境生成了一个分区,但是linux命令行环境下生成了两个分区

 

试想如果数据量特别大的情况, 应该尽量避免map与reduce之间的数据传递

Mapreduce java 例子(2)

Submitted by Lizhe on Fri, 04/07/2017 - 22:18

首先目录结构是这样的

8

然后是3个java类

package hadoop.max;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

Mapreduce java 例子(1)

Submitted by Lizhe on Thu, 04/06/2017 - 17:16

 

这个例子来源于<Hadoop权威指南>, 随便在百度上一找就一堆,这里只是写个注释

Map类

package org.jediael.hadoopDemo.maxtemperature;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MaxTemperatureMapper extends
        Mapper<LongWritable, Text, Text, IntWritable> {
    private static final int MISSING = 9999;