Wednesday, April 10, 2013

Reading & Writing Hadoop Sequence Files in Java

In this blog I'll show you how to write a simple hadoop client application in Java. This app will handle reading, writing and copying Hadoop Sequence Files on local or remote Hadoop file systems (HDFS).

1. HadoopClient.java
package com.noushin.hadoop.client;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.compress.GzipCodec;
import org.apache.hadoop.util.ReflectionUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

/**
 * This class handles interactions with Hadoop.
 * 
 * @author nbashir
 * 
 */
@Component
public class HadoopClient {

   private static Configuration conf = new Configuration();
   private final static Logger logger = Logger.getLogger(HadoopClient.class);

   /**
    * Convert the lines of text in a file to binary and write to a Hadoop
    * sequence file.
    * 
    * @param dataFile File containing lines of text
    * @param sequenceFileName Name of the sequence file to create
    * @param hadoopFS Hadoop file system
    * 
    * @throws IOException
    */
   public static void writeToSequenceFile(File dataFile, String sequenceFileName, String hadoopFS) throws IOException {

      IntWritable key = null;
      BytesWritable value = null;

      conf.set("fs.defaultFS", hadoopFS);
      Path path = new Path(sequenceFileName);

      if ((conf != null) && (dataFile != null) && (dataFile.exists())) {
         SequenceFile.Writer writer = SequenceFile.createWriter(conf, SequenceFile.Writer.file(path),
               SequenceFile.Writer.compression(SequenceFile.CompressionType.RECORD, new GzipCodec()),
               SequenceFile.Writer.keyClass(IntWritable.class), SequenceFile.Writer.valueClass(BytesWritable.class));

         List<String> lines = FileUtils.readLines(dataFile);

         for (int i = 0; i < lines.size(); i++) {
            value = new BytesWritable(lines.get(i).getBytes());
            key = new IntWritable(i);
            writer.append(key, value);
         }
         IOUtils.closeStream(writer);
      }
   }

   /**
    * Read a Hadoop sequence file on HDFS.
    * 
    * @param sequenceFileName Name of the sequence file to read
    * @param hadoopFS Hadoop file system
    * 
    * @throws IOException
    */
   public static void readSequenceFile(String sequenceFileName, String hadoopFS) throws IOException {
      conf.set("fs.defaultFS", hadoopFS);
      Path path = new Path(sequenceFileName);
      SequenceFile.Reader reader = new SequenceFile.Reader(conf, SequenceFile.Reader.file(path));
      IntWritable key = (IntWritable) ReflectionUtils.newInstance(reader.getKeyClass(), conf);
      BytesWritable value = (BytesWritable) ReflectionUtils.newInstance(reader.getValueClass(), conf);
      while (reader.next(key, value)) {
         logger.info("key : " + key + " - value : " + new String(value.getBytes()));
      }
      IOUtils.closeStream(reader);
   }

   /**
    * Copy a local sequence file to a remote file on HDFS.
    * 
    * @param from Name of the sequence file to copy
    * @param to Name of the sequence file to copy to
    * @param remoteHadoopFS HDFS host URI
    * 
    * @throws IOException
    */
   public static void copySequenceFile(String from, String to, String remoteHadoopFS) throws IOException {
      conf.set("fs.defaultFS", remoteHadoopFS);
      FileSystem fs = FileSystem.get(conf);

      Path localPath = new Path(from);
      Path hdfsPath = new Path(to);
      boolean deleteSource = true;

      fs.copyFromLocalFile(deleteSource, localPath, hdfsPath);
      logger.info("Copied SequenceFile from: " + from + " to: " + to);
   }

   /**
    * Print all the values in Hadoop HDFS configuration object.
    * 
    * @param conf
    */
   public static void listHadoopConfiguration(Configuration conf) {
      int i = 0;
      logger.info("------------------------------------------------------------------------------------------");
      Iterator iterator = conf.iterator();
      while (iterator.hasNext()) {
         i++;
         iterator.next();
         logger.info(i + " - " + iterator.next());
      }
      logger.info("------------------------------------------------------------------------------------------");
   }
}

