`
qingshou117
  • 浏览: 47752 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MAC下hadoop开发环境搭建系列(五)

阅读更多


 

分享一个mapreduce程序,作用:将hdfs文件数据批量加载进redis内存数据库:

1.源代码:

 

/**
* Program:
* The program is used to batch load data to redis by Jedis.
* History:
* Created by Qingshou Chen on 15/11/13.
*/

package com.asiainfo.bdcenter;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
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.NullOutputFormat;
import org.apache.hadoop.util.StringUtils;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

import java.io.IOException;
import java.util.*;

public class BatchToRedis extends Configured implements Tool{

/**
* 继承Configured,implements Tool 可以方便读取命令行-conf -D 配置信息和加载其他配置文件(通过addResource方法)
*/

/**
* 日志处理
*/
private static Logger logger = LoggerFactory.getLogger(BatchToRedis.class);
public int run(String[] args) throws Exception{

/**
* 检查调用参数是否正确
*/
if (args.length != 0){
System.err.println("Usage:hadoop jar BatchToRedis.jar");
System.err.println("Attention:Please set parameters at config.xml in the same path of BatchToRedis.jar");
System.exit(-1);
}

/**
* 初始化配置 config.xml在src目录下,执行jar包时需要将该文件跟jar包放在同一个目录下
*/
Configuration conf = getConf();
conf.addResource(new Path("./config.xml"));

/*Date date = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sdf = df.format(date);*/
String jobname = "BatchToRedis:"+conf.get("redis.table.name");
logger.info("***************JOB:"+jobname+" START***************");
logger.info("****This Program is used by batch load data to redis cluster!****");
logger.info("****The result is set hashkeys like:hmset table_name:key fieldname1 fieldvalue1 [fieldnameN fieldvalueN]****");
logger.info("***************"+"INPUT PATH:"+conf.get("input.path")+"***************");
logger.info("***************"+"DATA FIELD NAME:"+conf.get("data.field.name")+"***************");
logger.info("***************"+"DATA FIELD SPLIT:"+conf.get("data.field.split")+"***************");
logger.info("***************"+"REDIS CLUSTER:"+conf.get("redis.cluster.node.list")+"***************");

/**
* SET JOB
*/
Job job = Job.getInstance(conf,jobname);
job.setJarByClass(BatchToRedis.class);
FileInputFormat.addInputPath(job, new Path(conf.get("input.path")));
FileInputFormat.setMinInputSplitSize(job,1);
FileInputFormat.setMaxInputSplitSize(job,Long.parseLong(conf.get("map.split.size"))*1024*1024);
// FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(BatchToRedisMapper.class);
job.setReducerClass(BatchToRedisReducer.class);
job.setNumReduceTasks(0);
// job.setOutputKeyClass(Text.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setOutputFormatClass(NullOutputFormat.class);

/**
* 显示job执行时间和结果
*/
long currentTime = System.currentTimeMillis();
boolean success = job.waitForCompletion(true);
logger.info("***************Job Escape: " + StringUtils.formatTimeDiff(System.currentTimeMillis(), currentTime)+"***************");
if (!success)

{
logger.info("***************JOB FAILED***************");
return 1;
}

logger.info("***************JOB END SUCCESSFULL***************");
return 0;
}
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(new BatchToRedis(), args);
System.exit(exitCode);

}

/**
* map
*/
public static class BatchToRedisMapper extends Mapper<LongWritable, Text, Text, Text> {

private JedisCluster jc;

protected void setup(Context context) throws IOException{

/**
* 连接redis集群
*/
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
Configuration conf = context.getConfiguration();
String[] redisnodes = conf.get("redis.cluster.node.list").split(",");
for(String redisnode : redisnodes){
jedisClusterNodes.add(new HostAndPort(redisnode.split(":")[0],Integer.parseInt(redisnode.split(":")[1])));
}
this.jc = new JedisCluster(jedisClusterNodes);
}
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

String line = value.toString();
Configuration conf = context.getConfiguration();
String[] fields = line.split(conf.get("data.field.split"));
String[] fieldnames = conf.get("data.field.name").split(",");
Map<String, String> map = new HashMap<String, String>();

/**
* 设置主键 table_name+主键属性(需放在数据文件第一列)
*/
String hashkey = conf.get("redis.table.name") + ":" + fields[0];

/**
* 设置其他属性
*/
for(int i = 1;i<fields.length;i++) {
map.put(fieldnames[i], fields[i]);
}

jc.del(hashkey);
jc.hmset(hashkey, map);
// System.out.println(jc.hget(hashkey,"name"));

}

protected void cleanup(Context context){
/**
* 关闭redis集群
*/
jc.close();
}
}

/**
* reduce
*/
public static class BatchToRedisReducer extends Reducer<Text, Text, Text, IntWritable> {
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {

System.out.println("reduce execute!!!!");
}
}

}

 

2.配置文件,config.xml:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration xmlns:xi="http://www.w3.org/2001/XInclude">
<!-- 配置map切片大小 单位 MB-->
<property>
<name>map.split.size</name>
<value>32</value>
</property>
<!-- txt文件(数据文件)的路径(HDFS)-->
<property>
<name>input.path</name>
<value>/bdcenter/tmp/test/in</value>
</property>
<!--数据文件字段名,用逗号分隔,注意:主键放第一列! -->
<property>
<name>data.field.name</name>
<value>bill_id,name,age,sex</value>
</property>
<!--数据文件字段分隔符 -->
<property>
<name>data.field.split</name>
<value>,</value>
</property>
<!-- redis数据库中hash 主键中所放的表名-->
<property>
<name>redis.table.name</name>
<value>dw_user</value>
</property>

<!-- Redis cluster node list -->
<property>
<name>redis.cluster.node.list</name>
<value>10.192.168.74:6379,10.192.168.75:6379,10.192.168.76:6379,10.192.168.77:6379,10.192.168.78:6379,10.192.168.79:6379,10.192.168.80:6379,10.192.168.81:6379,10.192.168.82:6379,10.192.168.83:6379</value>
</property>
</configuration>

 

 

 

纪录实际操作过程                                 

内容在个人公众号mangrendd同步更新

  • 大小: 292.9 KB
0
1
分享到:
评论

相关推荐

    mac环境下hadoop集群搭建

    搭建一个Hadoop集群是一个复杂的过程,但为了更好的理解,我们将这个过程拆解成几个主要步骤,并且由于本文档是在Mac环境下进行Hadoop集群搭建的指南,我们需要专注于特定于Mac和VMware Fusion的步骤。 1. 创建...

    大数据技术基础实验报告-Linux环境下hadoop集群的搭建与基本配置.doc

    【大数据技术基础实验报告-Linux环境下hadoop集群的搭建与基本配置】 实验主要涉及了大数据技术中的基础概念,包括Linux操作系统、Java环境、SSH服务、Hadoop集群的搭建与配置。以下是具体步骤和知识点的详细解释:...

    mac下hadoop3.1.4源码

    在Mac环境下搭建Hadoop 3.1.4源码,是一项对分布式计算系统有深入了解的任务。Hadoop是Apache基金会开源的一个大数据处理框架,它主要由HDFS(Hadoop Distributed File System)和MapReduce两大部分组成,同时还有...

    第3章hadoop伪分布式环境的搭建.docx

    【Hadoop伪分布式环境搭建详解】 Hadoop作为大数据处理的核心框架,对于初学者和专业开发人员来说,理解并掌握其安装配置至关重要。Hadoop提供了多种运行模式,包括本地模式、伪分布式模式以及集群模式,每种模式都...

    大数据技术基础实验报告-Linux环境下hadoop集群的搭建与基本配置.pdf

    实验主要涉及了Linux操作系统、Java开发环境以及Hadoop大数据处理框架的安装和配置。以下是对这些知识点的详细说明: 1. **Linux环境搭建**: 实验在CentOS操作系统上进行,首先需要对CentOS进行安装和配置。...

    基于Hadoop分布式集群搭建方法研究.pdf

    搭建Hadoop分布式集群前需要准备相应的环境。环境准备包括硬件选择(至少需要3台服务器,可以是物理机或虚拟机)以及操作系统的选择,这里采用的是CentOS Linux release 7.5.1804(Core)64位版本。 3. JDK安装: ...

    作业二-Mac版Hadoop三节点集群搭建.docx

    【描述】: 在Mac环境下搭建Hadoop三节点集群是一项常见的IT任务,特别是在大数据处理和分布式计算的学习与实践中。Hadoop是Apache基金会开发的一个开源项目,主要负责分布式存储和计算,其核心组件包括HDFS(Hadoop ...

    Hadoop学习之路(三)Hadoop-2.7.5在CentOS-6.7上的编译

    **步骤2:** 查看`BUILDING.txt`文件,该文件详细列出了编译Hadoop所需的环境和依赖项,包括但不限于: - **Unix System**:操作系统的类型。 - **JDK 1.7+**:Java开发工具包的版本。 - **Maven 3.0 or later**...

    大数据学习所需基本知识以及搭建Hadoop大数据环境过程.docx

    一旦系统安装完毕,可以逐步搭建Hadoop环境,从独立模式开始,然后过渡到伪分布式和全分布式模式。最后,学习编写一键启动脚本来简化集群管理。 总的来说,大数据学习需要扎实的Java基础,熟练的Linux操作技能,...

    基于Hadoop平台的搭建及应用研究.pdf

    文档详细介绍了在Linux环境下搭建Hadoop集群的步骤,包括: - 系统配置:修改/etc/sysconfig/network文件来设置网络配置,包括主机名设置和网络启动。 - 主机名和IP配置:编辑/etc/hosts文件,确保主机名和IP地址...

    Hadoop源码及编译工具

    在获取源码后,你需要搭建一个适合编译Hadoop的开发环境。这通常包括以下组件: 1. **Java开发环境**:Hadoop是用Java语言编写的,所以需要JDK(Java Development Kit)版本至少为8。确保`JAVA_HOME`环境变量设置...

    hadoop 笔记

    - **3.2.1 支持平台**:Hadoop可以在多种操作系统上运行,如Linux、Mac OS X和Windows,但在生产环境中最常用的是Linux。 - **3.2.2 所需软件**:需要安装JDK(Java Development Kit),因为Hadoop是用Java编写的。 ...

    CDH_5.7.0_基于VM虚拟机的hadoop集群搭建

    本文档详细介绍了如何在VMware Workstation Pro 12虚拟化平台上搭建一个CDH 5.7.0 Hadoop集群,用于测试环境。通过此文档的学习与实践,读者能够了解在虚拟机环境中构建Hadoop集群的具体步骤和技术要点,这对于在...

    Hadoop研究报告

    文中提到了在Mac环境下安装Hadoop 2.4.0,并且使用SunJDK 1.7版本。安装过程中需要配置环境变量,例如JAVA_HOME和HADOOP_HOME,以及相关的CLASSPATH和PATH。环境变量配置完成后,通过source命令加载profile文件以使...

    基于VMware-Workstation8的双节点hadoop配置.doc

    接下来,Hadoop环境的搭建需要安装JDK。在这里选择的是JDK 1.6 update 30,可以从Oracle官网下载。安装步骤包括: 1. 将下载的`jdk-6u30-linux-i586.bin`复制到Redhat任意目录,如/opt/。 2. 添加可执行权限:`#...

    搭建nutch开发环境步骤

    下面,我们将详细讲解如何搭建Nutch的开发环境。 **步骤一:系统准备** 在开始搭建Nutch开发环境之前,你需要确保你的计算机满足以下基本要求: 1. 操作系统:Nutch可以在Linux、Mac OS X或Windows上运行,但推荐...

    安装部署Hadoop集群.pdf

    Hadoop由Apache基金会开发,其核心组件包括分布式文件系统HDFS和MapReduce计算模型,提供了高可靠、可扩展、高效和容错的数据处理能力。 首先,我们来了解一下Hadoop的主要特点: 1. **高可靠性**:Hadoop通过数据...

Global site tag (gtag.js) - Google Analytics