在Spark(1.6.0)中处理hbase( 1.0.0)中的数据

本文介绍了在Spark 1.6.0中处理HBase 1.0.0数据时的配置步骤和解决常见错误的方法。包括在Spark环境加入HBase依赖、处理TaskScheduler内存不足问题以及解决HBase访问权限异常。在Windows环境下使用Eclipse提交任务时,需注意账户权限和代码打包为jar。
摘要由CSDN通过智能技术生成

最近开始学习Spark,因为原先分析收集的数据都是存储在hadoop和hbase中,经过这两天终于解决了问题。

这里不说集群搭建,直接说如何设置和代码上如何处理能从hbase中读取数据。


1. 在spark的环境启动环境中需要加入hbase lib目录下的所有jar包:

    首先,在spark_home/lib目录下创建hbase目录,然后拷贝hbase_home/lib下所有jar包;

    然后,修改spark_classpath,在spark_home/conf/spark-env.sh中添加上边拷贝过来的jar包,例如export SPARK_CLASSPATH=/usr/local/spark/spark-1.6.0-bin-hadoop2.6/lib/hbase/*

    不添加的话就会出现unread block data的错误。


2. 运行spark任务的时候,如果出现这个异常:TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory,需要检查几个方面的配置:

    a. spark内存是否足够,可以增加spark worker内存,也可以降低任务使用的内存

         在spark-env.sh中修改配置SPARK_WORKER_MEMORY可以修改worker的内存

         或者在任务中设置spark.executor.memory修改任务使用的内存

    b. 执行任务的时候,spark会为系统预留一部分内存,默认是几百M吧,具体值没有记下来,不过从worker日志是可以看到的,可以在任务中设置spark.testing.reservedMemory参数进行修改


3. 从hbase中读取数据时异常:org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permiss  

    这个可以明显看出是没有访问权限问题,从hbase日志中也可以看到类似security.UserGroupInformation: No groups available for user XXXXX的日志

    因为我是在windows eclipse上直接提交的任务,我就直接在windows上创建了一个hadoop账户(和我hbase集群使用的账户一样),然后就解决问题。

    最后,如果任务中设计到map/reduce方面的代码,是需要把代码打成jar包提交到spark上的,否则会抛出class not found的异常。


最后,附上我这次加的几行测试代码:

                // 初始化JavaSparkContext
		SparkConf sparkConf = new SparkConf().setAppName("test").setMaster("spark://OPENFIRE-DEV:7080")
				.set("spark.executor.memory", "64m").set("spark.testing.reservedMemory", "102400");
		JavaSparkContext sc = new JavaSparkContext(sparkConf);

		// 这里我是从sprig容器中获取的HbaseUtil类,自己写的工具类,方便获取Configuration而已
		HbaseUtil hbaseUtil = (HbaseUtil) factory.getBean("hbaseUtil");
		Configuration hbaseConf = hbaseUtil.getConfiguration();
		
		// 从Table: member_biz_log中读取Family: app_log中的数据
		Scan scan = new Scan();
		scan.addFamily(Bytes.toBytes("app_log"));
		hbaseConf.set(TableInputFormat.INPUT_TABLE, "member_biz_log");
		ClientProtos.Scan proto = ProtobufUtil.toScan(scan);
		String ScanToString = Base64.encodeBytes(proto.toByteArray());
		hbaseConf.set(TableInputFormat.SCAN, ScanToString);
		JavaPairRDD<ImmutableBytesWritable, Result> myRDD = sc.newAPIHadoopRDD(hbaseConf, TableInputFormat.class,
				ImmutableBytesWritable.class, Result.class);

		// 随便乱写的测试代码
		JavaPairRDD<String, Integer> result = myRDD
				.mapToPair(new PairFunction<Tuple2<ImmutableBytesWritable, Result>, String, Integer>() {
					private static final long serialVersionUID = -6214814960929421459L;

					@Override
					public Tuple2<String, Integer> call(
							Tuple2<ImmutableBytesWritable, Result> immutableBytesWritableResultTuple2) throws Exception {
						byte[] o = immutableBytesWritableResultTuple2._2().getValue(Bytes.toBytes("ERROR"),
								Bytes.toBytes("logInfo"));
						if (o != null) {
							System.out.println(Bytes.toString(o));
							return new Tuple2<String, Integer>(Bytes.toString(o), 1);
						}
						return null;
					}
				});

		System.out.println(result.count());


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值