2. HadoopClientTest.java
package com.noushin.hadoop.client;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class HadoopClientTest {

   @Autowired
   HadoopClient hadoopClient;

   String sequenceFileName = "/tmp/nb.sgz";
   String hadoopLocalFS = "file:///";
   String hadoopRemoteFS = "hdfs://stage-hadoop01:8020";


   @Test
   public void testConfig() {
      Configuration conf = new Configuration();
      HadoopClient.listHadoopConfiguration(conf);
   }

   @Test
   public void testWriteSequenceFile() {
      String dataFileName = "/tmp/test.txt";

      try {
         int numOfLines = 20;
         String baseStr = "....Test...";
         List<String> lines = new ArrayList<String>();
         for (int i = 0; i < numOfLines; i++)
            lines.add(i + baseStr + UUID.randomUUID());

         File dataFile = new File(dataFileName);
         FileUtils.writeLines(dataFile, lines, true);
         Thread.sleep(2000);
         HadoopClient.writeToSequenceFile(dataFile, sequenceFileName, hadoopLocalFS);
      }
      catch (IOException e) {
          e.printStackTrace();
      }
      catch (InterruptedException e) {
         e.printStackTrace();
      }
   }

   @Test
   public void testReadSequenceFile() {

      try {       
         HadoopClient.readSequenceFile(sequenceFileName, hadoopLocalFS);
      }
      catch (IOException e) {
         e.printStackTrace();
      }
   }

   @Test
   public void testCopySequenceFileToRemoteHDFS() {
      String tempFileName = "/tmp/local-test.txt";
      String sequenceFileName = "/tmp/seqfile-record-compressed.sgz";
      String hadoopLocalFS = "file:///";
      String hadoopRemoteFS = "hdfs://stage-hadoop01:8020";

      try {
         int numOfLines = 5;
         String baseStr = "....Test...";
         List<String> lines = new ArrayList<String>();
         for (int i = 0; i < numOfLines; i++)
            lines.add(i + baseStr + UUID.randomUUID());

         File dataFile = new File(tempFileName);
         FileUtils.writeLines(dataFile, lines, true);
         Thread.sleep(2000);
         HadoopClient.writeToSequenceFile(dataFile, sequenceFileName, hadoopLocalFS);
         HadoopClient.readSequenceFile(sequenceFileName, hadoopLocalFS);
         HadoopClient.copySequenceFile(sequenceFileName, sequenceFileName, hadoopRemoteFS);
         HadoopClient.readSequenceFile(sequenceFileName, hadoopRemoteFS);
      }
      catch (IOException e) {
          e.printStackTrace();
      }
      catch (InterruptedException e) {
         e.printStackTrace();
      }
   }   
}

3. pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.noushin.hadoop</groupId>
    <artifactId>client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hdpc</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <hadoop-client.version>2.0.0-cdh4.2.0</hadoop-client.version>
        <junit.version>4.10</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <spring.version>3.2.0.RELEASE</spring.version>
    </properties>

    <dependencies>
        <!-- Test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- Hadoop -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop-client.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- Logging -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>

        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
If you are using Eclipse for development and testing like I do, you need to add the following step, so you can compress your sequence file using GZip.

If you notice, I am using Hadoop by Cloudera in my pom file. To use GZip, I need to add a native library to my development environment which is Ubuntu 12.10.
sudo apt-get update; sudo apt-get install hadoop

This will install Hadoop native libraries in /usr/lib/hadoop/lib/native. Now, In Eclipse, edit ->Properties->Java Build Path->Libraries->Maven Dependencies->Native library location, and set "Location Path" to /usr/lib/hadoop/lib/native.
Please make sure the version of Hadoop client dependecy you use in your pom file matches the version of Hadoop you downloaded to your system, otherwise you will get a run time error:
ERROR nativeio.NativeIO: Unable to initialize NativeIO libraries
To verify a sequence file was created on HDFS, log into one of your hadoop nodes and run this command:
hadoop fs -ls /tmp/nb.sgz
And, if you run into a problem and need to see what Hadoop is doing, turn on debugging for Hadoop classes by adding the following entry to your log4j.properties: #Turn on hadoop logging

log4j.logger.org.apache.hadoop=DEBUG
To run Hive: login using a hadoop user such as oozie_job, so that environment is set up.

$ sudo su - oozie_job
To use hive:

$ hive
now you can query data using sql like commands:

DESCRIBE my_transactions;

SELECT * FROM my_transactions WHERE year=2013 AND month=3 AND day=14; 
To see where a partition is pointing to:

DESCRIBE EXTENDED my_transactions PARTITION(year=2013, month=3, day=28);
To create a partition, so Hive can find data for its queries:

