/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.pinterest.terrapin.hadoop;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.pinterest.terrapin.Constants;
import com.pinterest.terrapin.thrift.generated.Options;
import com.pinterest.terrapin.zookeeper.ClusterInfo;
import com.pinterest.terrapin.zookeeper.FileSetInfo;
import com.pinterest.terrapin.zookeeper.ZooKeeperManager;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.OutputFormat;
import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.net.UnknownHostException;
public class HadoopJobLoaderTest {
private final static int NUM_PART = 100;
private final static String NAME_NODE = "test_node";
private final static String FILE_SET = "test_fileset";
private final static int REPLICA_FACTOR = 2;
public class TestHadoopJobLoader extends HadoopJobLoader {
private ZooKeeperManager zkManager;
public TestHadoopJobLoader(ZooKeeperManager zkManager, TerrapinUploaderOptions options,
Job job) {
super(options, job);
this.zkManager = zkManager;
}
@Override
protected ZooKeeperManager getZKManager() throws UnknownHostException {
return zkManager;
}
@Override
protected void setOutputPath(String terrapinNameNode, String hdfsDir) {
assertEquals(NAME_NODE, terrapinNameNode);
assertTrue(hdfsDir.startsWith(Constants.HDFS_DATA_DIR + "/" + FILE_SET));
}
@Override
protected void loadFileSetData(ZooKeeperManager zkManager, FileSetInfo fsInfo, Options options)
throws Exception {
assertEquals(FILE_SET, fsInfo.fileSetName);
assertEquals(NUM_PART, fsInfo.servingInfo.numPartitions);
}
}
@Test
public void testUpload() throws Exception {
ZooKeeperManager zkManager = mock(ZooKeeperManager.class);
Job job = mock(Job.class);
Configuration conf = new Configuration();
TerrapinUploaderOptions options = new TerrapinUploaderOptions();
options.terrapinFileSet = FILE_SET;
when(zkManager.getClusterInfo()).thenReturn(new ClusterInfo(NAME_NODE, REPLICA_FACTOR));
doNothing().when(zkManager).lockFileSet(anyString(), any(FileSetInfo.class));
doNothing().when(zkManager).unlockFileSet(anyString());
when(job.waitForCompletion(anyBoolean())).then(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
Thread.sleep(1000);
return true;
}
});
when(job.getNumReduceTasks()).thenReturn(NUM_PART);
when(job.getConfiguration()).thenReturn(conf);
doNothing().when(job).setOutputFormatClass(Matchers.<Class<? extends OutputFormat>>any());
doNothing().when(job).setOutputKeyClass(Matchers.<Class<?>>any());
doNothing().when(job).setOutputValueClass(Matchers.<Class<?>>any());
TestHadoopJobLoader uploader = new TestHadoopJobLoader(zkManager, options, job);
assertTrue(uploader.waitForCompletion());
assertEquals(Constants.MAPRED_MAP_MAX_ATTEMPTS,
Integer.parseInt(conf.get("mapred.map.max.attempts")));
assertEquals(Constants.CHECKSUM_BYTES,
Integer.parseInt(conf.get("io.bytes.per.checksum")));
assertEquals(Constants.DEFAULT_MAX_SHARD_SIZE_BYTES,
Long.parseLong(conf.get("dfs.block.size")));
assertEquals(REPLICA_FACTOR, Integer.parseInt(conf.get("dfs.replication")));
verify(zkManager).getClusterInfo();
verify(zkManager).lockFileSet(eq(FILE_SET), any(FileSetInfo.class));
verify(zkManager).unlockFileSet(eq(FILE_SET));
verify(job).waitForCompletion(eq(true));
verify(job).setOutputFormatClass(eq(HFileOutputFormat.class));
verify(job).setOutputValueClass(eq(BytesWritable.class));
verify(job).setOutputKeyClass(eq(BytesWritable.class));
}
}