ALTER TABLE my_transactions ADD PARTITION(year=2013, month=3, day=26) LOCATION '/tmp/2013/03/26';
To drop a partition and point it to a new location:

ALTER TABLE my_transactions DROP PARTITION(year=2013, month=3, day=26);

81 comments:

  1. The Information which you provided is very much useful for Hadoop Online Training Learners Thank You for Sharing Valuable Information

    ReplyDelete
  2. The information which you have provided is very good and easily understood.
    It is very useful who is looking for Hadoop Online Training.

    ReplyDelete
  3. Thank you very much for the excellent code sample. Even better your code is up to date with Hadoop 2.20+ (no deprecated methods).

    ReplyDelete
  4. Hi,

    In HadoopClient.listHadoopConfiguration(), there is an extra iterator.next() which will cause NoSuchElementException.

    public static void listHadoopConfiguration(Configuration conf) {
    int i = 0;
    logger.info("--------");
    Iterator iterator = conf.iterator();
    while (iterator.hasNext()) {
    i++;
    //iterator.next(); // <--- This line will cause error
    logger.info(i + " - " + iterator.next());
    }
    logger.info("--------");
    }

    ReplyDelete
  5. Does the spring test artifact name is correct? artifact id suppose to be spring-test rather org.springframework.test ? or do you refering this artifact from different repository?

    ReplyDelete
  6. Hi,
    I'm creating sequenceFile on a remote server, my hadoop server user/password is different that the machine I tried to connect from. How do I mention the remote server credential information? SequenceFile writer somehow picks my system user name and failed to create SequenceFile with authentication failure error, any idea how we can override the system property with help of Configuration interface? if yes, what would the property name for user and password value. Your help would be appreciated.

    ReplyDelete
  7. Very useful... beginners see this http://www.javatrainingchennai.in/ as well to get some basics

    ReplyDelete
  8. Hai,Thanks for your article.This program useful for my hadoop software project works.

    Hadoop Training in Chennai

    ReplyDelete
  9. I have read your blog, it was good to read & I am getting some useful info's through your blog keep sharing... Informatica is an ETL tools helps to transform your old business leads into new vision. Learn Informatica training in chennai from corporate professionals with very good experience in informatica tool.
    Regards,
    Best Informatica Training In Chennai|Informatica training center in Chennai|Informatica training chennai

    ReplyDelete
  10. I really enjoyed while reading your article, the information you have mentioned in this post was damn good. Keep sharing your blog with updated and useful information.
    Regards,
    sas course in Chennai|sas training center in Chennai|sas training in Velachery

    ReplyDelete
  11. Thanks for Sharing this valuble information and itis useful for me and CORE SAP learners.We also provides the best SAP Online Training

    SAP Online Training | sap abap online training course | sap crm online training | sap fico online training | sap sd online training

    ReplyDelete
  12. Good work sir, Thanks for the proper explanation about Read & write data to hdfs java api . I found one of the good resource related Read & Write Data To HDFS Using Java API Programs and hadoop tutorial. It is providing in-depth knowledge on Read & Write Data To HDFS Using Java API Programs and hadoop tutorial. which I am sharing a link with you where you can get more clear on HAdoop file system programs . To know more Just have a look at this link

    Top Read & Write Data To HDFS Using Java API Programs
    Top Read & Write Data To HDFS Using Java API Programs 2

    ReplyDelete
  13. Ciitnoida provides Core and java training institute in

    noida
    . We have a team of experienced Java professionals who help our students learn Java with the help of Live Base Projects. The object-

    oriented, java training in noida , class-based build

    of Java has made it one of most popular programming languages and the demand of professionals with certification in Advance Java training is at an

    all-time high not just in India but foreign countries too.

    By helping our students understand the fundamentals and Advance concepts of Java, we prepare them for a successful programming career. With over 13

    years of sound experience, we have successfully trained hundreds of students in Noida and have been able to turn ourselves into an institute for best

    Java training in Noida.

    java training institute in noida
    java training in noida
    best java training institute in noida
    java coaching in noida
    java institute in noida

    ReplyDelete
  14. Your good knowledge and kindness in playing with all the pieces were very useful. I don’t know what I would have done if I had not encountered such a step like this.
    DevOps online Training|DevOps Training in USA
    Devops Training in Chennai

    Devops Training in Bangalore

    ReplyDelete
  15. Well Said, you have furnished the right information that will be useful to anyone at all time. Thanks for sharing your Ideas.
    python training in rajajinagar
    Python training in btm
    Python training in usa
    Python training in marathahalli

    ReplyDelete
  16. It's interesting that many of the bloggers to helped clarify a few things for me as well as giving.Most of ideas can be nice content.The people to give them a good shake to get your point and across the command
    java online training | java training in pune

    java training in chennai | java training in bangalore

    ReplyDelete
  17. I really enjoy simply reading all of your weblogs. Simply wanted to inform you that you have people like me who appreciate your work. Definitely a great post I would like to read this
    Data Science course in kalyan nagar | Data Science course in OMR
    Data Science course in chennai | Data science course in velachery
    Data science course in jaya nagar

    ReplyDelete
  18. I really want to thank you for such kind of wonderful blog posted for us.I expect this kind of updation soon in your page.
    Android Training in Chennai
    German Classes in chennai
    Loadrunner Training in Chennai
    French Classes in Chennai
    Qtp training in Chennai

    ReplyDelete
  19. Hey Nice Blog!! Thanks For Sharing!!!Wonderful blog & good post.Its really helpful for me, waiting for a more new post. Keep Blogging!
    SEO company in coimbatore
    SEO Service in Coimbatore
    web design company in coimbatore

    ReplyDelete
  20. QuickBooks Payroll Support cell phone number. Well! If you’re not in a position to customize employee payroll in QuickBooks Payroll Support Phone Number makes the list optimally, in QB and QB desktop, then read the description ahead. Here, you will get the determination of numerous type of information that which you’ve close at hand for assisting the setup process with comfort.

    ReplyDelete
  21. QuickBooks Enterprise accounting for your needs. So as to make your QuickBooks Enterprise Support Number software error free, contact us at an get related to us in minutes. before calling us, all you have to do is always to make sure that you have a very good

    ReplyDelete
  22. QuickBooks Customer Support Number accounting application is compatible even yet in the Macintosh operating system and users can enjoy all of the features supplied by downloading it. This software may also be used on iPhone through the QuickBooks app for iOS users.

    ReplyDelete
  23. Every user will get 24/7 support services with this online technical experts using Quickbooks Tech Support Number. When you’re stuck in a situation in which you can’t find a method to get rid of a problem, all you need is to dial QuickBooks customer support contact number. Have patience; they're going to inevitably and instantly solve your queries.

    ReplyDelete
  24. We plan to give you the immediate support by our well- masterly technicians. A group of QuickBooks Tech Support Phone Number dedicated professionals is invariably accessible to suit your needs so as to arranged all of your problems in an attempt that you’ll be able to do your projects while not hampering the productivity.

    ReplyDelete
  25. Help and support from QuickBooks Enterprise Support Phone Number is tremendous specially considering that it can help you track all of the data, amount etc. of donors, funds an such like an such like.

    ReplyDelete
  26. Facing a concern won’t be a pain anymore if you have quick assistance at QuickBooks Pro
    Problems are inevitable and they also usually do not come with a bang. Our team at Quickbooks Support Phone Number is ready beforehand to provide you customer-friendly assistance in the event that you talk with a concern using QuickBooks Pro. Many of us is skilled, talented, knowledgeable and spontaneous. Without taking most of your time, our team gets you rid of most unavoidable errors for this software.

    ReplyDelete
  27. accounting,QuickBooks Payroll Support Phone Number, Point of Sales, QuickBooks Merchant Services and Inventory issues to provide 24/7 service to the esteemed customers.

    ReplyDelete
  28. The good thing would be the fact that not just you’ll prepare yourself to resolve your problems nevertheless you may be often acknowledged by Support For QuickBooks technicians and he/she could well keep updating you concerning your problems.

    ReplyDelete
  29. QuickBooks Enterprise is one such software that lets you choose from a variety of options. QuickBooks Enterprise Tech Support Number team at QuickBooks Enterprise Support Phone Number also provides you many lucrative services.

    ReplyDelete
  30. Dial QuickBooks Payroll tech support number to ask for QuickBooks enhanced payroll support to fix payroll issues. We work for startups to small-scale, medium-sized to multinational companies. At AccountWizy, you will find well-qualified and trained accountants, Proadvisors who can handle such errors. QuickBooks Enterprise Support Phone Number is a way of contacting us for Intuit product and QuickBooks Payroll subscription.

    ReplyDelete
  31. Account management, tax calculation, and deduction are not at all interesting activities to do in the world. It might even be the most time consuming and confusing. In the event that you own any business and wants to grow its graph, you really must have to manage these tasks. AccountWizy offers the best QuickBooks Payroll Technical Support to your clients and solves your queries at Intuit payroll support number.

    ReplyDelete
  32. You’ll have the ability to call us at any time for the moment support we have a tendency to are accessible for you 24*7. QuickBooks Help & Support talented team of professionals is invariably in a position to assist you whatever needs doing.

    ReplyDelete
  33. QuickBooks Customer Support Number software is helpful for managing the work flow flawless and smooth by prints the payroll components and exchange report are necessary for the modern bookkeepers etc. It is according to application or the cloud based service. Its versions such as:, Payroll, Contractor , Enterprises and Pro Advisor which helps the countless small company world wide .

    ReplyDelete
  34. Intuit QuickBook Support For Business All the above has a certain use. People working together with accounts, transaction, banking transaction need our service. Some of you are employing excel sheets for some calculations.

    ReplyDelete
  35. In conclusion, don’t hesitate to call us on our QuickBooks Online Help Number. We have been surely here for you personally. In conclusion, any error, any problem, any bug or whatever else pertaining to QuickBooks related problem, just call our QuickBooks Tech Support Number. Surely, call our QuickBooks Tech Support Number

    ReplyDelete
  36. QuickBooks Support Phone Number professionals are terribly dedicated and may solve your whole issues with no fuss. In the event that you call, you will be greeted by our client service representative when taking all your concern he/she will transfer your preference in to the involved department.

    ReplyDelete
  37. QuickBook Tech Support Phone Number really is terribly frustrating, to say the smallest amount when you face one particular error. Errors hamper the task pace however additionally disturb your mental peace. Our QuickBooks specialists take all of the errors terribly seriously and they will fix all of the errors.

    ReplyDelete
  38. There are many advantages of QuickBooks Payroll Tech Support Number in operation. The application really is easy to make use of. You have got regular updates. Thus, it's going to often be accurate.

    ReplyDelete
  39. It Is Possible That When You Are Using QuickBooks Enterprise Support Number And Encounter Some Errors Then Do Not Hyper Because QuickBooks Enterprise Support Team Is Available Few Steps Away From You.

    ReplyDelete
  40. If for example the QuickBooks Support Phone Number accounting software work not properly and starts misbehaving, crashes or hangs up, so then what should users do? It will always be clear that QuickBooks is majorly utilized by moderate size enterprises for the documentation and management of their financial and accounting transactions.

    ReplyDelete
  41. Any QuickBooks user faces any sort of identified errors in their daily accounting routine; these errors can differ from one another to a large degree, so our dedicated QuickBooks Customer Technical Support Number Pro-Advisers are well loaded with their tools and expertise to give most effective resolutions right away to the customers.

    ReplyDelete
  42. Dial up the QuickBooks Support Phone Number toll-free number to get the assistance that you are looking for. For several associated with business organizations, it is and it has for ages been a challenging task to control the business enterprise accounts in an effective way by locating the appropriate solutions.

    ReplyDelete
  43. QuickBooks Support an extensive financial solution, where it keeps your entire business accounting requirements in one single place. From estimates to bank transfers, invoicing to tracking your expenses and staying on top of bookkeeping with regards to tax time, it really is prepared for many from it at one go. A total package to create you clear of Financial accounting and back office worries any time to make sure you concentrate on your own expert area and yield potential development in business.

    ReplyDelete
  44. To solve the HP Laptop startup problem of the HP Printer Support Number user has to disconnect the power supply for a while and plug it back on. This could refresh the system and solve the problem where HP Laptop won’t turn on.

    ReplyDelete
  45. If the issue may not be resolved with your tools, HP Support Assistant makes it possible to find additional HP Inkjet Printer Support Phone Number resources specific to your device.

    ReplyDelete
  46. No matter whether you are getting performance errors or perhaps you are facing any kind of trouble to upgrade your software to its latest version, you are able to quickly get advice about QuickBooks 2018 support phone number. Each time you dial 247Tech Support Number, your queries get instantly solved. Moreover, you could get in contact with our professional technicians via our email and chat support options for prompt resolution on most related issues.

    ReplyDelete
  47. You can use QuickBooks to come up with any selection of reports you wish, keeping entries for several sales, banking transactions and plenty of additional. QuickBooks provides a myriad of options and QuickBooks Support Number for an equivalent. it is commonplace to manage any errors on your own QuickBooks if you're doing not proceed with the syntax, if the code is not put in properly or if you’re having any corruption within the information of the QuickBooks.

    ReplyDelete
  48. You can resolve this error utilizing the below troubleshooting steps you may want to simply contact our QuickBooks Support Phone Number available at.You should run QuickBooks Tech Support Number print and pdf repair tool to find out and fix the errors in printer settings before you begin the troubleshooting.

    ReplyDelete

  49. The QuickBooks Payroll Tech Support Number offers a hand full of services. We should perform some installation on our desktop to possess it working then. It boils down with three types of services basic, enhanced and assisted. Basic payroll is most economical amongst all of the three service types. Enhanced is a tad little more expensive then basic plus the most high-priced one is assisted.

    ReplyDelete
  50. Access it the spot support for QuickBooks Help Number for rectifying the technical glitches: Give a call at quickbooks support phone number, if you're encountering any difficulties which can be mentioned previously.

    ReplyDelete
  51. To obtain our help, just dial the QuickBooks Payroll Support Phone Number to get consultation or order our services. We are going to help you streamline and simplify the accounting, reporting and tracking in order that managing your company’s finances would be less difficult. Also, we guarantee to keep anonymity and higher level of security while handling issues linked to QB software use.

    ReplyDelete
  52. QuickBooks Support Phone Number has managed to get simple for a company person to produce an invoice, track expense and automatically backup data to prevent losing them at any cost. This particular QuickBooks product could be installed up to three computers and that can be simultaneously accessed to efficiently retain the accounts.

    ReplyDelete
  53. Your info is really amazing with impressive content..Excellent blog with informative concept. Really I feel happy to see this useful blog, Thanks for sharing such a nice blog..
    If you are looking for any Data science Related information please visit our website best course for data science page!

    ReplyDelete
  54. Quickbooks Error 9999 as during program installation for business. Also a mistake occurs while Quickbooks is running, during windows startup or shutdown and sometimes even through the installation of the Quickbooks software windows operating system. If you would like to learn how to Resolve Quickbooks Error 9999 yourself, you can continue reading this blog.

    ReplyDelete
  55. very useful blog to explore a lot and to build the career
    BEST ANGULAR JS TRAINING IN CHENNAI WITH PLACEMENT

    https://www.acte.in/angular-js-training-in-chennai
    https://www.acte.in/angular-js-training-in-annanagar
    https://www.acte.in/angular-js-training-in-omr
    https://www.acte.in/angular-js-training-in-porur
    https://www.acte.in/angular-js-training-in-tambaram
    https://www.acte.in/angular-js-training-in-velachery

    ReplyDelete
  56. I am reading your post from the beginning, it was so interesting to read & I feel thanks to you for posting such a good blog, keep updates regularly.thanks
    Ai & Artificial Intelligence Course in Chennai
    PHP Training in Chennai
    Ethical Hacking Course in Chennai Blue Prism Training in Chennai
    UiPath Training in Chennai

    ReplyDelete
  57. This comment has been removed by the author.

    ReplyDelete
  58. This is an amazing post. Great content indeed. It is really informative and helpful. Excellent articulation and structure. Thanks for sharing the post. It is very helpful. Appreciate your time and thoughts in writing this great blog
    Selenium Training in Chennai

    Selenium Training in Velachery

    Selenium Training in Tambaram

    Selenium Training in Porur

    Selenium Training in Omr

    Selenium Training in Annanagar

    ReplyDelete
  59. Updating with the current trend is strictly advisable and the content furnished here also states the same. Thanks for sharing this wonderful and worth able article in here. The way to expressed is simply awesome. Keep doing this job. Thanks :)
    IELTS Coaching in chennai

    German Classes in Chennai

    GRE Coaching Classes in Chennai

    TOEFL Coaching in Chennai

    Spoken english classes in chennai | Communication training

    ReplyDelete
  60. Birthday Greetings to the One you’re keen on beautiful, birthday! allow you to notice the route to success that’s appropriate for you. Gorgeous Quotes

    ReplyDelete